溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在匯編語言中使用MUL指令無符號(hào)數(shù)乘法

發(fā)布時(shí)間:2021-02-04 15:08:11 來源:億速云 閱讀:355 作者:Leah 欄目:開發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何在匯編語言中使用MUL指令無符號(hào)數(shù)乘法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

32 位模式下,MUL(無符號(hào)數(shù)乘法)指令有三種類型:

  • 第一種執(zhí)行 8 位操作數(shù)與 AL 寄存器的乘法;

  • 第二種執(zhí)行 16 位操作數(shù)與 AX 寄存器的乘法;

  • 第三種執(zhí)行 32 位操作數(shù)與 EAX 寄存器的乘法。

乘數(shù)和被乘數(shù)的大小必須保持一致,乘積的大小則是它們的一倍。這三種類型都可以使用寄存器和內(nèi)存操作數(shù),但不能使用立即數(shù):

MUL reg/mem8
MUL reg/meml6
MUL reg/mem32

MUL 指令中的單操作數(shù)是乘數(shù)。下表按照乘數(shù)的大小,列出了默認(rèn)的被乘數(shù)和乘積。由于目的操作數(shù)是被乘數(shù)和乘數(shù)大小的兩倍,因此不會(huì)發(fā)生溢岀。

被乘數(shù)乘數(shù)乘積
ALreg/mem8AX
AXreg/mem16DX:AX
EAXreg/mem32EDX:EAX

如果乘積的高半部分不為零,則 MUL 會(huì)把進(jìn)位標(biāo)志位和溢出標(biāo)志位置 1。因?yàn)檫M(jìn)位標(biāo)志位常常用于無符號(hào)數(shù)的算術(shù)運(yùn)算,在此我們也主要說明這種情況。例如,當(dāng) AX 乘以一個(gè) 16 位操作數(shù)時(shí),乘積存放在 DX 和 AX 寄存器對(duì)中。其中,乘積的高 16 位存放在 DX,低 16 位存放在 AX。如果 DX 不等于零,則進(jìn)位標(biāo)志位置 1,這就意味著隱含的目的操作數(shù)的低半部分容納不了整個(gè)乘積。

有個(gè)很好的理由要求在執(zhí)行 MUL 后檢查進(jìn)位標(biāo)志位,即,確認(rèn)忽略乘積的高半部分是否安全。

MUL 示例

下述語句實(shí)現(xiàn) AL 乘以 BL,乘積存放在 AX 中。由于 AH(乘積的高半部分)等于零,因此進(jìn)位標(biāo)志位被清除(CF=0):

mov al, 5h
mov bl, 10h
mul bl          ; AX = 0050h, CF = 0

下圖展示了寄存器內(nèi)容的變化:

如何在匯編語言中使用MUL指令無符號(hào)數(shù)乘法

下述語句實(shí)現(xiàn) 16 位值 2000h 乘以 0100h。由于乘積的高半部分(存放于 DX)不等于零,因此進(jìn)位標(biāo)志位被置 1:

.data
val1 WORD 2000h
val2 WORD 0l00h
.code
mov ax, val1      ; AX = 2000h
mul val2        ; DX:AX = 00200000h, CF = 1

如何在匯編語言中使用MUL指令無符號(hào)數(shù)乘法

下述語句實(shí)現(xiàn) 12345h 乘以 1000h,產(chǎn)生的 64 位乘積存放在 EDX 和 EAX 寄存器對(duì)中。EDX 中存放的乘積高半部分為零,因此進(jìn)位標(biāo)志位被清除:

mov eax, 12345h
mov ebx, 1000h
mul ebx          ; EDX:EAX = 0000000012345000h, CF = 0

下圖展示了寄存器內(nèi)容的變化:

如何在匯編語言中使用MUL指令無符號(hào)數(shù)乘法

在 64 位模式下使用 MUL

64 位模式下,MUL 指令可以使用 64 位操作數(shù)。一個(gè) 64 位寄存器或內(nèi)存操作數(shù)與 RAX 相乘,產(chǎn)生的 128 位乘積存放到 RDX:RAX 寄存器中。下例中,RAX 乘以 2,就是將 RAX 中的每一位都左移一位。RAX 的最高位溢出到 RDX 寄存器,使得 RDX 的值為 0000 0000 0000 0001h:

mov rax, 0FFFF0000FFFF0000h
mov rbx, 2
mul rbx           ; RDX:RAX = 0000000000000001FFFE0001FFFE0000

下面的例子中,RAX 乘以一個(gè) 64 位內(nèi)存操作數(shù)。該寄存器的值乘以 16,因此,其中的每個(gè)十六進(jìn)制數(shù)字都左移一位(一次移動(dòng) 4 個(gè)二進(jìn)制位就相當(dāng)于乘以 16)。

.data
multiplier QWORD 10h
.code
mov rax, OAABBBBCCCCDDDDh
mul multiplier    ; RDX:RAX = 00000000000000000AABBBBCCCCDDDDOh

上述就是小編為大家分享的如何在匯編語言中使用MUL指令無符號(hào)數(shù)乘法了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI