12

ASM内から関数を呼び出そうとしています。呼び出し方は知っていますが、この関数の戻り値を取得する方法を見つけるのに苦労しています。次に例を示します。

Cコード:

int dummy() {  
    return 5;  
}  

(N)ASMコード:

dummyFunction:
    call dummy
    ;grab return into eax
    inc eax ; eax should be 6 now
    ret  

何か案は?

4

3 に答える 3

17

戻り値はにありeaxます。asmからC関数を呼び出した場合は、から戻り値を読み取ることができますeax。asm関数からCに戻そうとしている場合は、目的の戻り値をに格納しeaxます。

浮動小数点値、値、または構造体を返す方法は少し複雑にlong longなるので、それが必要かどうかを尋ねてください。誰か(多分私)があなたを助けてくれます。

于 2011-05-29T23:50:17.757 に答える
10

答えはOPの質問に答えるのに十分ですが、完全を期すためにDJPPのマンページからほとんどのケースをカバーする抜粋を次に示します。

戻り値

  • 整数 (32 ビットまでの任意のサイズ) とポインタが%eaxレジスタに返されます。
  • 浮動小数点値は、387 スタックのトップ レジスタに返されますst(0)
  • type の戻り値long long intが返されます%edx:%eax( の最上位の単語%edxと の最下位の単語%eax)。
  • 構造体を返すことは複雑で、ほとんど役に立ちません。それを避けるようにしてください。(これは、構造体へのポインターを返すこととは異なることに注意してください。)

関数が返される場合void(値がない場合など)、これらのレジスタの内容は使用されません。

于 2014-09-13T14:37:53.370 に答える
2

eaxプラットフォームや呼び出し規約にもよりますが、通常、プリミティブ型やポインタの場合は戻り値がst(0)、浮動小数点型の場合は浮動小数点レジスタに戻り値が返されるはずです。

于 2011-05-29T23:51:16.117 に答える