imul 汇编指令 - 一个操作数?

发布于 2024-09-25 00:58:38 字数 363 浏览 3 评论 0原文

我正在使用运行时调试器。

EAX:0000 0023 EDX:5555 5556

imul edx

EAX:aaaa aac2 EDX: 0000 000b

我完全困惑了,无法弄清楚这个乘法是如何工作的。这里发生了什么事?我注意到在一个类似的问题imul ebx ;结果是 EDX:EAX 但我不明白 EDX:EAX 表示法:/

I am using a run-time debugger.

EAX: 0000 0023
EDX: 5555 5556

imul edx

EAX: aaaa aac2
EDX: 0000 000b

I am utterly confused, and can't figure out how this multiply is working. What's happening here? I notice in a similar question here that imul ebx ; result in EDX:EAX I don't understand the EDX:EAX notation though :/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暖伴 2024-10-02 00:58:38

imul 的单操作数形式传递一个 32 位参数时,它实际上意味着 EAX * src,其中 EAX 和源操作数都是32 位寄存器或内存。

两个 32 位值的乘积不一定适合 32 位:完整的乘法结果最多可以占用 64 位。答案的高32位将写入EDX寄存器,低32位写入EAX寄存器;这用 EDX:EAX 表示法表示。

在使用 imul edx 的情况下,您将得到 EDX:EAX = EAX * EDX。显式源操作数可以成为隐式操作数之一,甚至可以将 EAX 平方为 EDX:EAX


如果您只需要结果的低 32 位,请使用 imul 的 2 操作数形式;它运行速度更快并且没有任何隐式操作数(因此您可以使用最方便的任何寄存器)。

imul ecx, esi 会按照您的预期执行 ecx *= esi 操作,而不会触及 EAXEDX。就像 C 中 unsigned x=...; x *= y; 结果的宽度与输入的宽度相同。

imul 也有直接形式:imul ecx, ebx, 1234 的作用是 ecx = ebx * 1234。许多汇编器将接受 imul ecx, 1234 作为 imul ecx, ecx, 1234 的简写。


这些 32x32 => 32 位形式的 imul 对于有符号或无符号都能正常工作;单操作数 mulimul 的结果仅在上半部分(在 EDX 中)不同,而不是下半部分 EAX输出。

请参阅 Intel 的 imul 指令参考手册条目

When the one-operand form of imul is passed a 32 bit argument, it effectively means EAX * src where both EAX and the source operand are 32-bit registers or memory.

The product of two 32 bit values doesn't necessarily fit in 32 bits: the full multiply result can take up to 64 bits. The high 32 bits of the answer will be written to the EDX register and the low 32 bits to the EAX register; this is represented with the EDX:EAX notation.

In your case with imul edx, you get EDX:EAX = EAX * EDX. It's fine for the explicit source operand to be one of the implicit operands, even EAX to square into EDX:EAX.


If you only want the low 32 bits of the result, use the 2-operand form of imul; it runs faster and doesn't have any implicit operands (so you can use whatever registers are most convenient).

imul ecx, esi does ecx *= esi like you'd expect, without touching EAX or EDX. It's like C where unsigned x=...; x *= y; has the same width for the result as the inputs.

imul also has an immediate form: imul ecx, ebx, 1234 does ecx = ebx * 1234. Many assemblers will accept imul ecx, 1234 as short-hand for imul ecx, ecx, 1234.


These 32x32 => 32-bit forms of imul work correctly for signed or unsigned; the results of one-operand mul and imul only differ in the upper half (in EDX), not the low-half EAX output.

See Intel's instruction reference manual entry for imul.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文