私は、call fs:bx
を遠くの電話としてcs=fs
とip=bx
に設定するとします。
間接ファーコールでは、レジスタではなくメモリにseg:offsetが必要です。利用可能な唯一の間接far call
がcall m16:16
フォームであることを確認するには、the insn ref entry for call
を参照してください。
だから、16ビットのコードでは、あなたが
my_function:
push bp
mov bp, sp
sub sp, 16 ; or whatever size you need for locals. 16 and 8 are just for example.
...
mov [bp - 8], fs
mov [bp - 6], bx ; separately store both parts of fs:bx into [bp-8]
far call [bp - 8]
...
leave
ret
のようなものを事前にスタック上
push fs
push bx
... ; push args
far call [bp-whatever] ; assuming you know the difference between bp and sp at this point
add sp, 4 + arg_size ; clean up args and the far-pointer
または予備スペースを行うことができますことができるようにあなたはいないmov cs, fs
か何かのようなことができます(スクラッチGPレジスタを使用していても)。 cs
を変更するとジャンプするので、全体を1つのfar call
として実行する必要があります。もちろん
、あなたはおそらくこれだけの命令のためにセットアップするには、最初の場所でfs
でセグメント値を入れて、その最初の場所であることをしません。
私は質問があります。あなたの例では「何が」何を意味していますか? – SeeSoftware
@SeeSoftware:これは、スタックフレームのサイズ(すなわち、fsとbxを押した後のbpとspの差)に依存する数値定数です。同じように、関数のスタックにあるスペースをあらかじめ確保しておくことができます。 mov [bp-8]、fs'/'mov [bp-6]、bx'/... /' call [bp-8] ' –
実際には[bp-whatever]の代わりに[sp]それは私がそれから戻ってどのようにbtwうまく動作しますか? "ret"または "retf"か何か他のものを編集する:あなたはspを直接別のレジスタに入れなくてはならない。 – SeeSoftware