繁体   English   中英

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

[英]Assembly How to translate IMUL opcode (with only one oprand) to C code

说我有

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.

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指令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM