D1 - ARM基础

本文深入解析ARM架构的重要性和应用范围,涵盖从高端Cortex-A8芯片到低端Cortex-M系列的全面介绍。详细阐述了ARM指令集、工作模式、寄存器系统及关键汇编指令,如mov、mrs、msr、cmp、ldr、str等,为初学者提供了清晰的学习路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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指令机器码的格式

在这里插入图片描述

第四节 汇编指令

movmov r0,#1

mov r1,r0,LSL#2 //r0逻辑左移2位 = r0 × 4

mov r1,r0,LSR#2 //r0逻辑右移2位 r0 ÷ 4
mrsmrs r0,cpsr //读cpsr
msrmsr cpsr,r0 //写cpsr
cmpcmp r0,#0 //c的if
eq
例如moveq
例如addeq
例如orreq
cmp r0,#0
moveq r1,#0
//如果上一个cmp r0,#0判断结果是equal(相等),则执行mov eq r1,#0
addgtcmp r0, #o
moveq r1,#0
addgt r2,r1, #3
//如果cmp r0, #o结果>0,这执行addgt指令(addgt = add + gt =greate than)
ldr
(与mov作用一致,可以操作大数值)
ldr r0,=0x8888888
andand r0, rl, #0xFF // r0=r1&0xFF
orrorr r3, r0, #0x0F //r3= r0
tsttst r0, # 0x1 //测试r0的第1位是否为0
bic清除位
subsub r0,r1,#3 //r0=r1-3

sub ro,rl,r2,LSL#1
addadd r0, rl, r2 // r0=rl+r2
mulmul rl, r2,r3 //rl=r2*r3
bb main //跳转到main代码处
bl
实现中断的方法
bl func //保存条要执行的指令的位置到LR寄存器,跳转函数func
beqbeq addr //CPSR的Z置位时,跳转到addr处
bnebne 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为全局变量
ldmialdmia r0!, {r3-r10} //r0里地址指向的内容批量,load到r3~r10寄存器中,r0里地址会自动加4
stmiastmia r0!,{r3-r10}
//把r3~r10寄存器中内容,store到r0里地址执行空间中,r0里地址会自动加4
stmfdstmfd sp!, {r0-r12, lr}

将寄存器r0~r12 1r中的值存入栈中常用于中断保护现场,!表示会自动偏移
ldmfdldmfd sp!, {r0-r12, pc}^

将栈中值逐个弹出到寄存器r0~r12 pc中常用于中恢复断现场,表示会恢复spsr到cpsr
swiswi 0x02 //产生软中断,软中断号为2
lop空指令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值