如何在Flat Assembler中使用fs:bx进行调用指令?

时间:2016-08-13 01:37:41

标签: assembly x86 kernel fasm

我正在创建一个内核,我需要一些关于调用指令的帮助。我正在使用Flat Assembler来构建内核。

call fs:bx

这可能吗?
因为平面汇编程序给我一个“操作数大小无效”错误。

我知道我能做到

call 1000h:0h

但这不是我想要的。有人有这个问题的答案吗?

1 个答案:

答案 0 :(得分: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中的段值放在第一个位置来设置此指令,所以不要在第一时间这样做。