繁体   English   中英

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

[英]Assembly Converting MOV / MOVZX and MOVSX to C code (no inline asm)

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

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

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

找到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位,依此类推。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM