S5PV210系列(裸机三)ARM体系结构与汇编指令
2017-05-09 15:58
337 查看
指令与伪指令
(汇编)指令是 CPU 机器指令的助记符,经过编译后会得到一串 1、0 组成的机器码,可以由 CPU 读取执行。 (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。
合法立即数与非法立即数
两种不同风格的ARM指令
ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如: LDR R0, [R1] GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, [r1]
ARM汇编特点
1、LDR/STR架构: ARM 采用 RISC 架构,CPU 本身不能直接读取内存,而需要先将内存中内容加载入 CPU 中通用寄存器中才能被CPU处理。 ldr(load register)指令将内存内容加载入通用寄存器。 str(store register)指令将寄存器内容存入内存空间中。 ldr/str 组合用来实现 ARM CPU 和内存数据交换 2、8种寻址方式: 寄存器寻址 mov r1, r2 立即寻址 mov r0, #0xFF00 寄存器移位寻址 mov r0, r1, lsl #3 寄存器间接寻址 ldr r1, [r2] 基址变址寻址 ldr r1, [r2, #4] 多寄存器寻址 ldmia r1!, {r2-r7, r12} 堆栈寻址 stmfd sp!, {r2-r7, lr} 相对寻址 beq flag 3、指令后缀: 同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有: B(byte)功能不变,操作长度变为8位 H(half word)功能不变,长度变为16位 S(signed)功能不变,操作数变为有符号 如 ldr ldrb ldrh ldrsb ldrsh S(S标志)功能不变,影响CPSR标志位 如 mov和movs movs r0, #0 4、多级指令流水线: 为增加处理器指令流的速度,ARM使用多级流水线,下图为3级流水线工作原理示意图。(S5PV210使用13级流水线,ARM11为8级) 允许多个操作同时处理,而非顺序执行。
5、条件执行后缀:
数据处理指令
数据传输指令 mov mvn mov(move) mov r1, r0 @两个寄存器之间数据传递 mov r1, #0xff @ 将立即数赋值给寄存器 mvn和mov用法一样,区别是mov是原封不动的传递,而mvn是按位取反后传递 算术指令 add sub rsb adc sbc rsc sub r2, r0, r1 (r2 = r0 - r1) 逻辑指令 and orr eor bic bic 位清除指令 bic r0,r1,#0x1f @ 将r1中的数的bit0到bit4清零后赋值给r0 比较指令 cmp cmn tst teq cmp cmp r0, r1 等价于 sub r2, r0, r1 (r2 = r0 - r1) cmn cmn r0, r1 等价于 add r0, r1 tst tst r0, #0xf @测试r0的bit0~bit3是否全为0 teq 比较指令用来比较2个寄存器中的数 注意:比较指令不用后加s后缀就可以影响cpsr中的标志位。 乘法指令 mvl mla umull umlal smull smlal 前导零计数 clz 跳转(分支)指令 b & bl & bx b 直接跳转(就没打开算返回) bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用 bx跳转同时切换到ARM模式,一般用于异常处理的跳转。
cpsr访问指令
mrs & msr mrs用来读psr,msr用来写psr CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。
cpsr和spsr的区别和联系
cpsr 是程序状态寄存器,整个 SoC 中只有 1 个;而 spsr 有 5 个,分别在 5 种异常模式下,作用是当从普通模式进入异常模式时,用来保存之前普通模式下的cpsr 的,以在返回普通模式时恢复原来的 cpsr。 跳转(分支)指令
访存指令
ldr/str & ldm/stm & swp 单个字/半字/字节访问 ldr/str 多字批量访问 ldm/stm swp r1, r2, [r0] swp r1, r1, [r0]
软中断指令
swi(software interrupt) 软中断指令用来实现操作系统中系统调用
协处理器和协处理器指令详解
什么是协处理器 SoC 内部另一处理核心,协助 主CPU 实现某些功能,被 主CPU 调用执行一定任务。 ARM 设计上支持多达 16 个协处理器,但是一般 SoC 只实现其中的 CP15(cp:coprocessor) 协处理器和 MMU、cache、TLB 等处理有关,功能上和操作系统的虚拟地址映射、cache 管理等有关。
协处理器 cp15 操作指令 mcr & mrc mrc 用于读取 CP15 中的寄存器 mcr 用于写入 CP15 中的寄存器 MRC & MCR的使用方法 mcr{<cond>} p15, <opcode_1>, <Rd>, <Crn>, <Crm>, {<opcode_2>} opcode_1:对于cp15永远为0 Rd:ARM的普通寄存器 Crn:cp15的寄存器,合法值是c0~c15 Crm:cp15的寄存器,一般均设为c0 opcode_2:一般省略或为0 举例: mrc p15, 0, r0, c1, c0, 0 orr r0, r0, #1 mcr p15, 0, r0, c1, c0, 0 协处理器学习要点 不必深究,将 uboot 中和 kernel 中起始代码中的一般操作搞明白即可。 只看一般用法,不详细区分参数细节,否则会陷入很多复杂未知中。 关键在于理解,而不在于记住。
ARM的异常处理机制
当异常产生时, ARM core: 拷贝 CPSR 到 SPSR_<mode> 设置适当的 CPSR 位: 改变处理器状态进入 ARM 态 改变处理器模式进入相应的异常模式 设置中断禁止位禁止相应中断 (如果需要) 保存返回地址到 LR_<mode> 设置 PC 为相应的异常向量 返回时, 异常处理需要: 从 SPSR_<mode>恢复CPSR 从LR_<mode>恢复PC Note:这些操作只能在 ARM 态执行. 异常处理中有一些是硬件自动做的,有一些是程序员需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何写代码。 以上说的是CPU设计时提供的异常向量表,一般成为一级向量表。有些CPU为了支持多个中断,还会提供二级中断向量表,处理思路类似于这里说的一级中断向量表。
相关文章推荐
- ARM裸机-1.ARM体系结构和简单的汇编指令
- ARM的体系结构与编程系列博客——ARM体系变种
- ARM的体系结构与编程系列博客——ARM体系版本
- S5PV210系列 (裸机十三)之解决X210开发板的软开关按键问题
- S5PV210系列 (裸机十七)之 LCD显示器
- S5PV210系列 (裸机十七) 之 ADC
- ARM体系结构和处理器系列
- S5PV210系列 (裸机十一)之 定时器、看门狗和RTC(二)
- S5PV210系列 (裸机十一)之 定时器、看门狗和RTC(一)
- SylixOS动态加载器系列文章(7) ARM体系结构相关
- S5PV210系列(裸机五)之关看门狗、设置栈、开iCache
- S5PV210系列(裸机四)mkv210_image.c文件详解
- S5PV210系列 (裸机十二)之 SD 卡启动详解
- S5PV210系列(裸机九)之 串口通信
- ARM的体系结构与编程系列博客——ARM体系变种
- S5PV210系列(裸机二) ARM的编程模式、7种模式和37个寄存器
- S5PV210系列(裸机七)之 SDRAM
- S5PV210系列 (裸机十五)之 iNand
- 05-ARM体系结构与常用汇编指令
- S5PV210系列 (裸机十)之按键和CPU的中断系统(二)