// 记录下 常用的 arm64 汇编的用法
定义一些变量
int_a =3
.equ int_a 3
或者 直接 #define int_a 3
也是可以的
1.7 数据类型
x86 上的“字”是 16 位,“双字”是 32 位。ARM的“字”是32位,“双字”是64位。
宏的使用
.macro 开始
.endm 结束
// load a 64-bit immediate using MOV
.macro movq Xn, imm
movz \Xn, \imm & 0xFFFF
movk \Xn, (\imm >> 16) & 0xFFFF, lsl 16
movk \Xn, (\imm >> 32) & 0xFFFF, lsl 32
movk \Xn, (\imm >> 48) & 0xFFFF, lsl 48
.endm
// load a 32-bit immediate using MOV
.macro movl Wn, imm
movz \Wn, \imm & 0xFFFF
movk \Wn, (\imm >> 16) & 0xFFFF, lsl 16
.endm
使用的话:
movl w0, 0x12345678
条件编译
.ifdef BIND
// assemble code to bind
.else
// assemble code for connect
.endif
保存寄存器
stp,ldp 可以同时操作 两个寄存器,用法基本与 str /ldr 一样…
// push {x0}
// [base - 16] = x0
// base = base - 16
str x0, [sp, -16]!
// pop {x0}
// x0 = [base]
// base = base + 16
ldr x0, [sp], 16
// push {x0, x1}
stp x0, x1, [sp, -16]!
// pop {x0, x1}
ldp x0, x1, [sp], 16
汇编中,函数最后一定要写ret,否则会一直按顺序执行下去。他会认为下一个函数名只是下个代码块的标记。