第一章 微處理器
1.1 微處理器的基本功能和基本組成
1.1.1 微處理器的基本功能
微處理器是微機運算和控制處理部件,也是指揮微機各部件協調工作的控制中心。主要
的基本功能包括:
-
指令控制功能,即控制程序 順序執行 的功能
-
操作控制功能,程序是由有序指令的集合而成,CPU執行程序就是要逐條執行程序中
的指令,一條指令的執行往往由若干操作信號的組成來實現,CPU根據指令操作碼和
時序信號,產生各種操作控制信號,以便正確的選擇數據通路,從而完成取指令和執行
指令的控制。
操作控制器的組成類型分為兩類:
- 硬布線控制器,它是采用時序邏輯技術來實現的。
- 微程序控制器,它是采用存儲邏輯來實現的。
1.1.2 微處理器的基本組成
從早期的微處理器看,它主要包括運算器和控制器兩大部分。隨着大規模集成電路技術的快速發展,
目前CPU內部最基本的組成部分為三大部分,即運算器、控制器和高速緩沖存儲器。
1. 運算器:

AX,BX,CX,DX CPU中的寄存器
ALU:算數邏輯部件
C1,C2 :操作信號,相當於開關
標志寄存器:算完以后的狀態,大於0,小於0?越界問題
!!! 數據不能兩個都來自內存中。
2. 高速緩沖存儲器
由於CPU的速度遠大於內存的速度,所以使用cache,將CPU所需要的數據提前從內存讀入cache中,
使得CPU在近期一段時間片段不需要訪問內存,而是只需訪問CPU內部的高速緩沖存儲器,稱其為
訪問CPU內部cache的 命中率 很高
3. 控制器

控制器最基本的部件由指令指針,指令寄存器,指令譯碼器及操作控制器組成。
為什么會CPU會順序執行:
指令指針中存放存儲器地址,為了保證程序順序執行,CPU必須自動記憶下一條指令存放在內存中
的地址,所以指令指針又稱為指令計數器,他有 自動加一 功能
選擇,循環結構時,操作系統會給指令指針賦值 (我們寫代碼過程中不能操作指令指針)
1.1.3 馮·諾依曼思想
- 五大模塊:運算器,控制器,存儲器,輸入 /出設備
- 計算機采用二進制
- 在程序運行過程中,代碼和數據存放在 內存 中
存儲器包括內存跟硬盤,一般說存儲器單指內存
為什么:cpu不能直接訪問硬盤
1.2 微處理器內部的寄存器
1.2.1 8086 CPU 內部的寄存器組
8086CPU包含
數據線:16
地址線:20
最大存儲空間:64KB
2^16 byte =2^6KB 1個二進制位表示1位,即 1bit,8bit=1byte(字節)
最多可接內存:1M
2^20byte
4個16位 段寄存器
CS,代碼段寄存器
DS,數據段寄存器 馮諾依曼思想第三句,主要是操作數據 important
SS,堆棧段寄存器
ES,附加段寄存器
代碼在3樓:CS
數據在6樓:DS
數據寄存器
- AX:累加器,用於算數運算、邏輯運算以及在輸入/輸出指令中做數據寄存器使用等。
- BX:基址寄存器,在間接尋址中做基址寄存器,常用作偏移地址訪問數據段。
- CX:計數寄存器,作為循環和串行操作等指令中的隱含計數器。
- DX:數據寄存器,常用來存放雙字節長數據的高16位或存放 外設端口 的地址。
4個16位寄存器,分別可拆分為8個8位寄存器
AH,AL
BH,BL
CH,CL
DH,DL
在寫代碼過程中,要靈活運用這些寄存器
0~255 用8位
通用寄存器
SP,堆棧指針,SP用於指示棧底或棧頂的偏移地址
BP,基址指針,常用作偏移地址訪問堆棧段 訪問堆棧段-----SS
SI,源變址寄存器
DI,目的變址寄存器
SI和DI通常與 DS數據段寄存器一起使用,用來確定數據段中某一存儲單元的地址。在進行
字符串操作時,SI用來存放源操作數的偏移地址,DI用來存放目的操作數的偏移地址,SI與
DI聯用,DI與ES連用,分別尋址數據段和附加數據段。
標志寄存器
ZF:零標志,當前運算后,運算結果為0時,ZF=1,表示0成立,否則ZF=0.
DF:方向標志,該標志用於控制串操作指令中地址指針的變化方向
DF=0:每執行一次串操作,存儲器地址自動增加
DF=1:沒執行一次串操作,存儲器地址自動減少
IF:中斷允許標志,該標志用於控制8086CPU是否響應外部可屏蔽中斷請求
TF:陷阱標志,常稱為單步標志。
匯編語言采用減法計數
INC AL INC:increase
DEC BH DEC:decrease
1.3 用匯編語言實現 3 + 4
打開桌面快捷方式 輸入命令
DEBUG ;(輸完回車)
R ;(輸完回車)

