如果性能很重要,不匹配的调用/返回对会抛出返回地址预测器,导致等效于此 retf 上的分支错误预测并随后返回。(如果 far call / far ret 甚至参与其中;他们可能不会,IDK。)否则这是显而易见的选择。
jmp ebp
是一个近跳(不改变cs
),所以不能工作。您将使用seg:off
32 位整数,将 EIP 设置为该值,而不是 CS:IP。
您需要跳远(jmp ptr16:16
或jmp m16:16
)。该ptr16:16
版本要求在指令中对目标地址进行编码(因此它不是间接跳转)。唯一可用的间接(可变目标)远跳转编码具有内存中的段:偏移量对,而不是(a)寄存器
mov [mem], fs
mov [mem+2], gs
jmp far [mem]
来自https://courses.engr.illinois.edu/ece390/archive/spr2002/books/labmanual/inst-ref-jmp.html的语法
push/push/retf
会明显更小,并且不需要单独的暂存空间,所以它可能会更好。如果性能很重要,请双向衡量。
该mem
空间可以在堆栈上,也可以在静态存储上。但是,如果您在到达目的地时需要特定的堆栈内容,您可能无法在堆栈上留下额外的东西,并且使用堆栈下方的空间也不安全。(你只能使用寻址模式来寻址堆栈[bp-4]
,而不是相对于[sp]
,除非你在 386 上使用 32 位寻址模式jmp far [esp+4]
或其他。)