1

私の知る限り、x64コードMicrosoft x64には と の 2 つの呼び出し規則が考えられAMD64ます。

これでgcc、パラメーターを使用して起動できますが、呼び出し規約-mregparm=0を使用している場合は機能しません。これは、規約で最初の 6 つの変数にレジスタを使用することが義務付けられているために発生します(これが行われる理由はよくわかりませんが、セキュリティの問題がスタックする可能性があるため実装されていると思われます)。AMD64AMD64

それで、ここに質問があります:

規約の下で使用してコンパイルするときに、このようないくつかの厳密な規則(レジスタの使用を強制する)はありますか? はいの場合、互換性を壊さずにバイパスするにはどうすればよいですか?gccMicrosoft x64ABI

4

2 に答える 2

3

私は Microsoft Windows を知らない (そして使ったことがない) ので、おそらくあなたの質問に答えることはできません。

ただし、AMD64 Application Binary Interface の呼び出し規則 (Linux およびその他の Unix の場合) は、AMD64 ABI 仕様に記載されています (Microsoft の呼び出し規則に関する同等のドキュメントも見つけて読む必要があります)。セキュリティ上の考慮事項のためではなく、パフォーマンス上の考慮事項(レジスタを介して値を渡す方がスタックに値を渡すよりも速い)のために、最初の6つの引数にレジスタを使用していると思います。

また、使用する C++ コンパイラが何であれ、いくつかの呼び出し規則に従う必要があり、これらは実質的にシステムによって指示されます (コードからシステム ライブラリを呼び出せるようにする必要があるため)。したがって、それらを壊すと、ABI の互換性が失われます。

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

于 2011-10-26T13:07:42.497 に答える
3

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

関数呼び出し ABI の不一致が原因で、プログラムが Windows x64 で動作しない可能性があります。

必要なすべてのドキュメントについては、この MSDN リンクを参照してください。

于 2011-10-26T12:59:39.710 に答える