是否有可能构建一个跳转到SIMD寄存器的x86_64操作码?

时间:2017-05-23 19:00:25

标签: assembly x86-64 simd opcode

今天早上我有一个有趣的想法。我想知道是否可以构建无条件跳转到存储在SIMD寄存器(如XMM0)中的地址。显然,它不应该,并且我从未见过编译器这样做,但我想知道是否可以组合一个执行它的操作码。

现在我的意思是说在SIMD寄存器中做一些算术,将它移到通用寄存器,然后说

JMP EAX

我想做的是,弄清楚是否有可接受的X86_64操作码会做类似

的操作
JMP XMM0

当然,不知何故,你必须只抓住登记册的前半部分。这很可能是不可能的,但我很好奇它是否或者无法完成 的原因。

2 个答案:

答案 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寄存器。

相关问题