我使用sign extend将32位变量更改为64位变量。但是,当我在64位变量上使用逻辑移位时,它会丢失位,就像它仍然是32位一样。
我希望最终能够将所有内容从原始变量转移到64位变量的上方。 (0xFFFFFFFF00000000是我期待的结果)
下面的代码显示了8位的移位,以说明位丢失的位置:
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
输出如下:
字值:0xffffffff Word扩展为64位:0x00000000ffffffff LSL:0x00000000ffffff00
我的代码中缺少什么以允许逻辑移位导致0xFFFFFFFF00000000?
答案 0 :(得分:2)
x
格式化说明符打印unsigned
参数,这是我知道的ARM ABI上的32位类型。这会导致printf
忽略参数的高32位。使用llx
打印long long unsigned
参数; long long unsigned
至少是64位类型。