8086指令系統(tǒng)---算術指令(一)
ADD 加法 SUB 減法
ADC 帶進位加 DEC 減1
INC 加1 NEG 求補
CMP 比較
?、?乘法指令 ⑷ 除法指令
MUL 無符號數(shù)乘法 DIV 無符號數(shù)除法
IMUL 帶符號數(shù)乘法 IDIV 帶符號數(shù)除法
?、?符號擴展指令 ?、?十進制調(diào)整指令
CBW 字節(jié)轉換為字 DAA 加法的十進制調(diào)整
CWD 字轉換為雙字 DAS 減法的十進制調(diào)整
AAA 加法的ASCII調(diào)整
AAS 減法的ASCII調(diào)整
AAM 乘法的ASCII調(diào)整
AAD 除法的ASCII調(diào)整
ADD dst,src加法指令(addition)
執(zhí)行操作: (dst) ← (src)+(dst)
ADC dst,src帶進位加指令(add with carry)
執(zhí)行操作: (dst) ← (src)+(dst)+CF
INC opr加1指令(increment)
執(zhí)行操作: (opr) ← (opr)+1
ADD和ADC指令是雙操作數(shù)指令,它們的兩個操作數(shù)不能同時為存儲器尋址方式,也就是說,除源操作數(shù)為立即數(shù)的情況外,源和目的操作數(shù)必須有一個是寄存器尋址方式。INC指令是單操作數(shù)指令,它可以使用除立即數(shù)方式外的任何尋址方式。
ADD和ADC指令影響條件標志位(也稱條件碼),INC指令影響除CF外的其它條件碼。條件碼中最主要的是SF、ZF、CF和OF,加法運算對這四個條件碼的設置方法如下:
SF=1 加法結果為負數(shù)(符號位為1)
SF=0 加法結果為正數(shù)(符號位為0)
ZF=1 加法結果為零
ZF=0 加法結果不為零
CF=1 最高有效位向高位有進位
CF=0 最高有效位向高位無進位
OF=1 兩個同符號數(shù)相加(正數(shù)+正數(shù),或負數(shù)加負數(shù)),結果符號與其相反
OF=0 不同符號數(shù)相加時,或同符號數(shù)相加,結果符號與其相同
計算機在執(zhí)行運算時,并不區(qū)別操作數(shù)是帶符號數(shù)還是無符號數(shù),一律按上述規(guī)則設置條件碼,因此,程序員要清楚當時處理的是什么類型的數(shù)據(jù)。例如,當加法運算結果的最高有效位為1時,機器將SF置1。如果參加運算的是兩個帶符號數(shù),那么和的最高有效位是符號位,SF置1說明結果是一個負數(shù)。如果參加運算的是兩個無符號數(shù),那么和的最高有效位也是數(shù)值位,此時SF置0或置1都失去了表示正負數(shù)的意義。
對帶符號數(shù)和無符號數(shù),它們表示結果溢出的條件標志位也是不同的。上述OF位的設置條件顯然只符合帶符號數(shù)的溢出情況,OF=1表示運算結果是錯誤的。而無符號數(shù)溢出(運算結果超出了有限位的表示范圍)時,表現(xiàn)為最高有效位產(chǎn)生進位,因此,CF=1是無符號數(shù)溢出的標志。另外,在雙字長數(shù)運算時,低位字相加設置的CF,說明低位字向高位字有無進位的情況。
例MOV BX,9B8CH ; (BX)=9B8CH
ADD BX,6478H ; now (BX)=0000H
9B8A 1001 1011 1000 1010
+ 6476 + 0110 0100 0111 0110
----------- --------------------------
1← 0000 1← 0000 0000 0000 0000
條件碼設置: SF=0 最高有效位(D15)為0
ZF=1 結果為0
CF=1 最高有效位向高位有進位
OF=0 不同符號數(shù)相加,不產(chǎn)生溢出
例編寫執(zhí)行雙精度數(shù)(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作數(shù)的高位字,BX是源操作數(shù)的高位字。指令執(zhí)行前:
(DX,CX)= A248 2AC0H,(BX,AX)= 088A E25BH。
指令序列: ADD CX, AX ;(CX)= 0D1BH
ADC DX, BX ; now,(DX)=0AAD3H
執(zhí)行ADD指令:
2AC0 0010 1010 1100 0000
+ E25B + 1110 0010 0101 1011
--------- ------------------------
1← 0D1B 1← 0000 1101 0001 1011
條件碼設置: SF=0 最高有效位(D15)為0,無符號位意義
F=0 結果不為0
CF=1 最高有效位向高位有進位
OF=0 加數(shù)最高位分別為0、1,溢出位置0,OF對低位字無溢出意義
執(zhí)行ADC指令:
A248 1010 0010 0100 1000
088A 0000 1000 1000 1011
+ 1 + 1←CF
---------- ----------------------------
AAD3 1010 1010 1101 0011
條件碼設置: SF=1 最高有效位(D31)為1,對帶符號數(shù)運算表示結果為負
ZF=0 結果不為0
CF=0 最高有效位向高位無進位
OF=0 結果符號與操作數(shù)相同,未產(chǎn)生溢出
2 減法指令
SUB dst,src減法指令(subtract)
執(zhí)行操作: (dst) ← (dst)-(src)
SBB dst,src帶借位減法指令(subtract with borrow)
執(zhí)行操作: (dst) ← (dst)-(src)-CF
DEC opr減1指令(decrement)
執(zhí)行操作: (opr) ← (opr)-1
CMP opr1,opr2比較指令(compare)
執(zhí)行操作: (opr1)-(opr2),根據(jù)相減結果設置條件碼,但不回送結果
以上指令除DEC指令不影響CF外,其他都影響條件碼。與加法類似,SF和ZF分別表示減法結果的符號以及為零的情況;CF表明無符號數(shù)相減結果溢出與否;OF表明帶符號數(shù)相減結果溢出與否。但在對CF和OF位的設置方法上減法和加法有所不同,下面對此做進一步說明:
CF=1 二進制減法運算中最高有效位向高位有借位(被減數(shù)<減數(shù),不夠減的情況)
CF=0 二進制減法運算中最高有效位向高位無借位(被減數(shù)≥減數(shù),夠減的情況)
OF=1 兩數(shù)符號相反(正數(shù)-負數(shù),或負數(shù)-正數(shù)),而結果符號與減數(shù)相同
OF=0 同符號數(shù)相減時,或不同符號數(shù)相減,其結果符號與減數(shù)不同
NEG opr求補指令(negate)
執(zhí)行操作: (opr) ← -(opr),
求補操作即把操作數(shù)變?yōu)榕c其符號相反的數(shù):。
機器在執(zhí)行求補指令時,把操作數(shù)各位求反后末位加1,因此執(zhí)行的操作也可表示為:
(opr) ← 0FFFFH-(opr)+1
NEG指令的條件碼設置方法為:
CF=1 不為0的操作數(shù)求補時
CF=0 為0的操作數(shù)求補時
OF=1 當求補運算的操作數(shù)為-128(字節(jié))或-32768(字)時
OF=0 當求補運算的操作數(shù)不為-128(字節(jié))或-32768(字)時
評論