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