我正在创建一个内核,我需要一些关于调用指令的帮助。我正在使用Flat Assembler来构建内核。
call fs:bx
这可能吗?
因为平面汇编程序给我一个“操作数大小无效”错误。
我知道我能做到
call 1000h:0h
但这不是我想要的。有人有这个问题的答案吗?
答案 0 :(得分:2)
我假设您希望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
中的段值放在第一个位置来设置此指令,所以不要在第一时间这样做。