对于 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 代码时遇到了麻烦.. 似乎与上面的两个相同.. 除了它试图在值(value)尽可能移动..喜欢
000000C7
变为 FFFFFFC7
最佳答案
movsx
是带有符号扩展的移动。这些设置位是原始值的符号位的副本,如果原始值不是负值,它们将被清除。它的工作方式与您的其他转换一样,只是您需要使用有符号类型而不是无符号类型。
regs.d.eax = *(signed char *)(regs.d.edi); // movsx eax, byte ptr ds:[edi]
关于c - 汇编将 MOV/MOVZX 和 MOVSX 转换为 C 代码(无内联汇编),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7762214/