汇编 如何将 IMUL 操作码(只有一个操作数)转换为 C 代码
假设我得到了
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.
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
IMUL 指令实际上产生的结果是操作数大小的两倍(除非您使用可以指定目标的较新版本之一)。所以:
在 C 中执行此操作将取决于编译器,但有些编译器可以执行此操作:
这里假设 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:
To do this in C will be dependent on the compiler, but some will work doing this:
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.