汇编 如何将 IMUL 操作码(只有一个操作数)转换为 C 代码

发布于 2024-12-10 05:26:53 字数 784 浏览 0 评论 0原文

假设我得到了

EDX = 0xA28

EAX = 0x0A280105

我运行这个 ASM 代码

IMUL EDX

据我所知,它只使用 EAX ..如果一个操作数是那么

在 C 代码中它应该像

EAX *= EDX;

正确吗?

在查看调试器后..我发现EDX也被改变了。

0x0A280105 * 0xA28 = 0x67264A5AC8

调试器中的

EAX = 264A5AC8 EDX = 00000067

现在,如果您获取答案 0x67264A5AC8 并拆分第一个十六进制对,0x67 264A5AC8 您可以清楚地明白为什么 EDXEAX 是这样的。

好吧,所以发生了溢出..因为它无法将这么大的数字存储到 32 位中。所以它开始在 EDX 中使用额外的 8 位

但我的问题是我现在如何在 C 代码中执行此操作以获得相同的结果?

我猜会是这样

EAX *= EDX;
EDX = 0xFFFFFFFF - EAX; //blah not good with math manipulation like this.

Say I got

EDX = 0xA28

EAX = 0x0A280105

I run this ASM code

IMUL EDX

which to my understand only uses EAX.. if one oprand is specified

So in C code it should be like

EAX *= EDX;

correct?

After looking in debugger.. I found out EDX got altered too.

0x0A280105 * 0xA28 = 0x67264A5AC8

in debugger

EAX = 264A5AC8
EDX = 00000067

now if you take the answer 0x67264A5AC8 and split off first hex pair, 0x67 264A5AC8
you can clearly see why the EDX and EAX are the way they are.

Okay so a overflow happens.. as it cannot store such a huge number into 32 bits. so it starts using extra 8 bits in EDX

But my question is how would I do this in C code now to get same results?

I'm guessing it would be like

EAX *= EDX;
EDX = 0xFFFFFFFF - EAX; //blah not good with math manipulation like this.

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

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

发布评论

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

评论(1

再可℃爱ぅ一点好了 2024-12-17 05:26:53

IMUL 指令实际上产生的结果是操作数大小的两倍(除非您使用可以指定目标的较新版本之一)。所以:

imul 8bit -> result = ax, 16bits
imul 16bit -> result = dx:ax, 32bits
imul 32bit -> result = edx:eax, 64bits

在 C 中执行此操作将取决于编译器,但有些编译器可以执行此操作:

long result = (long) eax * (long) edx;
eax = result & 0xffffffff;
edx = result >> 32;

这里假设 long 是 64 位。如果编译器没有 64 位数据类型,那么计算结果会变得更加困难,您需要进行长乘法。

您始终可以内联 imul 指令。

The IMUL instruction actually produces a result twice the size of the operand (unless you use one of the newer versions that can specify a destination). So:

imul 8bit -> result = ax, 16bits
imul 16bit -> result = dx:ax, 32bits
imul 32bit -> result = edx:eax, 64bits

To do this in C will be dependent on the compiler, but some will work doing this:

long result = (long) eax * (long) edx;
eax = result & 0xffffffff;
edx = result >> 32;

This assumes a long is 64 bits. If the compiler has no 64 bit data type then calculating the result becomes much harder, you need to do long multiplication.

You could always inline the imul instruction.

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