2011-10-26 22 views
1

私が知る限り、x64コードには2つの呼び出し規約があります - Microsoft x64AMD64です。GCC x64関数呼び出し

gcc-mregparm=0パラメータで起動できますが、これはAMD64呼び出し規約を使用している場合には機能しません。 これは、最初の6つの変数のレジスタの使用を、AMD64の規約で義務づけているためです(なぜこれが行われたのかは分かりませんが、セキュリティ上の問題がスタックになる可能性があるためです)。 gccMicrosoft x64下の規則を使用してコンパイルするとき

この(強制レジスタの使用)のようないくつかの厳格なルールがあります

だから、ここでの質問はありますか?そして、はいの場合、どのようにしてABIの互換性を破ることなくバイパスできますか?

答えて

3

を参照してください。

しかし、AMD64アプリケーションバイナリインターフェイスの呼び出し規則(Linuxおよびその他のUnix)は、AMD64 ABI specに記載されています(マイクロソフトの呼び出し規則については、同等の文書も検索してください)。私は、セキュリティ上の理由からではなく、パフォーマンスに関する考慮事項(レジスタを通る値の方がスタックを渡すよりも速いことを前提としている)のために、最初の6つの引数にレジスタを使用していると思います。

どのC++コンパイラを使用していても、いくつかの呼び出し規約に従うことが望ましく、これらは実際にはシステムによって指示されます(コードからシステムライブラリを呼び出せなければならないためです)。あなたがそれらを壊してしまうと、ABIとの互換性が失われます。

しかし、なぜこのような質問をしているのかわかりません。独自の呼び出し規約でコンパイラを開発していますか?はいの場合でも、Cライブラリを呼び出すための手段が必要です。このためには、外部Cライブラリを呼び出すために、それらを管理するABI規則に従う必要があります。 Ocamlコンパイラの例を見てください。

+0

*好奇心旺盛です。私は 'x64'プラットフォームの最適化研究を行ってきましたが、呼び出し規約との誤解を解決したいと思っていました。 –

3

私はABIを壊すことなくこれらをバイパスすることはできません。関数呼び出しとそれがレジスタなどに及ぼす影響は、プラットフォームABIの基本的な部分です。

プログラムがWindows x64で機能しない可能性があります。これは、関数呼び出しが一致しないためです。あなたが望むことができるすべてのドキュメントについては

、私は、Microsoft Windows(および決してそれを使用)を知らないので、私はおそらくそれについてのご質問にお答えすることはできませんthis MSDN link

+0

私はあなたが正しいと思います。しかし、*(私には分かります)* - 'MS64 convention'には、レジスタの強制使用(AMD64と同じ)に関するルールはありますか?あるいは 'MS64'ではスタックとレジスタの間で自由に選択できますか? –

関連する問題