菜鷄日記——《彙編與介面技術》第3-3章 80X86指令系統 之 算術指令 & 邏輯指令
算術指令
有符號數算術運算與標誌OF:
- 有符號數運算用補碼錶示,帶符號運算
- 溢位時OF=1,不溢位時OF=0
- 兩異號數加減無溢位,兩同號數加減可能溢位
- An、Bn、Sn分別代表兩加數和結果的符號位,則第3點的數學表示為:OF=(﹁An∧﹁Bn∧Sn)∨(An∧Bn∧﹁Sn)
- 溢位標誌OF與進位標誌CF不同時使用,如下:
帶符號 無符號 0000 0100B + 0000 1011B = 0000 1111B (+4)+(+11)=+15 OF=0 4+11=15 CF=0 1000 0111B + 1111 0101B = 0111 1100B (-121)+(-11)=+124 OF=1 135+245=124 CF=1 0000 0111B + 1111 1011B = 0000 0010B (+7)+(-5)=+2 OF=0 7+251=2 CF=1 0000 1001B + 0111 1100B = 1000 0101B (+9)+(+124)=-123 OF=1 9+124=133 CF=0 - 指令系統提供了溢位終端指令判斷有無溢位,若溢位則呼叫終端服務程式
- 加法指令:ADD、ADC、INC
加法指令:ADD DST,SRC 執行操作:(DST)←(DST)+(SRC)
帶進位加法指令:ADC DST,SRC 執行操作:(DST)←(DST)+(SRC)+CF
遞增指令:INC OPR 執行操作:(OPR)←(OPR)+1
除了INC指令不影響CF標誌外(硬體結構決定),均對標誌位有影響
0 1 符號標誌 SF 結果為正 結果為負 零標誌 ZF 結果為0 結果不為0 進位標誌 CF 最高有效位無進位 最高有效位有進位 溢位標誌 OF 無溢位 溢位
- 減法指令:SUB、SBB、DEC、NEG、CMP
減法指令:SUB DST,SRC 執行操作:(DST)←(DST)-(SRC)
帶借位減法:SBB DST,SRC 執行操作:(DST)←(DST)-(SRC)-CF
遞減指令:DEC OPR 執行操作:(OPR)←(OPR)-1
取反指令:NEG OPR 執行操作:(OPR)← -(OPR)
也可以看成運算元帶符號取反後末位+1,即 (OPR)←0FFFFH-(OPR)+1
比較指令:CMP OPR1,OPR2 執行操作:(OPR1)-(OPR2)
注意:運算結果不儲存,只是設定標誌位
OPR1和OPR2可以是暫存器或儲存器,但不能同時是儲存器,OPR2還能是立即數
除了DEC指令不影響CF標誌外(硬體結構決定),均對標誌位有影響
CMP指令對標誌位的影響(CMP OPR1,OPR2)
0 1 進位標誌 CF 被減數最高位沒有向高位借位 被減數最高位向高位借位 溢位標誌 OF 無溢位 溢位
運算元 CF ZF SF OF 兩運算元關係 有符號 0 1 0 0 OPR1 = OPR2 - 0 1 0 OPR1 < OPR2 - 0 0 0 OPR1 > OPR2 - 0 1 1 負數減正數得正數溢位,此時OPR1 < OPR2 - 0 0 1 正數減負數得負數溢位,此時OPR1 > OPR2 無符號 0 1 0 0 OPR1 = OPR2 1 0 - - OPR1 < OPR2 0 0 - - OPR1 > OPR2
- 乘法指令:MUL、IMUL
無符號數乘法指令:MUL SRC
有符號數乘法指令:IMUL SRC
執行操作都是:1)位元組操作:AX←AL*(SRC)
2)字操作:(DX,AX)←AX*(SRC)
1)AL、AX為隱含的乘數暫存器,AX、(DX,AX)為隱含的乘積暫存器
2)SRC不能為立即數,因為位寬不確定
3)使用位元組操作還是字操作取決於SRC位寬
4)乘法指令不會產生溢位和進位,此時CF和OF用於表示乘積有效長度
除CF和OF外,對標誌位無定義
(CF,OF) 表示 MUL 00 乘積高一半(即AH或DX)為0 11 乘積高一半不為0 IMUL 00 乘積高一半(即AH或DX)是低一半(即AL或AX)的符號擴充套件 11 乘積高一半不是低一半的符號擴充套件
- 除法指令:DIV、IDIV
- 十進位制調整指令:DAA、DAS、AAA、AAS、AAM、AAD
邏輯指令
- 邏輯運算指令:NOT、AND、OR、XOR、TEST
邏輯非:NOT OPR 執行操作:(OPR)←﹁(OPR)
OPR不能為立即數,不影響標誌位
邏輯與:AND DST,SRC 執行操作:(DST)←(DST)∧(SRC)
邏輯或:OR DST,SRC 執行操作:(DST)←(DST)∨(SRC)
異或:XOR DST,SRC 執行操作:(DST)←(DST)⊕(SRC)
測試指令:TEST OPR1,OPR2 執行操作:(OPR1)∧(OPR2)
最後4條指令:CF=0,OF=0,SF、ZF、PF根據結果設定,AF無定義
- 移位指令:SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR
邏輯左移:SHL OPR,CNT
邏輯右移:SHR OPR,CNT
算術左移:SAL OPR,CNT
算術右移:SAR OPR,CNT
迴圈左移:ROL OPR,CNT
迴圈右移:ROR OPR,CNT
帶進位迴圈左移:RCL OPR,CNT
帶進位迴圈右移:RCR OPR,CNT
執行操作如圖:
1)OPR可用除立即數外的任何定址方式
2)CNT=1時可以使用立即數表示,CNT>1時移位次數需先存放在CL中
3)CF=移入的數值,CNT=1且最高有效位值發生變化時OF=1,CNT=1但最高有效位值無變化時OF=0,CNT>1時 OF無意義
4)對於移位指令,SF、ZF、PF根據移位結果設定,AF無意義
5)迴圈移位指令不影響SF、ZF、PF、AF