組合語言乘法和除法指令

2021-09-05 10:52:45 字數 3554 閱讀 8371

乘法和除法指令

ia-32 處理器的乘法和除法指令需要區別無符號數和有符號數, 並隱含便用丁 eax (和edx) 暫存器。

基本的乘法指令指出源運算元 reg/mem (暫存器或儲存單元), 隱含使用目的運算元,表3。若源運算元是8位數8/m8,al與其相乘得到16位積,存入ax中,若源運算元是 16 位數 r16/m16, ax 與其相乘得到 32 位積, 高 16 位存人 dx, 低 16 位存入ax中; 若源運算元是32位數r32/m32,eax與其相乘得到64位積,高32位存人edx,低32位存人eax中。

表1

乘法 (multiplication) 指令分成無符號數乘法指令 mul和有符號數乘法指令 imul。 同乙個二進位制編碼表示無符號數和有符號數時, 真值可能不同。

例如,用mul進行8位無符號乘法運算:

mov al,0a5h;ala5h,作為無符號整數編碼,表示真值:165

mov bl,64h;bl=64h,作為無符號整數編碼,表示真值:100

mul bl;無符號乘法:ax=4074h,表示真值:16500

再如, 用imul進行8位有符號乘法運算:

mov al,0a5h;al=a5h,作為有符號整數補碼,表示真值:-91

mov bl,64h;bl=64h,作為有符號整數補碼,表示真值:100

imul bl;有符號乘法:ax=dc74h,表示真值:-9100

所以, 對二進位制數乘法: a5h x64h, 如果把它們當作無符號數, 用 mul指令的結果為4074h, 表示真值:16500。 如果採用imul指令, 則結果為dc74h, 表示真值: -9100。

注意 加減指令只進行無符號數運算,程式設計師利用cf和of區別結果

基本的乘法指令按如下規則影響標誌of和cf: 若乘積的高一半是低一半的符號位擴充套件, 說明高一半不含有效數值, 則of=cf=0; 若乘積的高一半有效, 則用of=cf=1 表示。 設定of和cf標誌的原因, 是有時我們需要知道高一半是否可以被忽略, 即不影響結果。

但是, 乘法指令對其他狀態標誌沒有定義, 即任意、 不可**。 注意, 這一點與資料傳送類指令對標誌沒有影響是不同的, 沒有影響是指不改變原來的狀態。

從80186開始, 有符號數乘法又提供了兩種新形式, 如表1後兩行所示。 這些新增的乘法形式的目的運算元和源運算元的長度相同 (用於支援高階語言中型別一致的乘法運算), 因此乘積有可能溢位。 如果積溢位, 那麼高位部分被丟掉, 並設定cf=of=1; 如果沒有溢位, 則cf-of=0。 後一種形式採用了3個運算元, 其中乙個乘數用立即數表達。

由於存放積的目的運算元長度與乘數的長度相同, 而有符號數和無符號數的乘積的低位部

分是相同的, 所以 , 這種新形式的乘法指令對有符號數和無符號數的處理是相同的。

除法指令給出源運算元 reg/mem (暫存器或儲存單元), 隱含使用目的運算元, 如表2

所示。

與乘法指令類似, 除法 (division) 指令也隱含使用 eax (和 edx), 並且被除數的位數要

倍長於除數的位數。 除法指令也分成無符號除法指令 div 和有符號除法指令idiv。 有符號除法時, 餘數的符號與被除數的符號相同。 對同乙個二進位制編碼, 分別採用 div 和 idiv 指令後, 商和餘數也會不同。

例如,用div進行8位無符號除法運算:

mov ax,400h;ax=400h,作為無符號整數編碼,表示真值:1024 x2m0

mov bl,0b4h:bl=b4h,作為無符號整數編碼,表示真值:180

div bl:無符號除法:商al=05h,餘數:ah=7ch(真值:124)

;表示計算結果:5x180+124=1024

再如, 用idiv 進行8位有符號除法運算:

mov ax,400h;ax=400h,作為有符號整數補碼,表示真值:1024

