汇编语言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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步