对于我正在尝试编写的汇编模拟器,我需要将汇编代码转换为等效的工作代码。最好的代码只需要一两行即可完成,速度不是很重要。
据我理解,如果在C++中完成,MOVZX
与MOV
相同。
MOV
转换。
MOV ESI,DWORD PTR [ESP+8]
would be like
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 EAX,AL
这个正确吗?regs.d.eax = (signed char)(regs.h.al);
- SSpokeregs.d.eax
类型的隐式转换,因为那是实际的movsx
) - ughoavgfhwal
=unsigned char
尽管如此。已经全部应用,仍然不安全吗? - SSpokeal
是其他大小,你可能会遇到问题。 - ughoavgfhwunion _regs { struct { unsigned int eax, ebx, ecx, edx, esi, edi, ebp, esp; } d; struct { unsigned short ax, hax, bx, hbx, cx, hcx, dx, hdx, si, hsi, di, hdi, bp, hbp, sp, hsp; } x; struct { unsigned char al, ah, hax[2], bl, bh, hbx[2], cl, ch, hcx[2], dl, dh, hdx[2], rest[16]; } h; } regs;
- SSpoke