Я предполагаю, что вы хотите, чтобы call fs:bx
установил cs=fs
и ip=bx
в качестве дальнего вызова.
Косвенные дальние вызовы требуют, чтобы seg:offset находился в памяти, а не в регистрах. См. запись insn ref для 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
в первую очередь для настройки этой инструкции, так что не делайте этого в первую очередь.
person
Peter Cordes
schedule
13.08.2016