目录
[ldr 与 str](#ldr 与 str)
[跳转指令 b 的分类与区别:b 、bl 、bx](#跳转指令 b 的分类与区别:b 、bl 、bx)
如何判断某个数是立即数?
- 如果某个数的数值范围在0x00 ~ oxff之间,那么这个数是立即数
- 把某个数展开成二进制,这个数的最高位的1到最低位的1之间的序列位数不能超过8位
- 如果这个二进制序列凑够8位之后,右边必须为偶数个连续的0
ldr 与 str
ldr:
- 功能① 向寄存器中加载一个非立即数 ldr <RD> , =<const>
- 功能② 将RAM中的数据加载到寄存器 ldr R0 , [R1,#<const>]
str: 当寄存器中的数据写入指定的RAM中
跳转指令 b 的分类与区别:b 、bl 、bx
b : branch 无条件跳转,当函数调用时,无法将返回地址保存到LR寄存器
bl : 函数调用时,会将返回地址保存到LR寄存器
bx : 跳转到LR寄存器对应的返回地址
栈的分类:空增栈,空减栈,满增栈,满减栈
空栈:先写数据再挪动指针
满栈:先挪动指针再写数据
增栈:入栈时,SP指针向上移动减栈:入栈时,SP指针向下移动
满减栈:*--SP,先让SP--,再写数据
汇编调用C语言传参时
如果参数少于或等于4个时,可以通过通用寄存器R0--R3进行传参,当参数超过4个时,必须通过栈进行传参(入栈保护,出栈恢复),C语言函数返回的结果保存到R0寄存器中
import 函数名引入函数
export 函数名导出函数
msr : 读取某个特殊寄存器的值到通用寄存器mrs : 把某个特殊寄存器的值写入到通用寄存器
主调函数要干的事:
- 入栈保护:stmde SP! , {要保护状态的寄存器名}
- 出栈恢复:ldmfd SP! , {要保护状态的寄存器名}
启动代码的主要任务
- 初始化异常向量表
- 初始化各工作模式的栈指针寄存器
- 开启ARM内核的中断允许
- 将工作模式设置为USER模式
- 完成上述工作后,引导程序进入C语言主函数执行
汇编中的置0、置1
bic: 将寄存器中的值某几位清零(取决于立即数那几位是1)
orr : 将寄存器中的值某几位置一(取决于立即数那几位是1)