8086指令系統(tǒng)---算術指令(一)
ADD 加法 SUB 減法
ADC 帶進位加 DEC 減1
INC 加1 NEG 求補
CMP 比較
?、?乘法指令 ?、?除法指令
MUL 無符號數(shù)乘法 DIV 無符號數(shù)除法
IMUL 帶符號數(shù)乘法 IDIV 帶符號數(shù)除法
?、?符號擴展指令 ?、?十進制調整指令
CBW 字節(jié)轉換為字 DAA 加法的十進制調整
CWD 字轉換為雙字 DAS 減法的十進制調整
AAA 加法的ASCII調整
AAS 減法的ASCII調整
AAM 乘法的ASCII調整
AAD 除法的ASCII調整
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í)行前:
?。―X,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(字)時
評論