c - 汇编将 MOV/MOVZX 和 MOVSX 转换为 C 代码(无内联汇编)

标签 c assembly x86 transformation code-translation

对于 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/

相关文章:

c - strcat 不影响全局字符串

c - 对于外部指针声明,ARM 代码显然无法正常工作

assembly - 8086中段寄存器的值是多少?

c - 线程函数内部函数中的信号量值不一致

无法将字符串分配给 C 中的扑克牌程序的单个字符变量

c - 如何循环遍历 C 中没有索引的数组?

c - alá insight for windows

assembly - 带有地址或寄存器的表,汇编程序 x86

x86 - 有没有一种有效的方法来使用SIMD内部函数获取SIMD寄存器中的第一个非零元素?

compiler-construction - 如何为 Go 构建 8g 和 6g Go 编译器