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

时间:2011-10-13 08:41:15

标签: c assembly x86 machine-code code-translation

说我得到了

EDX = 0xA28

EAX = 0x0A280105

我运行此ASM代码

IMUL EDX

我理解的只使用EAX ..如果指定了一个oprand

所以在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.

1 个答案:

答案 0 :(得分:1)

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