- mov指令(传送指令):可以用来修改大部分寄存器的值
mov x0,#10、mov x1,#20
解读:
#
表示是立即数, #10,表示立即数为10- x0 和 x1 表示
通用寄存器
中的x0和x1的位置- 整体的意思是:将立即数 #10的值放到x0寄存器上;将立即数#20的值放到x1的寄存器上
- add:两个数相加的运算符
add x1, x0, #0x14
解读:
0x
表示16进制,0x14 就是14的十六进制,换成十进制为20- 整体的意思:将x0寄存器上的值 与 0x14 相加 将结果保存到x1 寄存器上
- adds:由于加了
s标志
,当进行add
运算的时候,cpu的状态寄存器
的值将会被运算的结果修改。
状态寄存器的基础知识,可以参考:https://blog.csdn.net/lyz0925/article/details/107215657
- bl指令:ARM64提供了
bl指令
来修改PC寄存器
的值,这些指令统称为转移指令
,最简单的是bl指令。
bl _B
解读:
- bl 是跳转指令
- _B 是函数名
- 整句的意思是:跳转到_B的函数
- 再跳转之前,会有两个操作:
将下一条指令的地址放入lr(x30)寄存器
然后转到标号处执行指令
- ret:默认使用
lr(x30)寄存器
的值,通过底层指令提示CPU此处作为下条指令地址
! 也就是说,当执行ret指令
时,CPU会执行lr(x30)这个寄存器存的内存地址指向的命令
。
详细,可参考如下文章:https://blog.csdn.net/lyz0925/article/details/107140034
- sub:两数相减的运算符
sub w0,w0,#0xff
解读:将w0寄存器的值 减去 0xff,将结果存放在w0中
- subs:两数相减的运算符,当进行
sub
运算的时候,cpu的状态寄存器
的值将会被运算的结果修改。
subs w0,w0,#0xff
解读:将w0寄存器的值 减去 0xff,将结果存放在w0中,并根据运算的结果修改状态寄存器的值。
- [sp, #0x10]!: 将sp的值与0x10相加,并把结果存入sp中
[sp, #0x10]!
解读:
- [sp, #0x10]! = add sp, sp, #0x10
- [sp, #-0x10]!: 将sp的值与0x10相减,并把结果存入sp中
[sp, #-0x10]!
解读:
- [sp, #-0x10]! = sub sp, sp, #0x10
- str(store register)指令:将数据从
寄存器
中读出来,存到内存
中.
将数据从
寄存器
中读出来,存到内存
中
- ldr(load register)指令:将数据从
内存
中读出来,存到寄存器
中
ldr x30, [sp], #0x10
解读:
上面那句代码可以分解成两个步骤:
ldr x30, [sp] //-------->[sp] 表示取出sp寄存器的值,将[sp]的值读出去存放到x30中
add sp, sp, #0x10
- adrp x0, 1
解读:
- 将**
1
的值,左移12位
, 即:等于1 0000 0000 0000 = 0x1000**- 将pc寄存器的
低12位
清零, 例如,pc寄存器位0x1000236874 , 低12位清零后为 0x1000236000(注意,12位等于12bit,等于3个16进制位
)- 将前面两步的结果相加 给x0寄存器,即 等于 0x1000237000
- larsw x10, [x8, x9, lsl #2]
解读:
以x8的地址为基地址
,加上x9的值向左偏移2位
取出计算的结果的内存地址存放的值
,赋值给x10
例如:x9 的值为1, 左移两位 等于4, 则x8 + 4 的值 给x10
后续学到了,继续更新~