想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
2年前关闭。
我需要为C ++项目上的一些混淆练习编写一些(可以安全使用的)随机垃圾汇编代码。
到目前为止,我只能找到以下内容:
#define JUNKCODE \
__asm{push eax} \
__asm{xor eax, eax} \
__asm{setpo al} \
__asm{push edx} \
__asm{xor edx, eax} \
__asm{sal edx, 2} \
__asm{xchg eax, edx} \
__asm{pop edx} \
__asm{or eax, ecx} \
__asm{pop eax}
对于64位项目,似乎无法在Xcode上编译
如何创建可以安全添加到我的项目中的多个版本的垃圾程序汇编代码,并且它们是32-64位兼容且跨平台的(Windows VS2013和Mac Xcode8)?
最佳答案
要编写将以两种方式汇编的asm,请使用32位操作数大小,并避免使用push
/ pop
:对于x86-64,它们不支持32位操作数大小。仅该模式的全角寄存器大小和16位可用于推入/弹出。 (即机器代码中的the 0x66
operand-size prefix works, but REX.W=0
doesn't,因此push eax
在64位模式下无法编码。)
如果希望相同的机器代码在两种模式下都可以工作,则也请避免使用inc
/ dec
(32位模式下的短编码成为64位模式下的REX前缀)。如果只需要汇编的asm源,则inc / dec很好。
对于C ++中的嵌入式asm:
避免修改任何内存或进行任何函数调用。很难安全地执行此操作,因此,如果您只需要垃圾代码,则可以使用寄存器。对于System V ABI,您甚至无法安全地在x86-64代码中使用push
,因为编译器可能正在使用堆栈and there's no way to tell it you want to clobber it下方的红色区域。我不知道这是否适用于使用MSVC内联-asm语法而不是必须明确声明Clobbers的GNU语法的Clang。
最好使用GNU C内联asm语法(具有适当的约束条件,以告诉编译器您使用了什么寄存器)。
MSVC本身在64位模式下不支持任何嵌入式asm语法。
Xcode(clang)确实支持MSVC语法以及GNU语法,并且即使在64位模式下,它也可能支持MSVC语法。
MSVC样式的嵌入式asm语法基本上可以包装短代码段(输入必须通过内存反弹,因为在寄存器中没有要求输入的语法)和reportedly has been unreliable from version to version in MS's compiler。 MS可能正在寻找删除它的原因或方法,并且不支持x86-64是有意义的。如果它们保持不变,则从内联asm访问函数args的情况将更加糟糕,因为它们没有在内存中启动。无论如何,MSVC内联asm语法已经死了一半,很好。
无论如何,如果您确实希望在32位MSVC中具有一些内联汇编,请确保使用该语法。 __asm __emit
可能在64位MSVC I think IACA headers use that中执行某些操作,因此,如果您只是想让代码看起来很怪异,则可以手动编码一些NOP。
关于c++ - 如何编写跨平台(32位和64位)垃圾程序集代码? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47861218/