부호 확장을 사용하여 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?
해결책을 시도했지만 인쇄 형식이 변경되었지만 논리적 인 시프트 문제가 해결되지 않음 – Sarchwalk
@Sarchwalk 두 인스턴스를 모두 고정 했습니까? – fuz
마지막 사례에서 ffffffff와 ffffff00이 뒤 따르는 0의 끊임없는 양을 얻습니다. @fuz – Sarchwalk