2016-12-01 43 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支持。 –