有没有办法将打包的双字整数从XMM寄存器推送到堆栈?然后在需要时弹出它?
理想情况下,我正在寻找像PUSH或POP这样的通用寄存器,我已经检查了英特尔手册,但我要么错过了命令,要么就没有...
或者我是否必须将值解压缩到通用寄存器然后推送它们?
不,在x86下没有这样的asm指令,但你可以这样做:
//Push xmm0
sub esp, 16
movdqu dqword [esp], xmm0
//Pop xmm0
movdqu xmm0, dqword [esp]
add esp, 16
编辑:
高级代码示例是直接推送/弹出仿真。
如果您在堆栈上使用其他局部变量,则必须首先正确设置ebp
寄存器,例如:
push ebp
mov ebp, esp
sub esp, LocaStackVariablesSize
//... your code
mov esp, ebp
pop ebp
ret
在这种情况下,您还可以使用Daniels解决方案!
我建议为此使用单独的16位对齐堆栈,因此您可以使用movdqa而不是movdqu。这两条指令的执行时间略有不同!