我如何在 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:bxcs=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

或者提前在堆栈上保留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中的段值放在首位来设置这条指令,所以一开始就不要那样做。