2014-09-07 9 views
1

안녕 내 xmm 레지스터에 내 모든 값을 인쇄하는 데 문제가 있습니다. XMM 레지스터의 값을 인쇄하십시오.

vmovupd ymm14, [rsp] 

는 이제 ymm14 4 수있다 : 나는 그래서 사용자 입력 4 개 숫자와 내가 사용 YMM14 레지스터로 이동 나는

조립

에 여전히 매우 새로운 오전 나는 SSE와 AVX를 사용하고 생각합니다. 다음으로 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 4. 2와 4 만 인쇄됩니다. 내가 디버그 및 1 & 2를 사용하는 동일한 레지스터에 있고 3 & 4 함께 올바른 레지스터 또한, 만 2 & 4 내가 1 & 3을 얻을 수 없기 때문에 내가 뭔가를 놓치고 있습니까

을 인쇄되는 인쇄. 어떤 도움을 주시면 감사하겠습니다.

+1

호출 규칙이 다양하기 때문에 Windows 또는 Linux를 사용하는지 여부를 언급해야합니다. –

+0

메신저 우분투를 사용하여 – rr321

답변

1

printfxmmN 레지스터를 스칼라로만 처리하므로 하나의 값만 보유합니다. 형식 문자열에 4 개의 다른 형식 지정자가 있기 때문에 printf은 4 개의 다른 레지스터 (예 : xmm0 - xmm3)의 값을 필요로합니다. 4 개의 값 모두를 인쇄하려면 각 필드를 서로 다른 레지스터의 스칼라로 추출해야합니다.

따라서, 첫 번째 단계가 두 반쪽 xmm0xmm2 (하지xmm1)로 ymm14 분할 될 것이다 :

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 

이제 의 상위 절반을 포함하는 xmm1xmm3 con xmm2의 상위 절반을가집니다.

+0

슈퍼 유용한 도움 감사합니다! – rr321

관련 문제