7

对于 asm 模拟器,我正在尝试编写将 ASM 代码转换为可以正常工作的等效工作代码。最好的代码是可以在一行或最多两到三行中完成的代码,不要关心速度。

据我了解。如果在 C++ 中完成,MOVZX 将与 MOV.. 相同。

MOV转换。

MOV ESI,DWORD PTR [ESP+8]

就像

regs.d.esi = *(unsigned int *)(regs.d.esp+0x00000008);

MOVZX转换。

MOVZX EAX,BYTE PTR DS:[EDI]

就像

regs.d.eax = *(unsigned char *)(regs.d.edi);

几乎相同的事情没有改变。

现在MOVSX我无法转换为简单的 C 代码.. 似乎与上述两个相同.. 除了它尝试在移动的值前面附加尽可能多的完全设置位.. 像

000000C7变成FFFFFFC7

4

2 回答 2

5

movsx是用符号扩展移动。这些设置位是原始值的符号位的副本,如果原始值不是负数,则将被清除。它就像您的其他转换一样工作,除了您需要使用有符号类型而不是无符号类型。

regs.d.eax = *(signed char *)(regs.d.edi); // movsx eax, byte ptr ds:[edi]
于 2011-10-14T01:32:36.590 回答
0

找到 MOVSX 和 MOVXZ 的非常快速的 C 等效项的最快方法只是将整数变量从具有较低位的类型分配到具有较高位的类型。两个变量都必须转换为有符号类型(对于 MOVSX)或无符号类型(MOVZX)。

例如,“movzx ebx, al”的 C 等效项是:

(unsigned int) ebx = (unsigned char) al;

C 等效于 "movsx ebx, al" 将是:

(signed int) ebx = (signed char) al;

只需确保您的 char 类型是 8 位,而您的 int 类型是 32 位,依此类推。

于 2017-05-11T09:05:31.233 回答