1
我正在創建一個內核,我需要一些調用指令的幫助。我正在使用Flat Assembler來構建內核。如何在Flat Assembler的call指令中使用fs:bx?
call fs:bx
這可能嗎?
因爲平面彙編程序給我一個「無效的操作數大小」錯誤。
我知道我可以做
call 1000h:0h
但是,這不是我想要的。有人有這個問題的答案嗎?
我正在創建一個內核,我需要一些調用指令的幫助。我正在使用Flat Assembler來構建內核。如何在Flat Assembler的call指令中使用fs:bx?
call fs:bx
這可能嗎?
因爲平面彙編程序給我一個「無效的操作數大小」錯誤。
我知道我可以做
call 1000h:0h
但是,這不是我想要的。有人有這個問題的答案嗎?
我假設你想call fs:bx
設置爲cs=fs
和ip=bx
,作爲一個遠程調用。
間接遠程調用要求seg:offset存儲在內存中,而不是寄存器。請參閱the insn ref entry for call
以確認唯一可用的間接far call
是call 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
在設立此指令的第一個地方,所以不這樣做,擺在首位。
我有一個問題:在你的例子中「無論」是什麼意思? – SeeSoftware
@SeeSoftware:這是一個數值常量,取決於堆棧幀的大小(即推後fs和bx之後的bp和sp之間的差異)。等同地,可以提前在函數的堆棧中預留一些空間, mov [bp - 8],fs' /'mov [bp - 6],bx'/... /'call [bp - 8]' –
其實你可以用[sp]代替[bp-whatever]和它適用於我btw如何從它返回罰款? 「ret」或「retf」或別的東西編輯:你不能直接使用sp,你必須把它放到另一個寄存器 – SeeSoftware