2016-12-01 10 views
-1

最近、浮動小数点演算について学び、宿題としていくつかの質問がありました。
それらの一つは次のとおりです。Nasmでの浮動小数点の呼び出し規約

「単精度浮動小数点数の呼び出し規約を書き留め!」。

だから私は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タグwiki](http://stackoverflow.com/tags/x86/info)の規約/ ABI docリンクを呼び出してください。ああ、リンクされた質問に対する私の答えは、すでにJesterがリンクしているものを見るためにチェックしていなかった:P –

+1

* "the" *呼び出し規約のようなものがあると仮定しているので、存在しない。尋問者は、彼らが参照していた*呼び出し規約についてより具体的であったはずです。それぞれに異なるルールがあります。参照されている呼び出し規約を知ったら、簡単に参照できます。 –

答えて

1

私がよく知っているすべての呼び出し規約は、floatと同じです。doubleと同じです。 (すべての呼び出し規約が同じものを扱っているわけではなく、ただ一つの呼び出し規約の中ではdiffはありません)。

一部はスタックを通過し、x87 st(0)に戻ります。

XMMレジスタにはいくつかのパス/リターンがあります。 (関連する事実:SysV呼び出し規約には、呼び出し保存されたXMMレジスタがないので、関数呼び出しはすべてレジスタに存在するすべてのFP値を流出させることを意味する)タグwikiのABIドキュメントへのリンクを参照してください。


呼び出しスタック上のメモリにdouble Sを通過した32ビットの呼び出し規約では、彼らは、整数/ポインタ/ float sの2倍のスペースを取ることに注意してください。したがって、doubleは2つのスタックスロットを占有します。

また、パディングにつながる8B整列の要件があります。 8B整列要件(例えば、alignas(8)メンバーの構造体)を持つ他の8Bオブジェクトも同じように扱われると私は思う。

+1

floatとdoubleの扱いが違うと思う唯一のケースは、SSE(32ビット浮動小数点数をサポートする)用のレジスタベースの呼び出し規約があったとしても、64ビット版の場合はx87スタックにフォールバックしなければならない場合です。ビットダブルス。しかし、私はそのようなレジスタベースの呼び出し規約が存在するとは思わない。 __vectorcallにはSSE2のサポートが必要です。 –

関連する問題