-
ALU = 运算器(Arithmetic Logical Unit)
-
negative = 否定,负数
-
borrow = 借
-
verflowed = 溢出
-
ARM指令都是32位的,为了节省空间,Thumb指令将部分ARM指令进行压缩,是一种改进版的ARM指令架构
-
mrs 读 CPSR寄存器
-
msr 写 CPSR寄存器
-
软中断 = 软件模拟中断
要求:汇编指令会读就ok,不用会写
第一节 ARM介绍
你所接触的芯片几乎都是ARM,国产芯片也肯定是ARM架构,所以学习ARM的必要性
- 主要设计ARM系列RISC处理器内核,包括华为国内外的芯片厂商向ARM请求内核知识授权
- ARM高端可以向手机提供Cortex-A8等高端芯片,
中端可以提供crotex-R系列车联网的实时操作系统的中端芯片,
低端可以向单片机,传感器等提供廉价的Cortex-M系列的低端芯片
| ARM系统结构与ARM的CPU的区别 |
|---|
| ARMv4>>ARMv5>>ARMv6>>ARMv6 (RISC技术版本) |
| arm7 >> arm9 >> cortex (内核型号) |
| ARM只是设计芯片的CPU部分(运算器,控制器,寄存器) //芯片 != cpu |
第二讲 ARM汇编环境配置
2.2 安装并破解keil4
由于我们使用keil只是训练ARM汇编的功能,需要用三星的芯片练习ARM汇编,必须使用老版本的keil4
2.3 在keil中执行汇编程序
| 选择三星的单片机(ARM) | |
|---|---|
| 1: 在工程中新建一个汇编文件,并简单写入汇编代码 | |
|---|---|
| 2:配置link | |
| 2:编译没有error | |
| 3:debug调试 | |
第三节 ARM的7种工作模式与37个寄存器
| User | 大部分任务在此模式 |
|---|---|
| FIQ | 高优先级的中断使用该模式 |
| IRQ | 低优先级的中断使用该模式 |
| Supervisor = SVC | 复位时进入该模式 |
| Abort | 异常(存取异常)时进入该模式 |
| Undef | 异常(指令不能被识别)时进入该模式 |
| System | 特权模式 |
| 37个寄存器(32位) |
|---|
| 1个 PC (Program Counter) |
| 1个 CPSR(Current Program Status Register) |
| 5个 SPSR (Saved Program Status Registers) |
| 30个 通用寄存器 |
| user模式 | |
|---|---|
| fast interrupt | |
| interrupt | |
| superviser | |
| abort | |
| undefined | |
| 当前 | |
3.1 什么是机器码,什么是反汇编
3.2 ARM指令机器码的格式
第四节 汇编指令
| mov | mov r0,#1 mov r1,r0,LSL#2 //r0逻辑左移2位 = r0 × 4 mov r1,r0,LSR#2 //r0逻辑右移2位 r0 ÷ 4 |
|---|---|
| mrs | mrs r0,cpsr //读cpsr |
| msr | msr cpsr,r0 //写cpsr |
| cmp | cmp r0,#0 //c的if |
| eq 例如moveq 例如addeq 例如orreq | cmp r0,#0 moveq r1,#0 //如果上一个cmp r0,#0判断结果是equal(相等),则执行mov eq r1,#0 |
| addgt | cmp r0, #o moveq r1,#0 addgt r2,r1, #3 //如果cmp r0, #o结果>0,这执行addgt指令(addgt = add + gt =greate than) |
| ldr (与mov作用一致,可以操作大数值) | ldr r0,=0x8888888 |
| and | and r0, rl, #0xFF // r0=r1&0xFF |
| orr | orr r3, r0, #0x0F //r3= r0 |
| tst | tst r0, # 0x1 //测试r0的第1位是否为0 |
| bic | 清除位 |
| sub | sub r0,r1,#3 //r0=r1-3 sub ro,rl,r2,LSL#1 |
| add | add r0, rl, r2 // r0=rl+r2 |
| mul | mul rl, r2,r3 //rl=r2*r3 |
| b | b main //跳转到main代码处 |
| bl 实现中断的方法 | bl func //保存条要执行的指令的位置到LR寄存器,跳转函数func |
| beq | beq addr //CPSR的Z置位时,跳转到addr处 |
| bne | bne add //当CPSR的Z位没有置位时,跳转到地址addr |
| ldr 由flash存储器向cpu寄存器传递数据 | ldr r0,[r1] // r0 = *r1 ldr r0,[r1,#8] //r0 = *(r1+8) |
| store 由cpu寄存器向内存传递数据 | str r0,[r1,#4] //将r0写到r1+4地址中 str r0,[r1],#4 将r0写到r1地址中;将原来r1地址数据写到r1+4地址中 |
| .text | 代码段 |
| .data | 数据段 |
| .end | 文件结束 |
| .equ | .equ MAX 0X8888 //#define MAX 0X8888 |
| .byte | 定义一个字节变量 .byte ‘a’ //char ‘a’ |
| .word | 定义一个字变量 .word 0x12345678 //long 0x12345678 |
| .string | 定义字符串 .string “hello word\0” //char “hello word” |
| .global | 定义全局变量 .gloa _start // 声明_start为全局变量 |
| ldmia | ldmia r0!, {r3-r10} //r0里地址指向的内容批量,load到r3~r10寄存器中,r0里地址会自动加4 |
| stmia | stmia r0!,{r3-r10} //把r3~r10寄存器中内容,store到r0里地址执行空间中,r0里地址会自动加4 |
| stmfd | stmfd sp!, {r0-r12, lr} 将寄存器r0~r12 1r中的值存入栈中常用于中断保护现场,!表示会自动偏移 |
| ldmfd | ldmfd sp!, {r0-r12, pc}^ 将栈中值逐个弹出到寄存器r0~r12 pc中常用于中恢复断现场,表示会恢复spsr到cpsr |
| swi | swi 0x02 //产生软中断,软中断号为2 |
| lop | 空指令 |

京公网安备 11010502036488号