3

学習目的で、アセンブリで単純なグラフィックベースのプログラムを作成しています。このために、OpenGL または SDL のいずれかを使用するつもりでした。アセンブリから OpenGL/SDL の関数を呼び出そうとしています。

問題は、インターネットで見つけた多くのアセンブリや OpenGL/SDL チュートリアルとは異なり、私のマシンの OpenGL/SDL は明らかに C 呼び出し規則を使用していないことです。私は C で簡単なプログラムを書き、アセンブリにコンパイルしました (-S スイッチを使用)。GCC によって生成されたアセンブリ コードは、スタックにプッシュされるのではなく、レジスタにパラメータを渡すことによって OpenGL/SDL 関数を呼び出すようです。

さて、問題は、これらの OpenGL/SDL 関数に引数を渡す方法をどのように決定するかということです。つまり、どの引数がどのレジスタに対応するかをどのように把握するのでしょうか?

明らかに、GCC は C コードをコンパイルして OpenGL/SDL を呼び出すことができるため、関数の引数とレジスタ間の対応を把握する方法が必要です。C 呼び出し規則では、ルールは簡単です。パラメーターを後方にプッシュし、eax/rax で値を返します。C のドキュメントを読むだけで、パラメーターを渡す方法を簡単に理解できます。しかし、これらはどうですか?

C 呼び出し規約を使用して OpenGL/SDL を呼び出す方法はありますか?

ところで、Gentoo Linux amd64 のリンカとして gcc/ld を使用して、yasm を使用しています。

4

3 に答える 3

6

x86-64 Linux システムでは、標準の x86-64 ABI 規則に従って関数呼び出しを行います。手短に:

  • 最初の 6 つの整数/ポインター引数は、rdi、rsi、rdx、rcx、r8、r9 の順に渡されます。
  • 最初の 8 つの浮動小数点引数は、xmm0 ~ xmm7 でスカラーとして渡されます。
  • 収まらなかった残りの引数は、C の順序でスタックにプッシュされます。rsp を 16 バイトに揃えるために、スタックは必要に応じてパディングされます。
于 2010-06-12T19:44:17.930 に答える
2

C で簡単なプログラムを作成し、アセンブリにコンパイルしました (-S スイッチを使用)。GCC によって生成されたアセンブリ コードは、スタックにプッシュされるのではなく、レジスタにパラメーターを渡すことによって OpenGL/SDL 関数を呼び出すようです。

これは完全に正常です。x86-64では、パラメーターを渡すときにレジスターが可能な限り使用されます。

このドキュメントには最も包括的な情報が含まれていることがわかりました。

于 2010-06-12T19:39:11.603 に答える
0

これが役立つと思います:

http://en.wikipedia.org/wiki/X86_calling_conventions#Borland_fastcall

Evaluating arguments from left to right, it passes three arguments via EAX, EDX, ECX. Remaining arguments are pushed onto the stack, also left to right.
于 2010-06-12T19:30:44.990 に答える