ARM day4 汇编及硬件编程

一、指令--数据从内存到cpu--ldr、str

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| load -- 加载 读 store -- 存储 写 在ARM 架构下, 数据从内存到cpu 直接的移动只能通过 LDR/STR来完成 mov 只能在寄存器之间移动数据 ,或把立即数移动到寄存器 ,并且数据长度不能超过 8 位 |
| str r2, [r0] //把r2 的数据 存储(写)到 r0 地址 *((int *) r0) = r2 往右写 ldr r1, [r0] // 把r0 地址中的数据 加载(读)到 r1 中 r1 = *((int *) r0) 往左读 |
| 三种索引方式: LDR R0,[R1, #4] //r0 = *((int *)(r1 + 4)) 只读取数据 LDR R0,[R1, #4]! // r0 = *((int *)(r1 + 4)) r1 += 4 读取数据且更新r1地址 LDR R0, [r1],#4 //r0 = *((int *)r1) r1 += 4 读取数据后更新r1地址? |

二、pre or post indexed寻址

|------|-------|
| ldrb | 存一个数据 |
| ldrh | 存两个数据 |
| ldr | 存四个数据 |

三、stmXX / ldmXX

|-------------------|-----------------------|
| stm ---store much | 多数据存储(写),将寄存器的值 存到地址上 |
| ldm --- load much | 多数据加载(读),将地址上的值加载到寄存器 |

XX有八种类型

|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
| IA(increase After ) | 每次传送后地址加 4 ,寄存器从左到右执行 STMIA R0, {R1, LR} //先存R1, 将R0的地址 加上4 再存 LR LDMIA R0, {r0,r1,r2} //将r0 地址中的值 逐个写入 寄存器 r0, r1, r2 |
| IB(increase Before ) | 每次传送前 地址加 4 ,同上 |
| DA (decrease After) | 每次传送后 地址 减 4寄存器从右往左执行 STMDA R0, {r1, lr} //先存LR,再存 r1 |
| DB(decrease Before) | 每次传送前 地址减4 ,同上 |
| FD满递减堆栈 | 每次传递前 地址减4 (LDMFD--LDMIA STMFD--STMDB ) |
| FA满递增堆栈 | 每次传送后地址减4 (LDMFA--LDMDA; STMFA--STMIB) |
| ED空递减堆栈 | 每次传送前地址加4 (LDMED--LDMIB; STMED--STMDA) |
| EA空递增堆栈 | 每次传送后地址加4 (LDMEA--LDMDB; STMEA--STMIA) |
| 四种栈 | 空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出 满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针 增栈:栈指针移动时向地址增加的方向移动的栈 减栈:栈指针移动时向地址减小的方向移动的栈 |

eg: 一般出栈/入栈

ldmfd sp!,{r0,r1,r2} //将sp中值逐个写入到寄存器r0 R1 R2中

stmfd sp!,{r0,r1,r2} //将寄存器r0 R1 R2中逐个写入到sp中

重要:异常处理

ldmfd sp!,{r0-r12,pc}^ --- 出栈 恢复现场

stmfd sp!,{r0-r12,lr} --- 入栈 保护现场

SP后面的!表示要更新sp的值 sp -= n

^的作用:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回。

四、中断和异常

|------------------|---------------------------------------------------------------|
| 异常的定义 | 芯片内部的调度 |
| 异常(exception )机制 | 处理器,顺序执行程序指令的过程中,突然遇到异常的事情,而中止执行的当前程序,转而去处理异常。 |
| 异常与中断的最大区别 | 中断--外部因素引起 异常--内部因素引起 (内因:本身硬件故障,程序故障,非法指令,或执行等特殊的系统服务指令等引起的) |

异常源

|-------------------------------------------------------------------------------------------------------------------------------|
| 1、复位异常 reset 2、数据异常 data abort 3、FIQ 异常 fiq 4、IRQ 异常 irq 5、预取指 异常 prefetch abort 6、软中断 异常 swi 7、未定义指令异常 undefined instruction |

异常优先级

|------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 异常优先级{ 异常在当前指令完成后才会被响应 多个异常 在同一时间产生 异常指定优先级和固定服务顺序(从高到低 ) } 为什么FIQ的响应速度比IRQ快? FIQ优先级更高 FIQ向量位于异常向量表的最末,异常处理程序可以从异常量处连续执行 FIQ有五个额外的私有寄存器,中断处理必须保护其使用的非私有寄存器 |

异常处理过程

相关推荐
Tlog嵌入式12 小时前
蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键
arm开发·stm32·单片机·mcu·物联网·蓝桥杯·iot
Q8343158191 天前
华为 海思22AP10(SS524)H.265 编解码处理器用户指南
arm开发·人工智能·嵌入式硬件·音视频·硬件工程·h.265·视频编解码
星羽空间1 天前
win11下 keil报错Cannot load driver ‘D:\Keil_v5\ARM\Segger\JL2CM3.dll‘
arm开发·keil
日晨难再1 天前
AMBA:APB的历史(从APB1到APB5)
arm开发·arm·硬件工程·fpga·数字ic
Tlog嵌入式2 天前
蓝桥杯【物联网】零基础到国奖之路:十八. 扩展模块之光敏和AS312
arm开发·stm32·单片机·mcu·物联网·蓝桥杯·iot
汽车电子助手2 天前
【STM32开发环境搭建】-4-在STM32CubeMX中新增Keil(MDK-ARM) 5的工程目录(包含指定路径的C和H文件)
c语言·arm开发·stm32·stm32cubemx·keil
海滩游侠2 天前
ARM Assembly 6: Shift 和 Rotate
arm开发
htx nb3 天前
ARM 架构、cpu
arm开发
极客小张3 天前
基于STM32的远程工业控制系统架构设计:MQTT通信、React界面与FreeRTOS优化的综合应用
c语言·arm开发·stm32·物联网·算法·react.js·毕业设计
勾栏听曲_03 天前
ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)
c语言·arm开发·单片机·嵌入式硬件·硬件工程