8088/8086 CPU特點
- 采用並行流水線工作方式
- 通過設置指令預取隊列實現
- 對內存進行分段管理
- 分為4個段並設置地址段寄存器,實現對1MB空間的尋址
- 支持協處理器
最小模式過程
-
8088送ALE給地址鎖存器,地址不會改變
-
-
地址線和數據線
- \(AD_0-AD_7\):低八位地址和低八位數據信號分時復用.傳送地址時信號為單向,傳送數據時為雙向.
- \(A_{16}-A_{19}\):高4位地址信號,與狀態信號分時復用
- \(A_8-A_{15}\):8位地址信號
-
WR 寫信號
-
RD 讀信號
-
IO/M 訪問內存/訪問接口
-
DEN 低電平有效,允許讀寫操作
-
DT/R 傳送方向控制
-
READY 時鍾周期,相當於CLK
-
第三個周期Ready是高電平,就表示工作結束,進行第四個周期,如果是低電平,就要插入一個等待周期
-
中斷請求響應
- INTR 可屏蔽中斷請求輸入端
- NMI 非屏蔽中斷請求輸入端
INTA 中斷響應輸出端
-
總線保持信號
- HOLD 總線保持請求信號輸入端,CPU以外的其他設備要求占用總線時,向CPU發出請求
- HLDA,CPU對HOLD的響應信號
-
執行單元EU
- 總線接口單元BIU
- 從內存中取指令到指令預取隊列
- 負責與內存或者IO接口的數據傳送
- 在執行轉移程序時,BIU使指令預取隊列復位,從指定的新地址取指令,並立即傳給執行單元執行.
- MN/MX 1-最大模式,0-最小模式
8088 內部寄存器
8個通用寄存器
-
數據寄存器
- AX 累加器
- BX 基址寄存器
- CX 計數寄存器(循環 串操作)
- DX 數據寄存器
-
地址指針寄存器
- SP 堆棧指針寄存器,棧頂
- BP 訪問存放在內存單元的偏移地址
-
BX指向的數據段,BP指向的堆棧段
-
變址寄存器
- SI 源
- DI 目標
-
IP PC
-
FLAGS
- C 進位
- F 溢出 兩個符號數,看兩個進位是否相同就可以判斷
- Z 為0時為1
- S 運算結果最高位為1時
- P 1的個數為偶數時為1
- A bit3向bit4有進位時為1
- T 單步工作
- IF 中斷允許標志位,為1時可以相應可屏蔽中斷請求
- D 串操作時確定方向
-
段寄存器(存放段基地址)
- CS 代碼段 存放指令代碼
- DS 數據段 存放數據
- ES 附加段 存放數據
- SS 堆棧段 暫時不用但是要保存的數據
實地址尋址
-
物理地址=段基地址*16+偏移地址
-
一個內存單元在同一時刻可以屬於兩個不同類型的段.
-
堆棧段
-
該看p23
-
8位寄存器中存放的均為運算的數據
-
AX CX一定是數據,BX,DX可能是地址
匯編
MOV
-
MOV指令不影響標志位
-
兩操作數長度相同
-
源操作數 寄存器 存儲器 立即數 目的操作數 寄存器 存儲器
-
不允許同時為存儲器
-
兩操作數不能同時為段寄存器
-
源操作數是立即數時,目標操作數不能是段寄存器
-
IP和CS不作為目標操作數,FLAGS不作為操作數
-
不能用立即尋址給段寄存器賦值
-
MOV DX,09H(√)DX高八位是0,低八位是9
-
將 * 的ASCII碼送入內存數據1000H開始的100個單元中
MOV DI,1000H
MOV CX,64H//常數100
MOV AL,2AH
AGAIN:MOV [DI],AL
INC DI
DEC CX
JNZ AGAIN//CX不為0就跳轉
HLT
堆棧
- 先進先出
- push先SP--,再存數,pop先取數到AL,再SP++
- 以字為單位,一定是16位,沒有8位
- 操作數可以是寄存器和存儲器,但不能是立即數,但操作指令不能是立即數ddddddddddddd
底下是高地址,上面是低地址,然后先壓低地址,再壓高地址
交換指令
- 沒有源操作數和目的操作數,一個立即數也不能有
- 不允許使用段寄存器
查表指令
- 用BX表示首地址,AL表示位移量
- BX+AL所指單元送AL
- 相當於AL是數組首地址,BX是下標,進行一次iloc訪問
字符擴展指令
-
符號位擴展到高位,無符號數補0,隱含的操作數AX、DX
-
CBW 字節到字
- AL內容擴展到AX
- 最高位為1,AH=FFH
- 最高位為0,AH=00H
-
CWD 字到雙字
- AX內容擴展到DX,AX
- 最高位1,DX=FFFFH
- 最高位0,DX=0000H
LEA指令
-
源操作數必須是存儲器,目的操作數通常是間址寄存器
-
將變量的16位偏移地址寫入到目標寄存器
-
MOV讀取的內容,LEA讀取的地址
-
將數據段中首地址為MEM1的50個字節的數據傳送到同一邏輯段首地址為MEM2的區域存放,編寫相應的程序段。
-
LEA SI,MEM1 LEA DI,MEM2 MOV CL,50 NEXT:MOV AL,[SI] MOV [DI],AL//兩個存儲器中間不能直接傳,需要通過寄存器 INC SI INC DI JNZ NEXT HLT
LDS、LES
- 將一個32位的遠地址指針寫入目標寄存器
- LDS:將源操作數的偏移地址送目標寄存器
- LES:將源操作數的偏移地址送目標寄存器,將源操作數的段地址送給ES
標志傳送指令
- LAHF:將FLAGS低八位裝入AH
- SAHF:AH裝入FLAGS的低八位
- PUSHF:stack<-Flags
- POPF Flags<-stack
- PUSHA 所有的Rc16入棧 POPA
- Rc16:AX,CX,DX,BX,SP,BP,SI,DI
I/O端口
- IO接口中用於存儲數據,可以直接被CPU訪問的寄存器.
IN acc,PORT 從端口地址讀入數據到累加器
OUT PORT,acc 將累加器的值輸出到端口中,acc只能是AL/AX
8位時,直接給出8位地址,16位時,端口地址由DX指定.
算術運算類指令
-
ADD
-
ADC 帶進位加法 d<-d+s+C
-
INC,DEC將操作數視為無符號數,會影響標志位,但是不影響進位標志C
-
無符號進位標志看C,有符號看O
-
在內存的First和Secontd開始的區域中分別 存放着2F365H和 5E024 H兩個數,要求求 其和,並存入Third中。
-
注意字長是32位,加完一次后需要再加2
MOV AX,First ADD AX,Second MOV Third,AX MOV AX,First+2//要考慮進位,使用ADC ADC AX,Second+2 MOV Third+2,AX
-
求內存數據段中M1為首和M2為首的兩個20字節數之和,並將結果寫入M2為首的區域.
//按字節
LEA SI,M1
LEA DI,M2
MOV CX,20
CLC//make CF = 0
NEXT:
MOV AL,[SI]
ADC [DI],AL// [DI]+Al+CF->[DI]
INC SI
INC DI
DEC CX
JNZ NEXT
HLT//暫停
//按字2
LEA SI,M1
LEA DI,M2
MOV CX,10
CLC//make CF = 0
NEXT:
MOV AX,[SI]
ADC [DI],AX// [DI]+Al+CF->[DI]
ADD SI,2
ADD DI,2
DEC CX
JNZ NEXT
HLT//暫停
-
SBB \(OPRD1-OPRD2-CF->OPRD1\)
-
NEG \(0-OPRD->OPRD\),執行后除非操作數為0,否則CF都是1.
80H或者8000H執行后結果不變,但是OF置1(溢出),其他情況下均置0.就是各位取反+1 -
CMP僅影響標志位
- 在減法中,小的減大的表示有借位,C=1;
- 無符號數 CF=0 AX>=BX, CF=1,AX<BX CF=0,ZF=1,AX=BX
- 有符號數 OF SF相同時,AX>=BX,否則AX<BX
- 20個數中找最大數
LEA BX,MAX
LEA SI,BUF
MOV CL,20
MOV AL,[SI]
NEXT:
INC SI
CMP AL,[SI]
JNC GOON //CF=0轉移
XCHG [SI],AL
GOON:DEC CL
JNZ NEXT//如果不為0就跳轉
MOV [BX],AL
HLT
乘除運算指令
乘法指令隱含了存放被乘數的AL或AX,以及存放結果的AX或AX DX.
無符號乘法的操作數不能是立即數
除法
- OPRD字節數,執行AX/OPRD
- AL=商,AH=余數
- OPRD雙字節數
- DXAX/OPRD
- AX=商,DX=余數
INC,DEC的執行不會影響CF,其他算術類指令會影響狀態標志位
- 乘法運算中,乘積是乘數的雙倍字長
- 除法要求被除數是除數的雙倍字長
邏輯運算指令
-
除了"非",其余指令的執行都會影響除AF外的標志
-
無論運算結果如何,都會使CFOF清零
-
AND AL,0FH 實現掩碼
-
AND AX,AX 使得CFOF清零
-
從地址為3F8H端口讀入一個字節數,如果該數bit1位為1,則可從38FH端口將DATA為首地址的1個字輸出,否則不能進行數據傳送
MOV DX,3F8H WATT:IN AL,DX AND Al,02H JZ WATT MOV DX,38FH MOV AX,DATA OUT DX,AX
-
OR 使得某些位為1
-
非運算對標志位無影響
-
XOR AX,AX 清零
-
TEST OPRD1,OPRD2,執行與運算,demo結果不寫回
-
從地址為3F8H端口讀入一個字節數,如果該數bit1位 bit3位和bit5位同時為1,則可從38FH端口將DATA為首地址的1個字輸出,否則不能進行數據傳送
LEA SI,DATA MOV DX,3F8H WATT:IN AL,DX AND AL,2AH XOR AL,2AH//0010 1010,如果這些位都是1,那么XOR后一定為0 JNZ WATT MOV DX,38FH MOV AX,[SI] OUT DX,AX
移位操作指令
-
當目標操作數為存儲器操作數時,需要說明其字長,移動的位數只能是1或者是CL
-
算術左移邏輯左移:最高位移到CF,最低位為0
-
邏輯右移:最低位->CF,最高位0
-
算術右移:最低位->CF,最高位變符號位
-
循環移位可以戴震進位也可以不帶CF
-
循環指令左右 對於某些狀態進行測試
- 高位和低位的交換
- 與非循環移位組成32位或者更長字數的移位
LEA SI,MI
LEA DI,M2
MOV CH,4
NEXT:MOV AL,[SI]
MOV BL,AL
AND AL,0FH
OR AL,30H
MOV [DI],AL
INC DI
MOV AL,BL//還原
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],AL
INC DI
INC SI
DEC CH
JNZ NEXT
HLT
串操作指令
-
要求兩個操作數都在存儲器,針對數據塊和存儲器的操作
-
串所在的區域 串的首地址 串的長度 方向
-
源串一般在數據段,偏移地址SI指定
-
目標串必須在附加段,由DI指定
-
串的長度由CX指定
-
操作方向DF=0增地址,DF=1減地址
-
REP CX!=0時,REP后的指令將繼續重復執行
-
REPE CX!=0且ZF=1,重復執行
-
REPNE CX!=0且ZF=0,重復指令
-
MOVS
-
-
增地址
- 串傳送 指針指向串尾+1
- 串比較:指針指向結束位+1
-
減地址
- 串尾-1
- 結束位-1
-
串掃描指令 用於在指定存儲區域中尋找某個關鍵字
-
SCAS OPRD
-
-
MOV DI,2000H MOV BX,DI MOV CX,0AH MOV AL,'A' CLD//將DF清零,為增方向 REPNZ SCASB JZ FOUND MOV DI,0 JMP DONE FOUND:DEC DI//注意停下的時候還在+1的位置 MOV DATA2,DI INC DI SUB DI,BX DONE: MOV DATA1,DI HLT
-
LODS OPRD
-
AL<-[DS:SI]
-
AX<-[DS:SI]
-
將某個區域的數據串依次裝入累加器,以便顯示或輸出到接口,
-
串存儲指令
STOS OPRDAL -> [ES:DI]
AX -> [ES:DI]
用於將內存中的某個區域置成相同的值 -
注意事項
- 需要定義附加段
- 需要設置數據的操作方向
- 源串和目標串的指針分別為SI和DI
- 傳送類指令前加無條件重復前綴
- 串比較類指令前加條件重復前綴,但前綴不影響ZF狀態