8086指令系統(tǒng)---算術指令(一)
① 43H-16H=2DH
0100 0011 0100 0011 條件碼設置:CF=0
?。?0001 0110 + 1110 1010 OF=0
-------------- --------------
0010 1101 1← 0010 1101
說明:機器作減法運算時,先將減數(shù)求補,然后轉化為加法運算,所以實際上機器設置CF的方法是:最高有效位不產生進位時,CF=1;最高有效位產生進位時,CF=0。這和做減法時有借位CF=1,無借位CF=0是一致的。
本例參加運算的數(shù)無論是看作帶符號數(shù)還是無符號數(shù),運算結果均有效。
?、?0C8H-66H=62H
1100 1000 1100 1000 條件碼設置:CF=0
?。?0110 0110 + 1001 1010 OF=1
-------------- ------------
0110 0010 1← 0110 0010
說明:如果是無符號數(shù)的運算,被減數(shù)夠減無借位,所以CF置0,表明結果有效。如果操作數(shù)是帶符號數(shù),且被減數(shù)與減數(shù)符號相反,而結果符號與減數(shù)符號相同,所以OF置1,表明結果無效。
③ 54H-76H=0DEH
0101 0100 0101 0100 條件碼設置:CF=1
- 0111 0110 + 1000 1010 OF=0
------------- -------------
1101 1110 1101 1110
說明:如果是無符號數(shù)的運算,本例中被減數(shù)<減數(shù),減運算向高位有借位(或加運算無進位),則CF置0,表明結果無效。如果是帶符號數(shù)的運算,同符號數(shù)相減,OF置0,結果有效。
④ 4BH-0B6H=0DEH
0100 1011 0100 1011 條件碼設置:CF=1
- 1011 0110 + 0100 1010 F=1
--------------- -----------
1001 0101 1001 0101
說明:如果是無符號數(shù)的運算,本例中被減數(shù)<減數(shù),減運算向高位有借位(或加運算無進位),則CF置0,表明結果無效。如果是帶符號數(shù)的運算,不同符號數(shù)相減,且結果符號與減數(shù)符號相同,OF置1,結果也是無效的。
例分析下列程序的執(zhí)行情況:
DATA_A DD 62562FAH
DATA_B DD 412963BH
RESULT DD ?
… … …
MOV AX, WORD PTR DATA_A ; (AX)=62FAH
SUB AX, WORD PTR DATA_B ; sub 963BH from AX
MOV WORD PTR RESULT, AX ; save the result
MOV AX, WORD PTR DATA_A+2 ; (AX)=0625H
SBB AX, WORD PTR DATA_B+2 ; sub 0412H with borrow
MOV WORD PTR RESULT, AX ; save the result
答:SUB指令執(zhí)行后,(AX)= 62FAH-963BH=0CCBFH,CF=1(有借位)。執(zhí)行SBB指令后,(AX)= 625H-412H-1=212H,CF=0,OF=0,因此,保存于RESULT的結果數(shù)據為0212CCBFH。
MUL src 無符號數(shù)乘法(unsigned multiple)
IMUL src 帶符號數(shù)乘法(signed multiple)
字節(jié)操作: (AX) ← (AL)×(src)
字操作: (DX, AX) ← (AX)×(src)
MUL和IMUL指令的區(qū)別僅在于操作數(shù)是無符號數(shù)還是帶符號數(shù),它們的共同點是,指令中只給出源操作數(shù)src,它可以使用除立即數(shù)方式以外的任一種尋址方式。目的操作數(shù)是隱含的,它只能是累加器(字運算為AX,字節(jié)運算為AL)。隱含的乘積寄存器是AX或DX(高位)和AX(低位)。
乘法指令只影響CF和OF,其它條件碼位無定義。無定義是指指令執(zhí)行后,條件碼位的狀態(tài)不確定,因此它們是無用的。
MUL指令的條件碼設置為:
CF OF= 0 0 乘積的高一半為0(字節(jié)操作的(AH)或字操作的(DX))
CF OF= 1 1 乘積的高一半不為0
這樣的條件碼設置可以指出字節(jié)相乘的結果是8位(CF=0)還是16位(CF=1),字相乘的結果是16位(CF=0)還是32位(CF=1)。
IMUL指令的條件碼設置為:
CF OF= 0 0 乘積的高一半為低一半的符號擴展
CF OF= 1 1 其他情況
符號擴展是指做字節(jié)乘法時,乘積低8位的最高位為0,高8位也擴展為0,或者低8位的最高位為1,高8位也擴展為1的情況。對兩個字相乘,符號擴展是指乘積的低16位的最高位為0,高16位也擴展為0,或者低16位的最高位為1,高16位也擴展為1的情況。
例無符號數(shù)乘法
; from the data segment
DATA1 DB 25H
DATA2 DB 65H
RESULT DW ?
; from the code segment
MOV AL,DATA1
MOV BL,DATA2
MUL BL ; register addressing mode
MOV RESULT,AX
or
MOV AL,DATA1
MUL DATA2 ; direct addressing mode
MOV RESULT,AX
or
MOV AL,DATA1
MOV SI,OFFSET DATA2
MUL BYTE PTR [SI] ;register indirect addressing mode
MOV RESULT,AX
本例25H×65H=0E99H,高16位不為0,所以CF=1,OF=1。
例
DATA3 DW 2378H
DATA4 DW 2F79H
RESULT1 DW 2 DUP(?)
… …
MOV AX, DATA3 ; load first operand into AX
IMUL DATA4 ; multiply it by the second operand
MOV RESULT1, AX ; store the lower word result
MOV RESULT1+2, DX ; store the higher word result
本例2378H×2F79H=0693 CBB8H,即(DX)=0693H,(AX)=0CBB8H。因為高16位不是低16位的符號擴展,所以條件碼設置為CF=1,OF=1。
評論