匯編語言MUL指令無符號數(shù)乘法的使用
32 位模式下,MUL(無符號數(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ù)的大小,列出了默認的被乘數(shù)和乘積。由于目的操作數(shù)是被乘數(shù)和乘數(shù)大小的兩倍,因此不會發(fā)生溢岀。
| 被乘數(shù) | 乘數(shù) | 乘積 |
|---|---|---|
| AL | reg/mem8 | AX |
| AX | reg/mem16 | DX:AX |
| EAX | reg/mem32 | EDX:EAX |
如果乘積的高半部分不為零,則 MUL 會把進位標志位和溢出標志位置 1。因為進位標志位常常用于無符號數(shù)的算術(shù)運算,在此我們也主要說明這種情況。例如,當 AX 乘以一個 16 位操作數(shù)時,乘積存放在 DX 和 AX 寄存器對中。其中,乘積的高 16 位存放在 DX,低 16 位存放在 AX。如果 DX 不等于零,則進位標志位置 1,這就意味著隱含的目的操作數(shù)的低半部分容納不了整個乘積。
有個很好的理由要求在執(zhí)行 MUL 后檢查進位標志位,即,確認忽略乘積的高半部分是否安全。
MUL 示例
下述語句實現(xiàn) AL 乘以 BL,乘積存放在 AX 中。由于 AH(乘積的高半部分)等于零,因此進位標志位被清除(CF=0):
mov al, 5h mov bl, 10h mul bl ; AX = 0050h, CF = 0
下圖展示了寄存器內(nèi)容的變化:

下述語句實現(xiàn) 16 位值 2000h 乘以 0100h。由于乘積的高半部分(存放于 DX)不等于零,因此進位標志位被置 1:
.data val1 WORD 2000h val2 WORD 0l00h .code mov ax, val1 ; AX = 2000h mul val2 ; DX:AX = 00200000h, CF = 1

下述語句實現(xiàn) 12345h 乘以 1000h,產(chǎn)生的 64 位乘積存放在 EDX 和 EAX 寄存器對中。EDX 中存放的乘積高半部分為零,因此進位標志位被清除:
mov eax, 12345h mov ebx, 1000h mul ebx ; EDX:EAX = 0000000012345000h, CF = 0
下圖展示了寄存器內(nèi)容的變化:

在 64 位模式下使用 MUL
64 位模式下,MUL 指令可以使用 64 位操作數(shù)。一個 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 乘以一個 64 位內(nèi)存操作數(shù)。該寄存器的值乘以 16,因此,其中的每個十六進制數(shù)字都左移一位(一次移動 4 個二進制位就相當于乘以 16)。
.data multiplier QWORD 10h .code mov rax, OAABBBBCCCCDDDDh mul multiplier ; RDX:RAX = 00000000000000000AABBBBCCCCDDDDOh
到此這篇關(guān)于匯編語言MUL指令無符號數(shù)乘法的使用的文章就介紹到這了,更多相關(guān)匯編語言MUL指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

