2016-12-01 38 views
-1

所以最近我们了解了浮点运算,并在作业中得到了一些问题。
其中之一是:在纳斯姆召集浮游运动会

“写下单精度浮标的调用惯例!”。

所以我知道的xmm寄存器和知道,在双精度的第一输入进入xmm0等。
我在Google上查找了这个主题,但找不到答案。如果有人能够帮助我解决这个问题,那会很好。

+2

'nasm'是一个汇编程序,它没有定义调用约定。这是由相关的ABI为您的环境定义的,您没有说。对于linux和mac,请查看[SysV文档](http://stackoverflow.com/questions/18133812/where-is-the-x86-64-abi-documented),以查看[msdn](https: //msdn.microsoft.com/en-us/library/zthk2dkh.aspx)。 – Jester

+0

[x86 tag wiki](http://stackoverflow.com/tags/x86/info)中的调用约定/ ABI文档链接。哦,这就是我在关联问题上的回答已经说过......没有检查过什么Jester链接:P –

+1

这个问题被打破,因为它假设有*“the”*调用约定这样的事情。那没有。提问者应该更具体地了解他们所指的哪个*调用约定。他们每个人都有不同的规则。一旦你知道被引用的调用约定,你可以很容易地查找它。 –

回答

1

我熟悉的每个调用约定都会处理单个float,它与double相同。 (并不是所有的调用约定都处理它们,只是在一个调用约定中没有差异)。

一些通过堆栈并返回x87 st(0)。

XMM寄存器中的一些通过/返回。 (相关事实:SysV调用约定没有调用保存的XMM寄存器,因此任何函数调用都意味着溢出寄存器中的所有FP值。)

请参阅标记wiki中的ABI文档的链接。


注意,在32位调用,在调用堆栈内存通过double小号约定,他们花费两倍的空间作为整数/指针/ float秒。所以double占用两个堆栈插槽。

它也可能具有导致填充的8B对齐要求。但是,它们仍然不是“特殊的”,因为如此:任何其他具有8B对齐要求的8B对象(例如,具有alignas(8)成员的结构)将被视为相同,我认为。

+1

我唯一能想到float和double可以区别对待的情况是,如果你有一个基于寄存器的SSE调用约定(它只支持32位浮点数),但必须回退到64位的x87堆栈,位双打。但我不认为这种基于寄存器的调用约定存在。 __vectorcall需要SSE2支持。 –