1

別の関数からアセンブリ関数を呼び出すときに、どのレジスタを保存する必要がありますか (8086)

例: アーム アセンブリ コーディングでは、r4-r12 レジスタを保存しています。

BX、CX、DX、SI、DI も保存する必要があります @Multimedia Mike

4

2 に答える 2

4

使用するレジスタを保存し、関数の外部からではなく、関数内で保存する必要があります。8086 ランドでは、BP レジスタを保存し、それを使用してスタックにプッシュされたパラメータを参照し、終了時に BP レジスタを復元するのが通例です。また、値を返す必要がある場合は、慣例により AX レジスタを使用します。

更新:更新された質問への回答として、ASM 関数がそれらを使用する場合は、それらのレジスタを保存する必要があります。これを手動で管理したくない場合は、すべての x86 レジスタをプッシュ/ポップする pusha/popa をいつでも使用できます。

于 2013-01-30T04:29:51.950 に答える
2

[e]ax、[e]cx、[e]dx は呼び出し元保存レジスタ、[e]bx、[e]si、[e]di、[e]bp は呼び出し先保存レジスタです。つまり、どの関数も eax を破棄できます。 、ecx および edx。

また、8086 ランドでは、dx:ax ペアで「構造体」または 32 ビット値を返すのが通例です。

ウィキペディアによる呼び出し規約

于 2013-01-30T06:23:00.320 に答える