-
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 | 空指令 |