目标:有一个汇编源文件,它将汇编到x86(i386)和x86_64(amd64)?
这是否可行,例如使用YASM?
答案 0 :(得分:3)
根据定义,汇编语言在不同的CPU架构之间不可移植。
根据您使用的汇编程序,您可以做一些简化移植部分的事情,正如Alex所说,就像使用宏和条件汇编处理不同的寄存器或指令名称一样(不要认为这将使您的代码成为可能)比拥有两个不同的文件更具可读性,也更易于维护。)
但是在不同的体系结构上,您不能指望相同的代码可以正常运行。特别是32位和64位架构。
即使你成功拥有一个通用代码,它肯定也缺乏在不同架构中可用的优化。
最后,但并非最不重要的是,你也会遇到ABI问题。调用约定是不同的,甚至在x86(通常是CDECL - 在堆栈上传递的所有参数)和x86_64(系统V - 在寄存器上传递的第一个参数,然后在堆栈上)之间。
答案 1 :(得分:1)
如果使用条件组合,则可以。但是不要指望为x86编写一次所有代码并让它在x64上运行相同或者相反。使用%if and %ifdef
。
您还可以创建一些可以扩展到不同内容的宏。例如,某些RAXPTR
会扩展为EAX
或RAX
,具体取决于您正在编译的平台,您可以使用此RAXPTR
将EAX / RAX用作指针。同样,您可以为PARAM1/2/etc
约定中的前两个参数创建一些扩展到例程参数的宏ECX/RCX
,以及EDX/RDX
和fastcall
之类的内容{{1} }} 对于其余的。以这种方式使用宏可以帮助您编写大多数可移植的x86 / x64汇编代码,但是,如果没有%if和%ifdef这样的话,你就无法做到这一点。