mov bl,0b4h;bl=b4h,作為有符號整數補碼,表示真值:-76

idiv bl;有符號除法:商al=f3h(真值:-13),餘數:ah=24h(真值:36)

;表示計算結果:(-13)x(-76)+36=1024

除法指令使狀態標誌沒有定義, 但是卻可能產生除法溢位。 除數為0或者商超出了所能表達的範圍, 則發生除法溢位。 用div指令進行無符號數除法, 商所能表達的範圍是: 位元組量除時為0-255,字量除時為0~65535,雙字量除時為0-232-1。用idiv指令進行有符號數除法,

商所能表達的範圍是:位元組量除時為-128127,字量除時為-3276832767,雙字量除時

為-231~232 -1。 如果發生除法溢位,ia-32處理器將產生編號為0的內部中斷。實際應用中應該考慮這個問題, 作業系統通常只會提示錯誤。

除基本的二進位制加減乘除指令外,算術運算指令還包括十進位制 bcd碼運算以及與運算相關的符號擴充套件等指令。

零位擴充套件和符號擴充套件指令

ia-32處理器支援8,16和32位資料操作,大多數指令要求兩個運算元型別一致。但是,實際的資料型別不一定滿足要求。例如,32位與16位資料的加減運算,需要先將16位擴充套件為32位。 再如,32位除法需要將被除數擴充套件成64位。 不過, 位數擴充套件後資料大小不能因此改變。

對無符號資料,只要在前面加0就實現了位數擴充套件、大小不變,這就是零位擴充套件(zeroextension), 對應指令 movzx, 如表3, 例如, 8位無符號敷據80h (128) 零位擴充套件為位0080h(-128).

movzx指令下

nov al.82h;al=82h

movzx bx,al;al=82h,零位擴充套件:bx=0082h

movzx ebx,a1:al=82h,零位擴充套件:ebx=00000082h

對有符號資料, 需要進行符號擴充套件 (sign extension), 即用乙個運算元的符號位 (最高位)形成另乙個運算元, 對應指令movsx. 例如, 8位有符號資料64h(100) 為正數, 符號位為o, 符號擴充套件成16位是0064h(100)。 再如,16位有符號資料 ffooh( -256) 為負數, 符號位為1, 符號擴充套件成32位是ffffffooh (- -256). 特別典型的例子是真值-1, 位元組量補碼表達是ffh, 字量補碼表達是ffffh,雙字量補碼表達是ffffffffh.

movsx指令舉例如下:

mov al,82h;al=82h

movsx bx,al;al=82h,符號擴充套件:bx=ff82h

movsx ebx,al;al=82h,符號擴充套件:ebx=ffffff82h

零位擴充套件對應無符號數, 符號擴充套件對應有符號數, 它們使資料位數加長, 但資料大小井設有改變。 另外, 還可以使用符號擴充套件指令cbw、 cwd, cwde 和cdq, 它們的功能分別是將al符號擴充套件為ax、 ax符號擴充套件為dx和ax、 ax符號擴充套件為eax、 eax符號擴充套件為edx和 eax。 intel 8086 只支援 cbw 和 cwd 指令, 不支援包括 movzx 和 movsx 在內的其他擴充套件。

乘法 除法彙編指令總結

乘法指令的反彙編 a 5 imul eax,dword ptr a 5 當變數與不是 2的冪的數相乘時,三變數 a b mov eax,dword ptr a imul eax,dword ptr b 當兩個都是變數相乘時,兩變數 a 8 mov eax,dword ptr a 當變數與 2的冪相乘...

詳解組合語言中乘法指令 MUL IMUL

本文參考了馬維華老師的 微機原理與接 術 一書 指令格式 mul reg mem reg暫存器,mem儲存器 imul reg mem mul和imul指令分別用於實現無符號數的乘法和有符號數的乘法運算。都只有乙個源運算元,可以使暫存器或儲存器,而且目標運算元隱含規定在累加器中。1 mul指令 a ...

組合語言 彙編指令

功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...