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

汇编如何将IMUL操作码(只有一个oprand)转换为C代码,c,assembly,x86,machine-code,code-translation,C,Assembly,X86,Machine Code,Code Translation,说我有 EDX=0xA28 EAX=0x0A280105 我运行这个ASM代码 IMUL EDX 据我所知,它只使用EAX。。如果指定了一个oprand 所以在C代码中应该是这样的 EAX *= EDX; EDX = 0xFFFFFFFF - EAX; //blah not good with math manipulation like this. EAX*=EDX 对吗 在调试器中查找后。。我发现EDX也被修改了 0x0A280105*0xA28=0x67264A5AC8 在调试器中 EA

说我有

EDX=0xA28

EAX=0x0A280105

我运行这个ASM代码

IMUL EDX

据我所知,它只使用EAX。。如果指定了一个oprand

所以在C代码中应该是这样的

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

对吗

在调试器中查找后。。我发现EDX也被修改了

0x0A280105*0xA28=0x67264A5AC8

在调试器中

EAX=264A5AC8
EDX=00000067

现在,如果您获取答案并分离第一个十六进制对,
0x67 264A5AC8
您可以清楚地看到为什么
EDX
EAX
是这样

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

但我的问题是,我现在如何在C代码中这样做才能得到相同的结果

我猜会是这样

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

IMUL指令实际生成的结果是操作数大小的两倍(除非使用可以指定目标的较新版本)。因此:

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

long result = (long) eax * (long) edx;
eax = result & 0xffffffff;
edx = result >> 32;
这假设一个长的值是64位。如果编译器没有64位数据类型,那么计算结果会变得更加困难,需要执行长乘法


您可以始终内联imul指令。

无法内联imul指令,我正在尝试将ASM模拟为C代码。。那么寄存器将生成我。。
调用EAX的
这是我构建此工具以获取所有运行时调用的唯一原因,而无需实际运行程序。此指令始终使用EDX存储产品,无论产品值如何,无论结果是否可以在32位中无损失地表示。