将XMM寄存器推入堆栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将XMM寄存器推入堆栈相关的知识,希望对你有一定的参考价值。

有没有办法将打包的双字整数从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。这两条指令的执行时间略有不同!

以上是关于将XMM寄存器推入堆栈的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 32 位寄存器移动到堆栈然后从堆栈移动到 xmm 寄存器?

在函数调用之前保存 XMM 寄存器

将四字移动到 xmm

SSE XMM 点积说明

将单个浮点数移动到 xmm 寄存器

将浮点数从高 xmm 四字移动到低 xmm 四字