1.寄存器
通用寄存器
(1)64bit: x0-x28
(2)32bit:w0-w28(属于x0-x28低32bit)
(3)x0-x7通常用来存放函数的参数,更多的参数使用堆栈来传递
(4)x0通常作为函数返回值
程序计数器
pc(Program Counter)
记录CPU当前执行的是哪一条指令
存储着当前CPU正在执行的指令地址
类似于8086汇编的ip寄存器
堆栈指针
链接寄存器
lr(Link Register), 也就是x30
存储着函数的返回地址
程序状态寄存器
cpsr(current program status register)
2.指令
(1)ret:返回
将lr(x30)寄存器的值赋值给pc
(2)mov:全称move,把后面内容的移动到前面寄存器
mov x0, #0x8
(3)add:将后面x0+x1,赋给x2
mov x0, #0x1
mov x1, #0x2
add x2, x0, x1
(4)sub:将后面x0-x1,赋给第x2
mov x0, #0x5
mov x1, #0x2
sub x2, x0, x1
(5)cmp:比较指令,x0 - x1,并根据结果设置CPSR的标志位
mov x0, #0x3
mov x1, #0x1
cmp x0, x1
(6)b:跳转指令,b直接跳转到mycode对应的地址
b(条件) 目标地址
b mycode
mov x0, #0x5
mycode:
mov x1, #0x6
(7) bl:带返回的跳转指令
bl(条件) 目标地址 (类似函数调用)
执行的操作:(1)将下一条指令的地址存储到lr(x30)寄存器中(2)跳转到标记处,执行代码
(8)ldr:从内存中读取数据
ldr x0, [x1] ;(x1里面存的是地址 取出一定大小的数据 数据大小取决于x0的大小)
ldr x0, [x1, #0x4] (取x1中存的地址 加上立即数0x4 , 最终地址中的数据 赋给x0)
ldr x0, [x1, #0x4]! ;(同上 多了一个 x1中的地址值 等于最终地址值)
(9)ldur:去内存中的数据放到寄存器
ldur x0, [x1, #-0x4] ;立即数为负
(10)ldp:从内存中读取数据,放到一对寄存器中(p是pair的简称,一对的意思)
ldp w0, w1, [x1, #0x4]
(11)str:往内存中写入数据
str w0,[x1, #0x4] ;把w0寄存器中的数据放到x1内存中
stur w0, [x1, #-0x4]
stp w0, w1, [x1, #0x4]
(12)条件域(跟在指令后并没有空格):bl:带返回的跳转指令
EQ:equal,相等
NE:not equal, 不相等
GT:great than, 大于
GE:great or equal, 大于等于
LT:less than, 小于
LE:less or equal, 小宇等于
beq mycode(找CPSR中Z位 1就跳, 不是1 就不跳,也就是之前结果为0就跳)
(13)内存操作
网友评论