目标:有一个汇编源文件,可以同时汇编到 x86 (i386) 和 x86_64 (amd64)?
这可能吗,例如YASM?
根据定义,汇编语言不能在不同的 CPU 架构之间移植。
正如 Alex 所说,根据您使用的汇编器,您可以做一些可以简化移植部分的事情,例如使用宏和条件汇编处理不同的寄存器或指令名称(不要认为这会使您的代码更具可读性,也不比拥有两个不同的文件更易于维护)。
但是在不同的架构上,你不能指望相同的代码运行良好。尤其是 32 位和 64 位架构。
即使你成功地拥有了一个通用代码,它也肯定缺乏不同架构中可用的优化。
最后但并非最不重要的一点是,您还会遇到 ABI 问题。调用约定是不同的,即使在 x86(通常是 CDECL - 所有参数在堆栈上传递)和 x86_64(系统 V - 第一个参数在寄存器上传递,然后在堆栈上)之间也是如此。
如果你使用条件汇编,你可以。但是不要期望为 x86 编写一次所有代码,并让它在 x64 上或以其他方式工作。使用%if and %ifdef
.
您还可以创建一些可以扩展到不同事物的宏。例如,有些RAXPTR
会扩展到EAX
或RAX
取决于您正在编译的平台,您可以RAXPTR
在 EAX/RAX 用作指针的地方使用它。同样,您可以创建一些宏PARAM1/2/etc
,这些宏将扩展到例程参数,例如ECX/RCX
和,用于约定EDX/RDX
中的前两个参数以及其余参数。以这种方式使用宏可以帮助您编写大多数可移植的 x86/x64 汇编代码,但是,如果没有 %if 和 %ifdef 之类的东西,您仍然无法做到这一点。fastcall
[EBP+some constant]/[RBP+some constant]