Assembly 为什么汇编不可移植

Assembly 为什么汇编不可移植,assembly,Assembly,我读过一些文章,所以说集会是不可移植的。 但当我看到Rob Pike的Go汇编器演讲时,他提到Go汇编器生成半伪代码,而obj工具将动态生成特定于平台的机器代码。 因为大多数指令集是相似的,所以只需要处理指令名或边缘大小写。 那么,还有其他项目试图使通用汇编指令具有可移植性吗? 为什么没有其他项目这样做?如果它是某种中间语言,如LLVM-IR或LLVM字节码,那么它就不再是实际的汇编语言了。或者,如果您的意思是仅针对x86-64,那么它就不能移植到AArch64。或者,如果您试图使用功能的最小公

我读过一些文章,所以说集会是不可移植的。 但当我看到Rob Pike的Go汇编器演讲时,他提到Go汇编器生成半伪代码,而obj工具将动态生成特定于平台的机器代码。 因为大多数指令集是相似的,所以只需要处理指令名或边缘大小写。 那么,还有其他项目试图使通用汇编指令具有可移植性吗?
为什么没有其他项目这样做?

如果它是某种中间语言,如LLVM-IR或LLVM字节码,那么它就不再是实际的汇编语言了。或者,如果您的意思是仅针对x86-64,那么它就不能移植到AArch64。或者,如果您试图使用功能的最小公共子集,则会损害优化。不可移植的不仅仅是asm语法;不同的平台在同一ISA上使用不同的调用约定。至少在C生态系统中:Go使用它自己的调用约定,上一次我听说它总是使用堆栈参数,即使在x86-64上,两种标准调用约定都在寄存器中传递参数。当然,系统调用ABI是不可移植的。正在为NASM输出请求一个链接器,但正如注释所解释的,实际问题是代码使用的是32位Linux int 0x80系统调用接口,因此如果在本机Windows可执行文件中运行该机器代码,它将崩溃。这不是你可以用可移植层解决的问题。@phuclv:哦,是的,听起来很熟悉。我已经忘记了细节,但是的,除了使用Plan9的asm语法外,他们还选择了其效率较低的调用约定@鄭元傑: 因为Go assembly只选择通用的ISA部件来统一它们-不。我正在观看Rob Pike的演讲,你链接了它,在12:30,他展示了一个简单的add函数的GOARCH不同设置的编译器输出示例。请注意,对于每个ISA,它都是不同的。但总体语法是相同的,因此编译器中的代码生成器和汇编程序中的解析器可以共享代码。e、 g.与使用ldr等ARM助记符不同,它使用x86 dword=4字节的概念调用指令movd mov dword。这就是他所说的可移植语法,而不是实际指令可以完全相同且可移植。在任何地方使用相同的蹩脚呼叫约定是一个最低的共同点选择,但他们似乎没有做比这更疯狂的事情。e、 g.他们仍然可以在拥有64位寄存器的ISA上使用64位寄存器,在32位x86以外的ISA上使用8个以上的寄存器。有了足够的内联,缓慢的调用约定并不像实践中所显示的那样是一场灾难,但没有有效地使用寄存器将是更大的减速。