a ;(輸完回車)
MOV AX,3 ;(輸完回車)
MOV BX,4 ;(輸完回車)
ADD AX,BX ;(輸完回車)
最后直接回車

三次連續輸入T 回車 單步執行

測試完成
1.3 微處理器對存儲器的管理
1.3.1 實模式存儲器地址空間的划分
從00000H~003FFH是中斷向量表去,共計有1024字節,1024/4=256 ,用於存放
256個中斷向量(中斷服務程序的入口地址)----->CS:IP,即每個中斷向量包含4字節:
2字節的代碼段值,2字節的偏移地址
1.3.2 實模式物理地址的產生
數據線小於地址線,所以CPU內部的地址加法器,能將16位的邏輯地址裝換成
20位的物理地址
段基地址:偏移地址
物理地址的計算公式:
物理地址=段基地址x16+偏移地址
1.3.2 段寄存器與偏移地址寄存器的固定搭配

總結:除了SP,BP,CS 其余的都跟數據段搭配
1.4 8086系統中的存儲器組織
在8086系統中,把1MB的存儲器分為兩個存儲體,偶地址存儲體和奇地址存儲體,其存儲容量
各位512KB,在每個存儲體內的字節地址是不連續的,而在兩個存儲體之間的字節地址是連續
的,構成了兩個存儲體之間的地址交叉,如圖:

BHE 和A0的組合操作
| BHE A0 | 操 作 | 指 令 列 |
|---|---|---|
| 0 0 | 從偶地址讀/寫一個字 | MOV BX,[9900H] |
| 0 1 | 從奇地址讀/寫一個字節 | MOV AL,[8801H] |
| 1 0 | 從偶地址讀/寫一個字節 | MOV CH,[7700H] |
| 1 1 | 無存儲器操作 | 無 |
第二章 指令系統與匯編語言程序設計
1.1 8086CPU的尋址方式
2.1.1 指令一般格式
1. 8086CPU指令的格式
操作碼 操作數
例如:指令 MOV AL,29H
8086CPU指令的格式可以細分為以下幾種:
-
零地址指令
格式:操作碼
零地址指令中不提供操作數,也不提供操作數的地址,只有操作碼,例如 空操作指令
NOP
-
單地址指令
格式:操作碼 操作數
單地址指令也成為一般地址指令,指令中之提供一個操作數(或一個操作數的地址),例如:
INC AH
INC BYTE PTR[1100H]
-
兩地址指令
格式:操作碼 目的操作數,源操作數
指令中包含兩個操作數,由操作碼確定這兩個操作數所進行的操作后,結果存入目的操作數中。例如:
MOV AH,BL ;AH<------(BL)
MOV BH,[1100H] ;BH<------(1100H)
說明:
-
目的操作數和源操作數應具有相同的數據類型,即必須同時是8位或者16位。
-
目的操作數不能是立即數。
-
操作結束后,其操作結果送入目的操作數中,而源操作數並不會改變。
-
源操作數和目的操作數不能同時為存儲器操作數,例如:
ADD [BX],[2000H]
-
立即數不能作為目的操作數。
-
2. 操作數的類型
-
數據操作數
-
立即操作數
imm,代表8 、16位立即數immn:n(n為8或16)位立即操作數
-
寄存器操作數
reg:寄存器,代表8和16位
regn:n(n為8或16)位寄存器
-
存儲器操作數
mem:存儲器操作數,
memn:n(n為8或16)位存儲器操作數
-
輸入/輸出操作數
-
-
轉移地址操作數
轉移地址操作數來自具體的指令,且指令中轉移地址只有一個,他就是指令的目的操作數
2.2.2 8086 CPU尋址方式
1.立即尋址
操作數位置:內存代碼段
立即尋址所提供的操作數直接放在指令中,它是緊跟在指令操作碼后面的一個可用的8位或16位 補碼 表示的由有符號數,也就是說,操作數的存放地址就是指令操作碼的下一單元地址。
例: 立即數傳送到寄存器中
MOV BH,10H ;將立即數10H傳送到BH中
MOV BX,2345H ;將立即數2345H傳送給BX
說明:立即數在所有指令中都不可能用作目的操作數。
2. 寄存器尋址
操作數位置:在CPU的某個寄存器中。
寄存器中寄存的內容就是要尋找的操作數。
例:增1指令
INC CX ;CX<------(CX)+1
例:寄存器之間的傳送指令
MOV CX,AX ;CX<--------AX
3. 存儲器尋址
在8086、80286微處理器中,默認的段寄存器與16位寄存器的固定搭配如表4-2所示

