Assembly 在实模式下跳转到远地址

Assembly 在实模式下跳转到远地址,assembly,x86,x86-16,real-mode,memory-segmentation,Assembly,X86,X86 16,Real Mode,Memory Segmentation,我有一种情况,我必须在实模式下跳转到一个远地址,fs寄存器中有段值,gs寄存器中有偏移量,在跳转过程中,我必须保持精确的寄存器内容,我有一个想法如下: mov bp, fs shl ebp, 16 mov bp, gs jmp ebp 假设调用的目的地中未读取bp,fs和gs,我在中找到的另一种方法可以使用 push fs push gs retf 我想知道我应该使用哪种方法,或者是否有其他方法来实现这一点?我在x86汇编方面没有太多技能,所以请原谅我的无知 问候, Arka如果性能很重要,

我有一种情况,我必须在实模式下跳转到一个远地址,
fs
寄存器中有段值,
gs
寄存器中有偏移量,在跳转过程中,我必须保持精确的寄存器内容,我有一个想法如下:

mov bp, fs
shl ebp, 16
mov bp, gs
jmp ebp
假设调用的目的地中未读取
bp
fs
gs
,我在中找到的另一种方法可以使用

push fs
push gs
retf
我想知道我应该使用哪种方法,或者是否有其他方法来实现这一点?我在x86汇编方面没有太多技能,所以请原谅我的无知

问候,


Arka

如果性能很重要,则不匹配的呼叫/返回对将抛出,从而导致此retf上的分支预测失误,并随后返回。(如果far call/far ret参与其中,他们可能不会,IDK)否则这是显而易见的选择

jmp-ebp
几乎是一个跳跃(不会改变
cs
),因此无法工作。您将使用
seg:off
作为32位整数,将EIP设置为该值,而不是CS:IP

您需要跳远(
jmpptr16:16
jmpm16:16
)。
ptr16:16
版本要求在指令中编码目标地址(因此它不是间接跳转)。唯一可用的间接(可变目的地)跳远编码在内存中有段:偏移对,而不是(a)寄存器

语法来自

push/push/retf
将显著更小,并且不需要单独的暂存空间,因此可能更好。如果绩效很重要,那么从两方面衡量

mem
空间可以在堆栈或静态存储器上。但是,如果在到达目的地时需要特定的堆栈内容,则可能无法在堆栈上留下额外的内容,并且使用堆栈下面的空间也不安全。(您只能使用诸如
[bp-4]
之类的寻址模式对堆栈进行寻址,而不是相对于
[sp]
,除非您在386上使用诸如
jmp far[esp+4]
之类的32位寻址模式。)

mov [mem], fs
mov [mem+2], gs
jmp far [mem]