1. 程式人生 > >菜鷄日記——《彙編與介面技術》第3-3章 80X86指令系統 之 算術指令 & 邏輯指令

菜鷄日記——《彙編與介面技術》第3-3章 80X86指令系統 之 算術指令 & 邏輯指令

算術指令

有符號數算術運算與標誌OF:

  1. 有符號數運算用補碼錶示,帶符號運算
  2. 溢位時OF=1,不溢位時OF=0
  3. 兩異號數加減無溢位,兩同號數加減可能溢位
  4. An、Bn、Sn分別代表兩加數和結果的符號位,則第3點的數學表示為:OF=(﹁An∧﹁Bn∧Sn)∨(An∧Bn∧﹁Sn)
  5. 溢位標誌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
  6. 指令系統提供了溢位終端指令判斷有無溢位,若溢位則呼叫終端服務程式
  • 加法指令: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標誌外(硬體結構決定),均對標誌位有影響

  0 1
進位標誌 CF 被減數最高位沒有向高位借位 被減數最高位向高位借位
溢位標誌 OF 無溢位 溢位
CMP指令對標誌位的影響(CMP OPR1,OPR2)
運算元 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