一,代码
1,基础代码
mov r0,#1 将r0寄存器置1
mov r0,r2 将r2寄存器值赋予r0寄存器
mov r1,r0,lsr #4 等价于r0>>4 将r0中数右移4位后赋予r1 (二进制右移
mvn r0,r2 将r2值取反后赋予r0
ldr r0,=0x5222 将r0寄存器赋予指定的值
add/sub/subs/mul 目标寄存器 被加/减寄存器值 加上/减去的值
add r2,r0,r1 将r0+r1后的值赋予r2 想改变cpsr中的值需要加s 如subs
b func 跳入func中不更新lr
bl func 跳入func 并且更新lr
2,比较代码,内存地址的写入与读出
cmp r0,r1 比较r0,r1寄存器中值的大小 (后续判读实际根据cpsr寄存器中内容
add后缀 目标寄存器 r0, r1 将r0,r1中的值进行具体的操作后保存至r0
如addgt r2,r0,r1 配合上方cmp 如果r0大于r1 将r0+r1后的值保存至r2 后缀gt表示大于
ldr r1,[r0] r1 = *r0 将r0内存中的值保存至r1寄存器
ldr r1,[r0,#4] ldr r1,[r0,#4]! ldr r1,[r0],#4
r1 = *(r0 + 4) r1 = *(r0 + 4);r0 += 4 r1 = *(r0);r0 += 4 分别代表的含义如下
读r0偏移四位的地址的内容 r0保存的地址不变
读r0偏移四位的地址的内容 r0保存的地址改变
读r0原本地址保存的内容 偏移四位 r0地址改变
将寄存器内容写入内存如上图 同理
stmia/ib/da/db 表示将多个寄存器的值存入一块内存
ldmia/ib/da/db 表示将一块内存的值加载入多个寄存器 都是一块内存
根据后缀顺序判断先读还是先改变地址 比如ia是increase after 表示后增加 即先读写
例子:先mov r0,#0x40000000
stmia r0!,{r1-r3,r5} 将多个寄存器内容顺序写入 r0
如0x40000000 保存r1 0x40000004保存r2
因为是ia所以是先读写后增加最后r0地址为0x40000010(无感叹号r0地址不会变还为0x40000000 )
栈操作指令 stmfa/fd/ea/ed 分别表示满递增,满递减,空递增,空递减
其中满表示在执行完此条命令后sp指向最后压入的栈区有效数据项(一般可理解为指向有数的地址
用上面的stm ldm也可出栈入栈 stmfa sp!,{r1,r2} 与 stmdb sp!,{r1,r2} 效果相同
表示先减地址后读写 所以最后会指向有效数据
3,cpsr状态寄存器的写入与读出
mrs r0,cpsr 将cpsr内容传送到r0寄存器 msr cpsr,r0 将r0内容传送到cpsr寄存器
(rs sr怎么分 cpsr在哪s就在哪 cpsr在后 s就在后
cpsr不能直接用bic进行置0,需要取出后借助别的寄存器清0后再存入
二,重要知识点
1,cpsr寄存器各个位代表含义
在一中提到用subs才能使cpsr改变 即为负数时n位的改变
2个32位数字相加变为32位 产生进位,c置1 减法时候减不掉需向高位借位,c置0
超出类型范围 比如超出了char的-128 ~127 v置1
2,后缀条件码
NE-不相等 EQ-相等 GT-大于 LT-小于 GE-大于等于 LE-小于等于
用于多种代码 如cmp判断后addge 或者在cmp后ble func 代表小于等于时才跳入func中
3,立即数
只有是立即数时候才能用mov给寄存器赋值 否则需要用ldr r0,=....来赋值
首先将这个数转换为32bit的16进制形式,例如218=0xDA=0000000DA
0-255一定是立即数,为二位数时,必须相连,首尾相连也算
为三位数时,相连,中间数无要求,最高位取值仅能为1、2、3,最低位取值仅能为4
4,跳转指令
b func 跳入func中不更新lr bl func 跳入func 并且更新lr
其中lr为b func 下一行代码的地址 跳转指令需要在±32m大小内 否则需要用ldr pc,=...来跳转
其中pc为当前运行的代码的地址
5,and,bic等位置指令
and,orr,eor为与,或,异或指令 格式皆为and 目标寄存器 操作数1 操作数2
bic格式为 目标寄存器=操作数1&~(操作数2) 可用于给数置0
6,各个寄存器特殊含义
R0-R10 | 存放用户数据 |
R11(FP) | 记录一个栈空间开始地址 |
R12(IP) | 临时存放sp |
R13(SP) | 栈指针 |
R14(LR) | 返回地址,通常为特定代码下一行的地址 |
R15(PC) | 通俗理解为软件上看见的当前运行代码地址 |
7,ARM体系流水线作业
为了加快运行效率,采用了多个操作同时处理的方法
8,伪指令