2

C関数を呼び出すためにx86_64アセンブリを作成しています。私のC関数は1つの引数を取るので、アセンブリは引数を。に配置します%rdi。ABI pdf(以下にリンク)は、他の6つの引数レジスタ(rsi、rdx、rcx、r8、r9)が関数呼び出し間で保持されないことを示しています。ただし、私のC関数はlong引数を1つしか受け取らないので、C関数が他の5つのレジスタを壊してしまうかどうかについての保証はありますか?私の仮定では、引数の値が変更された場合にのみ、引数レジスタが上書きされます。

void foo(int a, int b) {
    a++; /* %rdi will be changed, but %rsi won't be changed when control returns. */
}

他の5つの引数レジスタの値をC関数呼び出し全体で保持したいので(手動でスタックから明示的にプッシュ/ポップする必要はありません)、質問しています。

x86_64 ABI- http: //www.x86-64.org/documentation/abi-0.99.pdf

4

2 に答える 2

8

保証はありません。それらが変更されないように、スタックに保存する必要があります。それらが変更されるかどうかは、コンパイラーによって異なります。

どういうわけかそれらが変更されていないことを確認したい場合は、アセンブリで関数を書くことができます。

于 2012-09-01T01:34:05.020 に答える
6

21 ページの表を見てください。すべてのレジスタに対して「Preserved Yes/No」という列があります。そして、パラメーターを渡すために使用されるすべてのレジスターに対して「いいえ」と表示されます。

引数を渡すかどうかに関係なく、引数レジスタを保持する必要はありません。パラメータを取得できない可能性があります。

于 2012-09-01T10:14:01.320 に答える