今天早上我有一个有趣的想法。我想知道是否可以构建到存储在 SIMD 寄存器(如 XMM0(中的地址的无条件跳转。显然,它不应该是,我从未见过编译器这样做,但我想知道是否有可能将一个操作码放在一起。
现在我的意思不是说在 SIMD 寄存器中做一些算术,将其移动到通用寄存器,然后说
JMP EAX
我想做的是,弄清楚是否有一个可接受的X86_64操作码可以做类似的事情
JMP XMM0
当然,不知何故,你只需要抓住寄存器的前半部分。这一切都可能是不可能的,但我很好奇它是否是或确切为什么不能做到。
这样的指令不存在。唯一jmp
说明是:
EB cb JMP rel8 jump short
E9 cw/cd JMP rel16/32 jump near
FF /4 JMP r/m16/32/64 jump near indirect
EA cd/cp JMP ptr16:16/32 jump far
FF /5 JMP m16:16/32 jump far indirect
REX.W FF /5 JMP m16:64 jump far indirect
这些指令中的每一个要么跳转到即时、通用寄存器或内存操作数中给出的地址。不能使用 SSE 寄存器。
还有许多其他指令可用于跳转,例如ret
,但它们都不支持跳转到SSE寄存器。
虽然它确实会通过内存并且从技术上讲是 3 条指令,但您可能会争辩说48 8D 64 24 F8 66 0F D6 04 24 C3
实际上是一个jmp xmm0
操作码。当然只是
lea rsp, [rsp-8]
movq [rsp], xmm0
ret
这可能属于您的排除范围,但它不会破坏任何寄存器或标志,因此如果这是您的原因,这应该有效。
如果您有可用的红色区域,您可以这样做
movq [rsp-8], xmm0
jmp [rsp-8]
相反。