-
直接尋址
MOV BL,[3330H]
PA=DS x 16 + 3330H
-
基址尋址
MOV AL,[BX]
PA=DS x 16 + BX
-
相對基址尋址
MOV AL,[BX+30H]
PA=DS x 16 + BX + 30H
-
變址尋址
MOV BL,[SI]
PA=DS x 16 + SI
-
相對變址尋址
MOV AL,[SI-56H]
PA=DS x 16 + SI - 56H
-
基址加變址尋址
MOV AL,[BX+SI]
PA=DS x 16 + BX + SI
-
相對基址加變址尋址
MOV AL,[BX+DI+90H]
PA=DS x 16 + BX + DI + 90H
1.2 16位微處理器指令系統
為了方便介紹,對幾個符號的規定如下:
OPS:源操作數,代表8位和16位二進制數據
OPSn:n(n為8或16)位源操作數
OPD:目的操作數,代表8和16位二進制數據
OPDn:n(n為8或16)位目的操作數
seg:段寄存器 (segment)
(reg):表示寄存器中寄存的數值
1.2.1 數據傳送指令
1.一般數據傳送指令
數據傳送指令是將數據、地址或立即數傳送到寄存器或存儲器中,可以分為一般數據傳送指令、堆棧操作指令、地址傳送指令和輸入 /輸出指令
-
傳送指令
指令格式: MOV OPD,OPS
MOV有如下五中具體形式:
-
MOV reg,reg ; 兩個寄存器之間的數據傳送,如 MOV AL,BH
-
MOV reg,mem ; 內存單元數據傳送給寄存器,讀內存,如 MOV BX,[SI]
-
MOV mem,reg ; 寄存器的數據傳送給內存單元,寫內存,如 MOV [DI],BX
-
MOV reg,imm ; 立即數傳送給寄存器,如 MOV AX,3
-
MOV mem,imm ; 立即數傳送給內存單元,如 MOV WORD PTR[SI],1122H
特別說明:WORD是指明兩個字節,BYTE 指明一個字節
用於段寄存器的傳送指令有三種形式:
- MOV seg,reg ; 寄存器數據傳送給數據段寄存器,如 MOV DS,AX
- MOV reg,seg ; 段寄存器數據傳送給寄存器,如 MOV AX,DS
- MOV mem,seg ; 段寄存器數據傳送給內存單元,如 MOV [DI],DS
說明:當段寄存器作為目的操作數時,不允許是CS和SS段寄存器,但所有段寄存器都可以作為源操作數
-
-
數據交換指令
指令格式:XCHG OPD,OPS
XCHG一般有如下三種格式:
XCHG reg,reg XCHG AL,AH
XCHG reg,mem XCHG AL,[BX]
XCHG mem,reg XCHG [1000H],BX
2.堆棧操作指令
堆棧是在內存RAM這種開辟的一段特殊的存儲空間。它的主要功能包括:
- 用來暫時存放程序的(斷電)地址(CS和IP的值)。
- 用以臨時存放CPU寄存器和存儲器中暫時不用的數據 (寄存器不夠用)
堆棧操作指令:
-
數據入棧指令
指令格式:PUSH OPS16
將OPS中的16位數據壓入堆棧中,且堆棧指針SP中的值減2,PUSH一般有兩種形式:
- PUSH reg16
- PUSH mem16
-
數據出棧指令
指令格式: POP OPD16
將SS:IP所指定的一個字彈出給某一16位通用寄存器、數據段寄存器或某一字存儲單元中。OPS一定是16位,彈出棧的數據也是16位,POP OPD16指令執行后,SP加2。
POP一般有三種形式:
- POP reg16
- POP seg
- POP mem16
注:高字節存放高地址、低字節存放低地址
-
地址傳送指令
-
傳送偏移地址
指令格式: LEA reg16,OPS
說明:(1)目的操作數一定是一個16通用寄存器。
(2)OPS 所提供的一定要是內存的一個偏移地址,可以是存儲器的各種尋址方式。例如:
LEA BX,[SI+2]
(3)OPS通常是變量名,取其偏移地址到reg16中。例如:
LEA SI,VAR
-
-
輸入/輸出指令
輸入 /輸出設備接口電路中有三種類型的寄存器 此處寄存器跟前面所指寄存器並不同 每一個設備寄存器都在I/O空間中被指定一個固定地址
-
基本輸入指令
IN AL,DX
通常用作查詢狀態,數據采集
-
基本輸出指令
OUT DX,AL
給300H發數據80H
MOV AL,80H
MOV DX,300H
OUT DX,AL
-
1.2.2 算數運算指令
1.加法指令
-
不帶進位的加法指令
指令格式: ADD OPD,OPS
ADD有以下5種形式:
ADD reg,reg
ADD reg,mem
ADD mem,reg
ADD reg,imm
ADD imm,reg 例:ADD WORD PTR[1000H],2233H
-
帶進位的加法指令
指令格式:ADC OPD,OPS
2.減法指令
-
不帶借位減法指令
指令格式:SUB OPD,OPS
-
帶借位減法指令
指令格式: SBB OPD,OPS
-
減1指令
指令格式:DEC OPD
DEC有兩種形式:
DEC reg
DEC mem DEC WORD PTR[DI]
例:求1-100的累加和
MOV AX,0
MOV CX=64
ABC:ADD AX,CX
DEC CX
JNZ ABC
-
比較指令
指令格式:CMP OPD,OPS; (OPD)-(OPS)
3.乘法指令
-
無符號的乘法指令
指令格式:MUL OPS
字節乘法: AX<----(AL)*(OPS8)
字乘法: DX:AX<----(AX)*(OPS16)
-
帶符號數乘法指令
指令格式:IMUL OPS
字節乘法: AX<----(AL)*(OPS8)
字乘法: DX:AX<----(AX)*(OPS16)
4.除法指令
-
無符號的除法法指令
指令格式:DIV OPS
字節除法: (AX)/(OPS8) 商---->AL,余數---->AH
字除法: DX:AX/(OPS16)
-
帶符號數除法指令
指令格式:IDIV OPS
字節除法: (AX)/(OPS8) 商---->AL,余數---->AH
字除法: DX:AX/(OPS16)
1.2.3邏輯運算
1.求補指令
指令格式:NEG OPD
將OPD中的內容逐位取反,且末尾加一后送入OPD中
2.求反指令
指令格式:NOT OPD
將OPD中的內容逐位取反后,送入OPD中
3.邏輯與指令
指令格式:AND OPD,OPS OPD<----OPD^OPS
4.邏輯測試指令
指令格式: TEST OPD,OPS OPS^OPD
注:用來查詢狀態
5.邏輯或指令
指令格式:OR OPD,OPS OPD<----OPDvOPS
6.邏輯異或指令
指令格式: XOR OPD,OPS
1⊕1=0,0⊕0=0,0⊕1=1
1.2.4 移位指令
1. 算術移位指令
-
算數左移
SAL OPD,1
SAL OPD,CL
這兩條指令的差別是當移位次數為1時,可以直接使用SAL OPD,1指令,當移位次數大於1時,必須先將移位次數送入CL中,然后使用SAL OPD,CL指令。
-
算數右移
SAR OPD,1
SAR OPD,CL

2.邏輯移位指令
-
邏輯左移指令
SHL OPD,1
SHL OPD,CL
-
邏輯右移指令
SHR OPD,1
SHR OPD,CL

3.循環移位
-
不帶進位的循環左移指令
ROL OPD,1
ROL OPD,CL
ROL WORD PTR[BX],1 ;內存中臨近的兩個字節組成一個字循環左移一位
-
不帶進位的循環右移指令
ROR OPD,1
ROR OPD,CL
