0

目标:有一个汇编源文件,可以同时汇编到 x86 (i386) 和 x86_64 (amd64)?

这可能吗,例如YASM

4

2 回答 2

3

根据定义,汇编语言不能在不同的 CPU 架构之间移植。

正如 Alex 所说,根据您使用的汇编器,您可以做一些可以简化移植部分的事情,例如使用宏和条件汇编处理不同的寄存器或指令名称(不要认为这会使您的代码更具可读性,也不比拥有两个不同的文件更易于维护)。

但是在不同的架构上,你不能指望相同的代码运行良好。尤其是 32 位和 64 位架构。

即使你成功地拥有了一个通用代码,它也肯定缺乏不同架构中可用的优化。

最后但并非最不重要的一点是,您还会遇到 ABI 问题。调用约定是不同的,即使在 x86(通常是 CDECL - 所有参数在堆栈上传递)和 x86_64(系统 V - 第一个参数在寄存器上传递,然后在堆栈上)之间也是如此。

于 2011-11-23T23:43:50.230 回答
1

如果你使用条件汇编,你可以。但是不要期望为 x86 编写一次所有代码,并让它在 x64 上或以其他方式工作。使用%if and %ifdef.

您还可以创建一些可以扩展到不同事物的宏。例如,有些RAXPTR会扩展到EAXRAX取决于您正在编译的平台,您可以RAXPTR在 EAX/RAX 用作指针的地方使用它。同样,您可以创建一些宏PARAM1/2/etc,这些宏将扩展到例程参数,例如ECX/RCX和,用于约定EDX/RDX中的前两个参数以及其余参数。以这种方式使用宏可以帮助您编写大多数可移植的 x86/x64 汇编代码,但是,如果没有 %if 和 %ifdef 之类的东西,您仍然无法做到这一点。fastcall[EBP+some constant]/[RBP+some constant]

于 2011-11-23T23:35:26.400 回答