ASM内から関数を呼び出そうとしています。呼び出し方は知っていますが、この関数の戻り値を取得する方法を見つけるのに苦労しています。次に例を示します。
Cコード:
int dummy() {
return 5;
}
(N)ASMコード:
dummyFunction:
call dummy
;grab return into eax
inc eax ; eax should be 6 now
ret
何か案は?
戻り値はにありeax
ます。asmからC関数を呼び出した場合は、から戻り値を読み取ることができますeax
。asm関数からCに戻そうとしている場合は、目的の戻り値をに格納しeax
ます。
浮動小数点値、値、または構造体を返す方法は少し複雑にlong long
なるので、それが必要かどうかを尋ねてください。誰か(多分私)があなたを助けてくれます。
答えはOPの質問に答えるのに十分ですが、完全を期すためにDJPPのマンページからほとんどのケースをカバーする抜粋を次に示します。
戻り値
- 整数 (32 ビットまでの任意のサイズ) とポインタが
%eax
レジスタに返されます。- 浮動小数点値は、387 スタックのトップ レジスタに返されます
st(0)
。- type の戻り値
long long int
が返されます%edx:%eax
( の最上位の単語%edx
と の最下位の単語%eax
)。- 構造体を返すことは複雑で、ほとんど役に立ちません。それを避けるようにしてください。(これは、構造体へのポインターを返すこととは異なることに注意してください。)
関数が返される場合
void
(値がない場合など)、これらのレジスタの内容は使用されません。
eax
プラットフォームや呼び出し規約にもよりますが、通常、プリミティブ型やポインタの場合は戻り値がst(0)
、浮動小数点型の場合は浮動小数点レジスタに戻り値が返されるはずです。