2016-09-06 22 views
0

阅读有关汇编的内容,部分是关于汇编中调用例程的约定(特别是Linux)。如何在汇编中传递超过8个浮点值的printf

据说第一8浮点参数通过xmm0通过 - xmm15和其他参数在寄存器rdirsirdxrcxr8r9,和其它剩余参数应被推动以相反的顺序堆叠。

如果我有超过8个浮点参数和超过6个其他参数,按什么顺序推动它们堆栈会怎么样?第一个浮点值不适合8 fp。寄存器或其他参数不适合6个寄存器?

回答

2

ABI doc的哪些部分不清楚(https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI)?

你在问,如果int和fp args混合在一起,并且用尽了两种arg传递寄存器会发生什么?

IIRC,他们只是按照相反的顺序进入堆栈,最后一个参数位于最高地址处,而第一个非寄存器arg位于返回地址之上。这就像在32位代码中一样,args始终在栈中传递。

另请参阅http://wiki.osdev.org/System_V_ABI标记wiki。

+0

是否为授权草案,是否可以用作参考?在标题页上,有几个名字是我写的,我从来没有听说过。 –

+0

@BulatM。是的,该页面链接到标准文档的官方最新版本。例如“* x86-64 psABI修订版252可以从[这里]下载(https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-r252.pdf)*”。不幸的是,文档并不总是完全记录编译器依赖的所有内容,但它所说的所有内容都是准确的。我知道的唯一例外是[零/符号扩展窄整数参数为32位](http://stackoverflow.com/questions/36706721/is-a-sign-or-zero-extension-required-when-adding -a-32位偏移到一个指针换/ 36760539#36760539)。 –

+0

ABI文档的副本曾经发布在http://www.x86-64.org/documentation.html上,但x86-64.org已经死了几个星期了。 –