ARM64汇编

不同架构的汇编代码是不同的,这里研究的是真机ARM64架构的汇编

  • 通用寄存器

可以通过$register read命令查看,ARM64架构下有29个寄存器:x0-x28(64bit),隐藏的寄存器有w0-w28(属于x0-x28的低32bit)。

写入寄存器$register write cpsr 0

  • 程序计数器

pc (program count)

  • 堆栈指针

sp(Stack Pointer)

Fp(Frame Pointer),x29

  • 链接寄存器

lr(Link Register),x30

  • 程序状态寄存器

cpsr : current project status register

spsr : saved peoject status register 异常状态下使用

如何在xcode中编写汇编代码

  1. 在xcode中新建.s后缀文件
ARM64汇编_第1张图片
创建.s文件.png
  1. 同时创建一个同名的.h头文件与之对应

  2. 在.h中暴露方法,在.s中编写代码

<.h>
#ifndef Test_h
#define Test_h
void test (void);// 对外声明
#endif /* Test_h */
<.s>
.text // 文件写入text代码段
.global _test // 对外声明函数,因为汇编已经是底层了,要自己手动加下划线

_test:
mov x1 ,8
ret // 以ret 结尾,否则会穿透

mov、add、sub 指令

_test:
mov w1,#0x5  // w1 = 5
mov w2,#0x7  // w2 = 7
add w1 ,w1 ,w2 // w1 = w1 + w2
sub w3 , w1, 3 // w3 = w1 - 3
ret // 以ret 结尾,否则会穿透

cmp指令cmp w1,w2 : 将w1 - w2 的结果放到状态寄存器cpsr,cpsr不直接保存结果,结果会影响cpsr不同的位值

ARM64汇编_第2张图片
cpsr结构.png
_test:
;b指令 // ;也有注释的意思
mov w1,#0x5
mov w2,#0x5
cmp w1, w2 // b指令需要和cmp配合使用,会到状态寄存器内检查条件是否满足
beq jump  // 跳转到 jump私有方法
mov w3, 3
ret

jump: // jump实现
mov w1, 1
ret

b指令

ARM64汇编_第3张图片
指令条件码.png

bl指令

_test:
;bl指令
bl jump  // bl指令跳转到 jump后会返回并执行下面的代码
mov w3, 3 // 如果用的是b指令,如果满足条件跳转出去后不会再返回执行下面代码
ret

你可能感兴趣的:(ARM64汇编)