32位微處理器指令系統之乘除算術運算指令

乘法指令

1.MUL指令(無符號數的乘法指令)

指令格式:

MUL OPS 
;OPS可以是reg和mem操作數。

被乘數先放在AX或AL、EAX中,再將乘數給OPS。

字節乘法:
(AL)*(OPS8)→AX
字乘法:
(AX)*(OPS16)→DX:AX
雙字乘法:
(EAX)*(OPS32)→EDX:EAX
影響的標誌位是:
CF、OF,不影響AF、PF、SF、ZF。

8086乘法運算指令分為無符號數乘MUL和有符號數乘IMUL。

乘法在實現字節相乘時乘積放在AX寄存器中,字相乘時乘積放在DX:AX寄存器中,因此乘法指令不會產生溢出和進位,這時用OF和CF位來表示乘積有效數字的長度。

若乘積的高半部分(字節乘法為AH,字乘法為DX)有效(MUL指令是指AH或DX中的內容不為0,IMUL指令指的則是AH或DX中的內容是否為符號位的擴展),則CF與OF都為1,表示DX或AH中含有乘積的有效數字,否則CF和OF為0。 給你舉個例子吧。 無符號數0B4H與11H相乘 mov al,0b4h ;al=b4h=180d(被乘數放在al中) mov bl,11h ;bl=11h=17d(乘數放在bl中) mul bl ;ax=Obf4h=3060d,OF=CF=1(乘積放在ax中。AX高8位不為0) 再來一個有符號數乘法的例子。 有符號數0B4H與11H相乘 mov al,0b4h ;al=b4h=-76d(b4h為-76的補碼) mov bl,11h ;bl=11h=17d imul bl ;ax=faf4h=-1292d,OF=CF=1 ;AX高8位不是低8位的符號擴展,表示含有有效數字,計算二進制數乘法:b4h×11h。如果把它當作無符號數,用MUL指令結果為0bf4h;如果看作是有符號數,用IMUL指令則結果為faf4h。

由此可見,同樣的二進制數看作無符號數與有符號數相乘,即採用MUL與IMUL指令,它們的結果是不相同的。

例:

設(AL)=02H(2),
(BH)=81H(129),
(AL)*(BH)→AX,
執行MUL BH指令後,(AX)=02H*81H=0102H。
(258)十進制

2.IMUL指令(帶符號數整數乘法指令)

指令基本格式:
IMUL OPS
字節乘法:
(AL)*(OPS8)→AX
字乘法:
(AX)*(OPS16)→DX:AX
雙字乘法:
(EAX)*(OPS32)→EDX:EAX
對標誌位的影響:
與MUL指令相同。

DX放高位,AX放低位

兩個補碼相乘,結果也是補碼,其結果代表的真值應該是兩個補碼所代表的真值的乘積。


除法指令

1.DIV指令(無符號數的除法指令)

指令格式: 
DIV OPS
字節除法:
(AX)/(OPS8)→AL(商)、AH(餘數)
字除法:
(DX:AX)/(OPS16)→AX(商)、DX(餘數)
雙字除法:
(EDX:EAX)/(OPS32)→EAX(商)、EDX(餘數)
對標誌位的影響:
CF、OF、AF、PF、SF、ZF均未定義。

2.IDIV指令(帶符號數的除法指令)

指令格式: 
IDIV OPS
字節除法:
(AX)/(OPS8)→AL(商)、AH(餘數)
字除法:
(DX:AX)/(OPS16)→AX(商)、DX(餘數)
雙字除法:
(EDX:EAX)/(OPS32)→EAX(商)、EDX(餘數)
對標誌位的影響:
CF、OF、AF、PF、SF、ZF均未定義。


分享到:


相關文章: