ARM64汇编:x21/x0寄存器设为-1及返回值疑问
关于ARM64汇编的两个问题解答
1. bl调用的函数返回值是否会存入x21寄存器?
不会哦!在ARM64的标准调用约定里,函数的返回值是存在x0寄存器(64位返回值)或者w0寄存器(32位返回值)里的。你代码里的mov x21, x0是你手动把x0里的返回值拷贝到x21的操作,函数本身并不会主动把返回值放到x21里。
看你的代码片段就能明白:
bl method_which_returns_number ; 调用函数后,返回值存在x0中 mov x21, x0 ; 手动将x0的内容复制到x21 cmp w21, #0x1 ; 比较x21的低32位和0x1
这里的核心逻辑是:bl指令执行完后,返回值只在x0/w0里,x21是你后续手动转移过去的。
2. 如何将x0或x21设置为整数-1?
在ARM64汇编里,-1的二进制表示是所有位都为1(补码规则),你可以用几种简单方式实现:
- 直接用
mov指令赋值:mov x0, #-1 ; 将64位寄存器x0设置为-1 mov w21, #-1 ; 将32位寄存器w21设置为-1(x21的低32位变为-1,高32位清零) - 或者用
movn指令(对立即数取反),因为0的取反就是全1,也就是-1:movn x0, #0 ; 等价于mov x0, #-1 movn w21, #0 ; 等价于mov w21, #-1
如果需要确保x21整个64位都是-1,就用mov x21, #-1;如果只需要低32位是-1,用mov w21, #-1就足够了。
内容的提问来源于stack exchange,提问作者user4151125
相关产品推荐
相关产品推荐

