2017-10-12 12 views
1

부호 확장을 사용하여 32 비트 변수를 64 비트 변수로 변경하려고합니다. 그러나 64 비트 변수에 논리 시프트를 사용하면 여전히 32 비트 인 것처럼 비트가 손실됩니다.어셈블리에서 부호 확장 후 논리적 시프트가 손실 됨 ARMv8

필자는 내 원래 변수에서부터 64 비트 변수의 위쪽으로 모든 것을 옮길 수 있기를 원합니다.

str_fmt:.string "\nWord Value: 0x%08x \nWord Extended to 64-bit: 0x%016x\nLSL: 0x%016x\n\n" 

     .balign 4 
     .global main  

main: stp  x29, x30, [sp, -16]!  
     mov  x29, sp   

     mov  w19, 0xFFFFFFFF 
     sxtw x20, w19 

     lsl  x21, x20, 8 

results: 
     adrp x0, str_fmt  
     add  x0, x0, :lo12:str_fmt 
     mov  w1, w19    
     mov  x2, x20 
     mov  x3, x21 
     bl  printf 

done: ldp  x29, x30, [sp], 16 
     ret 

출력은 다음과 같다 :

워드 값

아래의 코드 비트들이 손실 발휘 8 비트의 시프트가 도시 (0xFFFFFFFF00000000는 I 기대하고 결과) : 0xffffffff를 워드는 64 비트로 확장 : 0x00000000ffffff00

나는 논리적 변화가 0xFFFFFFFF00000000 결과 왼쪽 있도록 내 코드에서 실종 무엇 : LSL 0x00000000ffffffff?

답변

2

x 서식 지정자는 unsigned 인수를 인쇄합니다.이 인수는 내가 아는 ARM ABI에서 32 비트 유형입니다. 이로 인해 printf은 인수의 상위 32 비트를 무시합니다. long long unsigned 인수를 인쇄하려면 llx을 사용하십시오. long long unsigned은 적어도 64 비트 유형입니다.

+0

해결책을 시도했지만 인쇄 형식이 변경되었지만 논리적 인 시프트 문제가 해결되지 않음 – Sarchwalk

+0

@Sarchwalk 두 인스턴스를 모두 고정 했습니까? – fuz

+0

마지막 사례에서 ffffffff와 ffffff00이 뒤 따르는 0의 끊임없는 양을 얻습니다. @fuz – Sarchwalk