装配将MOV / MOVZX和MOVSX转换为C代码(无内联asm)

时间:2011-10-14 01:28:19

标签: c assembly x86 transformation code-translation

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

从我的理解。 MOVZX将与MOV相同..如果在C ++中完成。

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

2 个答案:

答案 0 :(得分:4)

movsx随着sign-extend移动。这些设置位是来自原始值的符号位的副本,如果原始值不是负数则将清楚。它的工作方式与其他转换类似,但您需要使用签名类型而不是无符号类型。

regs.d.eax = *(signed char *)(regs.d.edi); // movsx eax, byte ptr ds:[edi]

答案 1 :(得分:0)

找到MOVSX和MOVXZ的非常快的C等价物的最快方法是从具有较低位的类型到具有较高位的类型的整数变量赋值。两个变量都必须进行类型转换为有符号类型(对于MOVSX)或无符号类型(MOVZX)。

例如,相当于“movzx ebx,al”的C将是:

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

相当于“movsx ebx,al”的C将是:

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

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