算術指令
注意:影響標志位,為條件碼:主要 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碼調整指令
-
低4位為BCD碼,高4位為零
-
加減運算非壓縮BCD碼高4位的值可不為0,乘除時高4位必須是0
-
AAA;
對加法運算非壓縮BCD碼進行調整,進位送進AH中
-
AAS;
對減法運算非壓縮BCD碼進行調整,
-
AAM;
對乘法運算非壓縮BCD碼進行調整,
-
AAD;
對除法運算非壓縮BCD碼進行調整,