匯編指令之算數指令


算術指令

注意:影響標志位,為條件碼:主要 CF,ZF,SF,OF,

  • 乘除,均不涉及立即數imm

[參考] 匯編]8086指令系統---算術指令(一)_極品小肥羊的博客-CSDN博客

加法指令

  • ADD DST,SRC

    DST <- (DST+SRC)

    eg:
    ADD reg,reg
    ADD reg,mem
    ADD reg,imm
    ADD mem,reg
    ADD mem,imm
    
  • ADC DST,SRC

    DST <- (DST+SRC+CF)

    同上 + CF;
    
  • INC DST

    DST <- DST+1; DST:reg,mem

  SF=1 加法結果為負數(符號位為1)
  SF=0 加法結果為正數(符號位為0)
  ZF=1 加法結果為零
  ZF=0 加法結果不為零
  CF=1 最高有效位向高位有進位
  CF=0 最高有效位向高位無進位
  OF=1 兩個同符號數相加(正數+正數,或負數加負數),結果符號與其相反
  OF=0 不同符號數相加時,或同符號數相加,結果符號與其相同
計算機在執行運算時,並不區別操作數是帶符號數還是無符號數,一律按上述規則設置條件碼,

ADC指令主要與ADD配合,實現多精度加法運算

減法指令

  • SUB DST,SRC

    ;DST <- (DST-SRC)

    SUB reg,reg
    SUB reg,mem
    SUB reg,imm
    SUB mem,reg
    SUB mem,imm
    
  • SBB DST,SRC

    ;DST <- (DST-SRC-CF);

    同上 - CF
    
  • DEC DST

    ;DST <- DST-1 DST: reg,mem

  • NEG DST; 求補

    ;DST <- (0-DST); DST:reg,mem

    求補操作即把操作數變為與其符號相反的數:。
    機器在執行求補指令時,把操作數各位求反后末位加1,因此執行的操作也可表示為:
    (DST) ← 模-(DST)+1
    
  • CMP DST,SRC;

    ;DST-SRC ;僅影響標志位

    eg:
    	CMP reg,reg
        CMP reg,mem
        CMP reg,imm
        COM mem,reg
        COM mem,imm
    
SF和ZF分別表示減法結果的符號以及為零的情況;
CF表明無符號數相減結果溢出與否;
OF表明帶符號數相減結果溢出與否。

但在對CF和OF位的設置方法上減法和加法有所不同,下面對此做進一步說明:
  CF=1   二進制減法運算中最高有效位向高位有借位(被減數<減數,不夠減的情況)
  CF=0   二進制減法運算中最高有效位向高位無借位(被減數≥減數,夠減的情況)
  OF=1   兩數符號相反(正數-負數,或負數-正數),而結果符號與減數相同
  OF=0   同符號數相減時,或不同符號數相減,其結果符號與減數不同

乘法指令

[參考] 匯編]8086指令系統---算術指令(二)_極品小肥羊的博客-CSDN博客

無符號乘法

乘法指令只影響CF和OF,其它條件碼位無意義
MUL指令的條件碼設置為:
  CF OF= 0 0 乘積的高一半為0(字節操作的(AH)或字操作的(DX))
  CF OF= 1 1 乘積的高一半不為0
  • MUL SRC

    ;AX <- (AL*SRC_8)
    ;DX,AX <- (AX*SRC_16)
    MUL reg8
    MUL reg16
    MUL mem8
    MUL mem16
    

有符號乘法

IMUL指令的條件碼設置為:
  CF OF= 0 0 乘積的高一半為低一半的符號擴展
  CF OF= 1 1 其他情況
  
符號擴展是指
	做字節乘法時,乘積低8位的最高位為0,高8位也擴展為0,或者低8位的最高位為1,高8位也擴展為1的情況。
	對兩個字相乘,符號擴展是指乘積的低16位的最高位為0,高16位也擴展為0,或者低16位的最高位為1,高16位也擴展為1的情況。
  • IMUL SRC

    ;AX <- (AL*SRC_8)
    ;(DX,AX) <- (AX*SRC_16)
    IMUL reg8
    IMUL reg16
    IMUL mem8
    IMUL mem16
    

除法指令

	參加運算的除數和被除數是無符號數時,使用DIV指令,其商和余數也均為無符號數。
	IDIV指令執行的操作與DIV相同,但操作數必須是帶符號數,商和余數也均為帶符號數,而且余數的符號與被除數的符號相同。
	除法指令對Flags無定義,因此對除法指令產生的錯誤,如除數為0或商溢出等錯誤,由系統直接轉入0型中斷來處理。所謂商溢出,是指被除數高一半的絕對值大於除數的絕對值時,商超出了16位的表示范圍(字操作)或8位的表示范圍(字節操作)
  • 除法指令要求字操作時,被除數必須為32位,除數是16位,商和余數是16位的;
    字節操作時,被除數必須為16位,除數是8位,得到的商和余數是8位的。
    • 不足可以對AX DX用字符擴展指令

無符號除法

  • DIV SRC

    ;AL <- (AX / SRC_8)
    ;AH <- (AX % SRC_8)
    
    ;AX <- (AX / SRC_16)
    ;DX <- (AX % SRC_16)
    DIV reg8
    DIV reg16
    DIV mem8
    DIV mem16
    
  • 有符號除法

    IDIV SRC

    ;AL <- (AX / SRC_8)
    ;AH <- (AX % SRC_8)
    
    ;AX <- (AX / SRC_16)
    ;DX <- (AX % SRC_16)
    同上
    
  • 字節轉換成字(有符號數)

    • 進行符號擴展的操作數必須存放在AL寄存器或AX寄存器中

    CBW;

    若AL最高位為0,則AH全為0;
    若AL最高位為1,則AH全為FFH;類似於字符擴展
    eg
    	(AH)= 00H 當(AL)的最高有效位為0時
    	(AH)= FFH 當(AL)的最高有效位為1時
    
    
    符號擴展是指
    	做字節乘法時,乘積低8位的最高位為0,高8位也擴展為0,或者低8位的最高位為1,高8位也擴展為1的情況。
    	對兩個字相乘,符號擴展是指乘積的低16位的最高位為0,高16位也擴展為0,或者低16位的最高位為1,高16位也擴展為1的情況。
    
  • 字轉換成雙字節(有符號)

    CWD;

    若AX最高位為0,則DX全為0;
    若AX最高位為1,則DX全為FFH;類似於字符擴展
    eg
    (DX)=0000H當(AX)的最高有效位為0時
    (DX)=FFFFH當(AX)的最高有效位為1時
    
    若(AX)= 0BA45H,
        CBW; 執行后,(AH)=00, (AL)=45H, 或 (AX)=0045H
        CWD; 執行后,(DX)=0FFFFH, (AX)=0BA45H
    

BCD 碼調整

​ 8086微型機提供了一組十進制調整指令,用來處理ASCII碼和BCD碼表示的數。

壓縮BCD碼調整指令

每個字節兩個BCD碼

10010101B=95H ;值就為95
  • DAA ;

    對加法運算結果AL 進行BCD 碼調整

  • DAS;

    對減法運算結果AL進行BCD碼調整

非壓縮BCD碼調整指令

  1. 低4位為BCD碼,高4位為零

  2. 加減運算非壓縮BCD碼高4位的值可不為0,乘除時高4位必須是0

  • AAA;

    對加法運算非壓縮BCD碼進行調整,進位送進AH中

  • AAS;

    對減法運算非壓縮BCD碼進行調整,

  • AAM;

    對乘法運算非壓縮BCD碼進行調整,

  • AAD;

    對除法運算非壓縮BCD碼進行調整,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM