比较arm程序集中的有符号整数

比较arm程序集中的有符号整数,arm,Arm,加载一个全局变量并检查它是否等于-1,但我的代码不会将其识别为等于-1。它只通过与局部变量的比较 //setting global variable .data .global top_m top_m: .word -1 //loading global variable into x21 adrp x28, top_m add x28, x28, :lo12:top_m ldr x21, [x28] //checking value of global varia

加载一个全局变量并检查它是否等于-1,但我的代码不会将其识别为等于-1。它只通过与局部变量的比较

//setting global variable
    .data
    .global top_m
    top_m:  .word -1

//loading global variable into x21
adrp x28, top_m
add x28, x28, :lo12:top_m
ldr x21, [x28]

//checking value of global variable, it does not branch to exit_stackEmpty
cmp     x21, -1
b.eq    exit_stackEmpty

//but if I compare with a local variable then it does branch
mov x23, -1
cmp     x23, -1
b.eq    exit_stackEmpty
编辑: 在gdb中,它为x21和x23显示了这一点

x21 0xffffffff       4294967295 //after loading -1 to x21
x23 0xffffffffffffffff       -1 //after mov x23, -1 

您正在加载的数据来自
.word
指令,因此是32位-0xFFFFFF。如果从该地址加载64位,则会得到0x00000000ffffffff,这实际上不是一个64位的-1。顺便说一句,该负载也会从数据段的末尾运行,这是一个坏主意,但确实意味着您将碰巧在MSB中得到零(或segfault)-如果在
top\m
之后有更多的数据,那么发生的事情将更为明显


如果要加载32位字并对其进行符号扩展到64位,请使用“加载32位字并对其进行符号扩展到64位”指令:.

字的大小是多少。字的大小是多少,即加载带符号的64位值的对象?