1

ARMv5 アセンブリ コーディングは初めてです。

CALL_VM_FUNCTION を使用してアセンブリ コードから C 関数を呼び出したいとします。私の C 関数は 3 つの引数を使用します。C 関数を呼び出す前に、どのレジスタに引数を保存しますか? これに続く特定の規則はありますか?

それに加えて、C 関数の呼び出しが行われる前後に、レジスタが値を保持していることを確認したいと考えています。プッシュとポップの命令はその問題を完全に処理しますか?

例えば:

PUSH {a1-a4}  /*values held in registers a1-a4 are saved*/    
/*instruction to pass arguments in the registers for C function call*/    
CALL_VM_FUNCTION(C-function)
POP {a1-a4}

前もって感謝します!:-)

4

1 に答える 1

1

call-clobbered レジスタのいずれかに保持する必要があるデータがある場合は、呼び出しをpush行う前にそれらを保存する必要があります (たとえば、 を使用)。これは、引数の受け渡しとは関係ありません。呼び出し先によって自分のデータが破壊されるのを避けるためです。lr特に、関数が戻らない場合を除き、常に保存する必要があります。

引数の受け渡し方法については、a1~a4 をスタックにプッシュする方法ではありません。最初の 4 つの整数/ポインタ引数は、a1 ~ a4レジスタに直接入ります。その後、それらはスタックに移動します。浮動小数点型と集計型の場合は少し複雑になるため、ABI を読むことをお勧めします。

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

于 2012-07-05T11:15:07.650 に答える