今天早上我有一个有趣的想法。我想知道是否可以构建无条件跳转到存储在SIMD寄存器(如XMM0)中的地址。显然,它不应该,并且我从未见过编译器这样做,但我想知道是否可以组合一个执行它的操作码。
现在我不的意思是说在SIMD寄存器中做一些算术,将它移到通用寄存器,然后说
JMP EAX
我想做的是,弄清楚是否有可接受的X86_64操作码会做类似
的操作JMP XMM0
当然,不知何故,你必须只抓住登记册的前半部分。这很可能是不可能的,但我很好奇它是否或者无法完成 的原因。
答案 0 :(得分:3)
虽然它确实经历了内存,但技术上是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]
代替。
答案 1 :(得分:2)
这样的指示不存在。唯一的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寄存器。