【问题标题】:Print out values in XMM registers打印出 XMM 寄存器中的值
【发布时间】:2014-09-07 19:17:31
【问题描述】:

您好,我无法打印出 xmm 寄存器中的所有值。我相信我正在使用 SSE 和 AVX 我对组装还是很陌生

所以用户输入了 4 个数字,我将它们移动到 YMM14 寄存器中:

vmovupd ymm14, [rsp] 

所以现在 ymm14 中有 4 个数字。接下来,我尝试使用

将它们移动到 xmm0 和 xmm1
vextractf128 xmm1, ymm14, 1
vextractf128 xmm0, ymm14, 0

所以现在每个都有两个数字。现在,当我尝试使用

打印出来时
mov rdi, devicePower                                        
mov qword rax, 4                                        
call printf

顺便说一句,这是 devicePower

devicePower db "Power (watts):    %.18lf    %.18lf    %.18lf    %.18lf", 10, 0

仅打印出低值。所以如果我输入 1 2 3 4。只有 2 和 4 被打印出来。我使用了调试,1 & 2 在同一个寄存器中,3 & 4 也在正确的寄存器中,但只有 2 & 4 被打印出来

我错过了什么是因为我无法打印 1 和 3。任何帮助将不胜感激。

【问题讨论】:

  • 您需要说明您使用的是 Windows 还是 Linux,因为调用约定各不相同。

标签: assembly x86 avx


【解决方案1】:

问题在于printf 仅将xmmN 寄存器视为标量,即它们仅保存一个值。因为您的格式字符串包含 4 个不同的格式说明符,printf 需要 4 个不同寄存器中的值(即xmm0-xmm3)。要打印所有 4 个值,您需要将每个字段作为标量提取到不同的寄存器。

所以,第一步是将ymm14 分成两半,xmm0xmm2不是 xmm1):

vextractf128 xmm0, ymm14, 0
vextractf128 xmm2, ymm14, 1

接下来,通过vshufpd拆分两个字段:

vshufpd xmm1, xmm0, xmm0, 1 ; the third operand doesn't matter
vshufpd xmm3, xmm2, xmm2, 1

现在,xmm1 包含xmm0 的上半部分,xmm3 包含xmm2 的上半部分。

【讨论】:

  • 效率稍高:vunpckhpd xmm1, xmm0,xmm0 抢占 XMM0 的高半部分。较小的代码大小:没有imm8 控制操作数。而对于人类读者来说,shuffle 操作就在名称中,而不必看数字。 (没有 AVX,movhlps xmm1, xmm0 甚至更小,但如果你还没有使用过vzeroupper,那么不要将 VEX 与非 VEX 混合。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 2017-10-16
  • 2020-02-14
相关资源
最近更新 更多