arm汇编汇总
当初学stm32时因为一个想法,然后就走入了arm汇编的世界,这里就来汇总一下。
stm32的arm处理一般有7个运行模式,分别为:
① 用户模式(USR): 用于正常执行程序(The normal ARM program execution state)
② 快速中断模式(FIQ): 用于高速数据传输(Designed to support a data transfer or channel process)
③ 外部中断模式(IRQ): 用于通常的中断处理(Used for general-purpose interrupt handling)
④ 管理模式(SVC): 操作系统使用的保护模式(Protected mode for the operating system)
⑤ 数据访问终止模式(ABT): 当数据或指令预取终止时进入该模式(Entered after a data or instruction prefetch abort)
⑥ 系统模式(SYS): 运行具有特权的操作系统任务(A privileged user mode for the operating system)>
⑦ 未定义指令异常模式(UND): 当未定义的指令执行时进入该模式(Entered when an undefined instruction is executed)
<>注:ARM微处理器的运行模式可以通过软件改变(修改CPSR后5位),也可以通过中断或者异常处理改变
每个运行模式下访问的寄存器都有一定的区别
在ARM处理器内部共有37个用户可访问的寄存器,分别为
31个通用的32位寄存器和6个状态寄存器

其中的特殊寄存器:
r14:lr寄存器,用来保存pc值
r13:sp寄存器,栈顶寄存器
常用指令:
1 | mov r0,r1 ;r0 = r1 |
PS: “#0x1”是立即数,立即数是指,能够用0-255之内的数据循环右移偶数位得到的数
判断规则如下:
- 把数据转换成二进制形式,从低位到高位写成4位1组的形式,最高位一组不够4位的,在最高位前面补0。
- 数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。
- 如果数据中间有连续的大于等于24个0,循环左移2的倍数,使高位全为0。
- 找到最高位的1,去掉前面最大偶数个0。
- 找到最低位的1,去掉后面最大偶数个0。
- 数剩下的位数,如果小于等于8位,那么这个数就是立即数,反之就不是立即数。
函数调用规则:
- 函数调用时会执行“BL func”指令
- 函数参数传递通过r0~r4寄存器,多余参数通过栈传递
- 进入函数后会执行一条“push {lr}”指令(根据不同情况,会压入其它寄存器)
- 退出函数时通过r0返回结果,并执行“pop {pc}”(根据不同情况,会弹出其它值到另外的寄存器)
