【问题标题】:Set ARM64 register to -1将 ARM64 寄存器设置为 -1
【发布时间】:2018-05-04 20:49:29
【问题描述】:

我正在学习 asm,这是我的问题

bl         method_which_returns_number
mov        x21, x0
cmp        w21, #0x1

看来bl调用的方法会返回数字到寄存器x21,对吗? 如何将 x21 或 x0 寄存器修改/设置为整数 -1?

【问题讨论】:

  • 你不能这样做吗:mov x21 #~0x0
  • ~0x0 是否意味着-1?
  • 是的,在 2s 补码中,如果我没记错的话,ARM 使用 2s 补码
  • 我已经添加了肯定有效的答案。
  • 你有更多的代码吗,这里缺少一些东西。

标签: assembly arm


【解决方案1】:
 mov  x0, #-1

像这样组装:(与aarch64-linux-gnu-as minus1.S && aarch64-linux-gnu-objdump -d a.out):

0:   92800000        mov     x0, #0xffffffffffffffff         // #-1

这是movn x0, #0


ARM 汇编器知道如何对mov 进行编码以支持不同类型的立即位模式。 AArch64 有几种具有不同编码规则的立即数形式。 使用mov 如果不能立即汇编成一条指令,会报错,所以你不必担心它会变成像 ARM32 @987654331 这样的 PC 相关负载@伪指令即可。

ARM 文档列出了movone of them is an alias for movn 的几种形式,它们否定了它的源操作数。其他形式包括基于orr-immediate(带有架构零寄存器)的一种,它支持2、4、8、16、32 或64 位宽的重复位模式。还有一个基于movz,一个 16 位立即左移到任意位置。


好像bl调用的方法会返回数字到寄存器x21,对吗?

不,ARM 语法是op dst, src

mov x21, x0 正在将返回值从x0 复制到x21。整数返回值在 x/w0 中,就像在 AArch32 中返回值在 r0 中一样。

【讨论】:

猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 2018-02-24
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多