我如何在 Flat Assembler 的调用指令中使用 fs:bx?
How do i use fs:bx in call instruction at Flat Assembler?
我正在创建一个内核,我需要一些有关调用指令的帮助。我正在使用 Flat Assembler 构建内核。
call fs:bx
这可能吗?
因为平面汇编程序给我一个 "invalid size of operand" 错误。
我知道我能做到
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
或者提前在堆栈上保留space,这样你就可以做类似
的事情
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
中的段值放在首位来设置这条指令,所以一开始就不要那样做。
我正在创建一个内核,我需要一些有关调用指令的帮助。我正在使用 Flat Assembler 构建内核。
call fs:bx
这可能吗?
因为平面汇编程序给我一个 "invalid size of operand" 错误。
我知道我能做到
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
或者提前在堆栈上保留space,这样你就可以做类似
的事情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
中的段值放在首位来设置这条指令,所以一开始就不要那样做。