在汇编ARMv8中符号扩展后逻辑左移丢失位
Posted
技术标签:
【中文标题】在汇编ARMv8中符号扩展后逻辑左移丢失位【英文标题】:logical shift left losing bits after sign extend in assembly ARMv8 【发布时间】:2017-10-12 19:42:51 【问题描述】:我正在使用符号扩展将 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 字扩展为 64 位:0x00000000ffffffff LSL: 0x00000000ffffff00
我的代码中缺少什么以允许逻辑左移导致 0xFFFFFFFF00000000?
【问题讨论】:
【参考方案1】:x
格式说明符在我知道的 ARM ABI 上打印一个 unsigned
参数,它是 32 位类型。这会导致printf
忽略参数的高 32 位。使用llx
打印long long unsigned
参数; long long unsigned
至少是 64 位类型。
【讨论】:
试过你的解决方案,它改变了打印格式,但没有解决逻辑左移丢失位的问题 @Sarchwalk 你确定你已经修复了这两个实例? 在最后一种情况下,我不断得到大量的零,然后是 ffffffff 和 ffffff00 @fuz 让它工作,使用的是 1 而不是 l。感谢您的帮助!以上是关于在汇编ARMv8中符号扩展后逻辑左移丢失位的主要内容,如果未能解决你的问题,请参考以下文章