比较arm程序集中的有符号整数
加载一个全局变量并检查它是否等于-1,但我的代码不会将其识别为等于-1。它只通过与局部变量的比较比较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
//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位值的对象?