您好我在xmm寄存器中打印出所有值时遇到问题。我相信我正在使用SSE和AVX我仍然是装配的新手
因此,用户输入4个数字,然后使用:
将它们移动到YMM14寄存器中vmovupd ymm14, [rsp]
所以现在ymm14中有4个数字。接下来,我尝试使用
将它们移动到xmm0和xmm1vextractf128 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打印。任何帮助将不胜感激。
答案 0 :(得分:1)
问题是printf
仅将xmmN
个寄存器视为标量,即它们只保存一个值。由于您的格式字符串包含4种不同的格式说明符,因此printf
需要4个不同寄存器中的值(即xmm0
- xmm3
)。要打印所有4个值,您需要将每个字段作为标量提取到不同的寄存器。
因此,第一步是将ymm14
分成两半,xmm0
和xmm2
(不 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
的较高一半。