16

有没有办法将压缩双字整数从 XMM 寄存器推送到堆栈?然后在需要时将其弹出?

理想情况下,我正在寻找通用寄存器的 PUSH 或 POP 之类的东西,我已经检查过英特尔手册,但我要么错过了命令,要么没有......

还是我必须将值解压缩到通用寄存器然后推送它们?

4

2 回答 2

25

不,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 解决方案!

于 2012-04-15T12:36:15.977 回答
0

为此,我建议使用单独的 16 位对齐堆栈,这样您就可以使用 movdqa 而不是 movdqu。这两条指令的执行时间略有不同!

于 2018-07-27T11:17:35.987 回答