Welcome to my wo|

0x4b

园龄:6年5个月粉丝:1关注:2

汇编语言IMUL指令:有符号数乘法

原文链接:http://c.biancheng.net/view/3603.html,仅作记录,侵权必删!!!

单操作数格式

单操作数格式将乘积存放在 AX、DX:AX 或 EDX:EAX 中:

IMUL reg/mem8    ; AX = AL * reg/mem8
IMUL reg/meml6    ; DX:AX = AX * reg/meml6
IMUL reg/mem32    ; EDX:EAX = EAX * reg/mem32

双操作数格式(32位模式)

32 位模式中的双操作数 IMUL 指令把乘积存放在第一个操作数中,这个操作数必须是寄存器。第二个操作数(乘数)可以是寄存器、内存操作数和立 即数。16位格式如下所示:

IMUL regl6, reg/meml6
IMUL regl6, imm8
IMUL regl6, imml6

32 位操作数类型如下所示,乘数可以是 32 位寄存器、32 位内存操作数或立即数(8 位 或 32 位):

IMUL reg32, reg/mem32
IMUL reg32, inun8
IMUL reg32, imm32

三操作数格式

32 位模式下的三操作数格式将乘积保存在第一个操作数中。第二个操作数可以是 16 位寄存器或内存操作数,它与第三个操作数相乘,该操作数是一个8位或16 位立即数:

IMUL regl6, reg/meml6,imm8
IMUL regl6, reg/meml6, iirrnl6

而 32 位寄存器或内存操作数可以与 8 位或 32 位立即数相乘:

IMUL reg32, reg/mem32, imm8
IMUL reg32, reg/mem32, imm32

在 64 位模式下执行 IMUL

在 64 位模式下,IMUL 指令可以使用 64 位操作数。在单操作数格式中,64 位寄存器或内存操作数与 RAX 相乘,产生一个 128 位且符号扩展的乘积存放到 RDX:RAX 寄存器中。在下面的例子中,RBX 与 RAX 相乘,产生 128 位的乘积 -16。

mov rax, -4
mov rbx, 4
imul rbx          ; RDX = 0FFFFFFFFFFFFFFFFh, RAX = -16

也就是说,十进制数 -16 在 RAX 中表示为十六进制 FFFF FFFF FFF0,而 RDX 只包含 TRAX 的高位扩展,即它的符号位。
三操作数格式也可以用于 64 位模式。如下例所示,被乘数 (-16) 乘以 4,生成 RAX 中的乘积 -64:

.data
multiplicand QWORD -16
.code
imul rax, multiplicand, 4       ; RAX = FFFFFFFFFFFFFFC0 (-64)

无符号乘法

由于有符号数和无符号数乘积的低半部分是相同的,因此双操作数和三操作数的 IMUL 指令也可以用于无符号乘法。但是这种做法也有一点不便的地方:进位标志位和溢出标志位将无法表示乘积的高半部分是否为零。

本文作者:Welcome to the world

本文链接:https://www.cnblogs.com/0x4b/p/17011724.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   0x4b  阅读(253)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起