【发布时间】:2011-12-06 18:43:32
【问题描述】:
说我明白了
EDX = 0xA28
EAX = 0x0A280105
我运行这个 ASM 代码
IMUL EDX
据我了解,仅使用 EAX.. 如果指定了一个操作数
所以在 C 代码中应该是这样的
EAX *= EDX;
正确吗?
查看调试器后..我发现EDX 也被更改了。
0x0A280105 * 0xA28 = 0x67264A5AC8
在调试器中
EAX = 264A5AC8
EDX = 00000067
现在,如果您回答 0x67264A5AC8 并拆分第一个十六进制对,0x67 264A5AC8
您可以清楚地看到为什么 EDX 和 EAX 是这样的。
好的,所以发生了溢出......因为它无法将这么大的数字存储到 32 位中。所以它开始在 EDX 中使用额外的 8 位
但我的问题是我现在如何在 C 代码中执行此操作以获得相同的结果?
我猜会是这样的
EAX *= EDX;
EDX = 0xFFFFFFFF - EAX; //blah not good with math manipulation like this.
【问题讨论】:
-
该指令始终使用 EDX 来存储乘积,无论乘积值如何,结果是否可以无损失地表示为 32 位。
标签: c assembly x86 machine-code code-translation