在XMM寄存器中打印出值

时间:2014-09-07 19:17:31

标签: assembly x86 avx

您好我在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

btw这是devicePower

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

只打印出低值。所以,如果我输入1 2 3 4.只有2和4打印出来。我用过debug和1& 2在同一寄存器和3& 4也在正确的寄存器中,但只有2& 4打印出来

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

1 个答案:

答案 0 :(得分: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的较高一半。