2016-08-13 19 views
1

我正在創建一個內核,我需要一些調用指令的幫助。我正在使用Flat Assembler來構建內核。如何在Flat Assembler的call指令中使用fs:bx?

call fs:bx 

這可能嗎?
因爲平面彙編程序給我一個「無效的操作數大小」錯誤。

我知道我可以做

call 1000h:0h 

但是,這不是我想要的。有人有這個問題的答案嗎?

回答

2

我假設你想call fs:bx設置爲cs=fsip=bx,作爲一個遠程調用。

間接遠程調用要求seg:offset存儲在內存中,而不是寄存器。請參閱the insn ref entry for call以確認唯一可用的間接far callcall m16:16表單。

因此,在16位代碼,你可以在堆棧提前對

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 

或預留空間,這樣你就可以做這樣的事情

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 

你不能mov cs, fs或類似的東西(甚至使用臨時GP寄存器)。更改cs將是一個跳躍,所以你必須做一件事far call


當然,你可能只把段值fs在設立此指令的第一個地方,所以不這樣做,擺在首位。

+0

我有一個問題:在你的例子中「無論」是什麼意思? – SeeSoftware

+0

@SeeSoftware:這是一個數值常量,取決於堆棧幀的大小(即推後fs和bx之後的bp和sp之間的差異)。等同地,可以提前在函數的堆棧中預留一些空間, mov [bp - 8],fs' /'mov [bp - 6],bx'/... /'call [bp - 8]' –

+0

其實你可以用[sp]代替[bp-whatever]和它適用於我btw如何從它返回罰款? 「ret」或「retf」或別的東西編輯:你不能直接使用sp,你必須把它放到另一個寄存器 – SeeSoftware