2016-08-13 9 views
1

私はカーネルを作成しています。私はコール命令について助けが必要です。フラットアセンブラを使ってカーネルを構築しています。Flat Assemblerの呼び出し命令でfs:bxを使用するにはどうすればよいですか?

call fs:bx 

これは可能ですか?
フラットアセンブラが "無効なオペランドサイズ"エラーを表示するためです。

私は

call 1000h:0h 

を行うことができます知っている。しかし、それは私が欲しいものではありません。誰かがこの質問に対する答えを持っていますか?

答えて

2

私は、call fs:bxを遠くの電話としてcs=fsip=bxに設定するとします。

間接ファーコールでは、レジスタではなくメモリにseg:offsetが必要です。利用可能な唯一の間接far callcall 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でセグメント値を入れて、その最初の場所であることをしません。

+0

私は質問があります。あなたの例では「何が」何を意味していますか? – SeeSoftware

+0

@SeeSoftware:これは、スタックフレームのサイズ(すなわち、fsとbxを押した後のbpとspの差)に依存する数値定数です。同じように、関数のスタックにあるスペースをあらかじめ確保しておくことができます。 mov [bp-8]、fs'/'mov [bp-6]、bx'/... /' call [bp-8] ' –

+0

実際には[bp-whatever]の代わりに[sp]それは私がそれから戻ってどのようにbtwうまく動作しますか? "ret"または "retf"か何か他のものを編集する:あなたはspを直接別のレジスタに入れなくてはならない。 – SeeSoftware

関連する問題