ARM体系结构与汇编指令

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org


(1).
ASIC专用芯片 到 可编程器件,
CPU在固定频率下,读取/解析/执行指令,
二进制文件被CPU读取进去,CPU内部电路对二进制文件解码,

其中二进制指令集是在CPU设计的时候确定的,


(2).
指令集对CPU的意义,
汇编语言:机器指令助记符,
机器指令是CPU设计者制定的,CPU内部电路设计就是为了实现这些指令集的功能,机器指令就好像CPU的API接口一样,
不同CPU的机器指令集设计不同,


(3).
RISC和CISC的区别,
CISC:complex instruction set computer,提供各种指令,一般由300条左右, 
RISC:ruduced instruction set computer, 仅提供最基本的指令,ARM CPU常用指令30条左右,


(4).
CPU的地址总线的位数是CPU设计时确定的,
CPU与内存的连接是直接连接,效率高,速度快,


与CPU连接的IO外设,
1.IO与内存统一编址,
2.独立编址,使用专用的CPU指令来访问某特定外设,


冯诺伊曼:PC,简单,安全和稳定是问题!
哈佛结构;ARM,复杂(需要统一规划链接地址等),安全稳定,程序一般放在ROM、flash中,数据一般放在RAM中,


(5).
寄存器属于CPU外设的硬件组成部分,是CPU的硬件设计者制定的,是编程控制的开关,是一种“API”,
通用寄存器:是CPU的组成部分,
特殊功能寄存器:SFR,存在于CPU的外设中,


访问寄存器的方法:
1.汇编方式,
ldr r1,=0xE0200280
str r0,[r1]
mov r0, #0
2.C语言方式,
int *p = (int *)0x30008000;
*p = 16;


(6).
服务器等高性能领域目前主导还是Intel,
ARM架构适合嵌入式,

哈佛结构也决定了ARM裸机程序(使用实地址即物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;对于OS之上的应用(工作在虚拟地址之中)则不需考虑这么多



(7).
S5PV210属于ARM Cortex-A8架构,32位CPU,设计时有32根地址线和32根数据线,
地址分配,地址映射,见下图,


ROM,在嵌入式中,就是FLASH,相当于PC中的硬盘,

RAM,你就可以理解为内存,

最好记住IROM,IRAM,DRAM0,DRAM1的地址,

DRAM0: 0x2000_0000~0x3FFF_FFFF

DRAM1: 0x4000_0000~0x7FFF_FFFF

IROM:    0xD000_0000~0xD000_FFFF

IRAM:    0xD002_0000~0xD003_7FFF



(8).

外部存储器,用于存储数据,ROM举例,FLASH就有Nand,iNand,U盘,SSD,

内存通过地址总线直接相连,外存不是,外存是通过一些外存接口来连接的,比如SD卡接口,eMMC接口,其中涉及一些时序的处理,复杂!

要不是上节的地址映射图中,我们4G的NAND,岂不是要把4G的地址空间全部占用了,

NorFlash,可以总线访问,接到SROM bank,
NandFlash
eMMC/iNand/moviNand,e代表embeded,
oneNAND,三星公司的,
SD卡/TF卡/MMC卡
eSSD
SATA硬盘

以上外部存储器,除了最后的硬盘,都是FLASH,

 

我们的板子,支持4个通道,其中SD0内部连着inand,SD1没有外接出来,SD2我们插SD卡即可食用,SD3没用,


(9).
内存,
SRAM,上电直接用,
DRAM,需要初始化才能用,


外存,
NorFlash:一般用启动介质,
NandFlash:同硬盘一样,需要初始化,然后通过时序接口来读写,


PC:BIOS(NorFlash)+硬盘(类似NandFlash)+DRAM,
嵌入式:Nand+DRAM+内置SRAM


S5PV210中;Nand+DRAM+内置SRAM+内置iROM,


启动过程;
1.CPU读取并执行iROM中代码(BL0),做一些基本初始化,然后判断并进入某种启动方式,从其中读取启动代码(BL1)到内部SRAM,
2.从SRAM运行上步读取的启动代码,然后执行,BL1这一段代码会初始化Nand,然后将BL2读取到iRAM,然后运行,
3.在iRAM中运行BL2,初始化DRAM,然后将OS从Nand读取到DRAM,然后启动OS,
见图,




(10).

主要看iROM文档介绍,


BL0做了什么?
1.关看门狗,
2.初始化指令cache,
3.初始化栈,
4.初始化堆,
5.初始化块设备复制函数,有多个函数从而支持多种启动,
6.设置SOC时钟系统,
7.复制BL1到内部iRAM
8.检查BL1的校验和,
9.跳转到BL1去执行,


不同级别的休眠,图4,


不同启动,图5


(11).
OMpin选择,可以不看,


(12).

ARM约定,字节Byte永远是8bits,而Halfword在这里是2Byte,word是4Byte,与VC中的有所不同,因此一定要弄清楚,你是在哪个环境下编程,

 

Thumb2,你可以理解为Thumb & ARM,即16位&32位,


ARM的7种模式,
用户模式:user
异常模式,特权模式;FIQ,IRQ,Supervisor(SVC,复位或者软中断),Abort(存取异常),Undef,System,
特权模式:system,

记忆方法:user是非特权模式,其它都是特权模式,特权模式中system模式和其它几个(即异常模式)不同,


模式的切换和寄存器的不同,自动切换或者通过操作CPSR,


软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级要求,


(13).
ARM的37个寄存器,
图6,寄存器,影子寄存器(banked register),不同模式下,有名字看起来一样的寄存器,实际不是同一个,


图7,CPSR,


(14).
中断时异常的一种,
异常向量表,CPU设计时定好的,硬件决定的,为软件处理异常提供支持,
图8,


(15)~(16).
指令,
伪指令;指导编译过程,编译后不生成机器码,


ARM汇编风格;LDR R0,[R1]
GNU汇编风格:ldr r0,[r1]


LDR/STR架构,RISC架构CPU本身不直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器才能被CPU处理,
ldr(load register)指令将内存内容加载入通用寄存器,
str(store register)指令将寄存器内容存入内存空间中,


8种寻址方式;
寄存器寻址: mov r1,r2 
立即寻址: mov r0,#0xFF00
寄存器移位寻址 mov r0,r1,lsl#3
寄存器间接寻址 ldr r1,[r2]
基址变址寻址 ldr r1,[r2,#4]
多寄存器寻址 ldmia r1!,{r2——r7,r12} //往r1中加载,r1可以理解为数组,
堆栈寻址 stmfd sp!,{r2-r7,lr}
相对寻址: beq flag //flag是一个标号,


指令后缀:
B(Byte),功能不变,操作长度变为8位,
H(half word),功能不变,操作长度变为16位,
S(signed),功能不变,操作数变为有符号数,
S(S标志,放心和上面没重复),功能不变,影响CRSR标志位,比如mov和movs,

moveq r1,r2
条件执行后缀:
1.条件执行后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果,
2.条件后缀决定了本句代码是否执行,不会影响上一句和下一句是否被执行,


流水线:3级(取指,解码,执行)流水线,PC与正在执行指令相差(3-1=2)个周期,


(17).
mov r1,r0 @在两个寄存器之间传递数据
mov r1,#0xff @将立即数赋值给寄存器


mov,mvn区别是按位取反,


eor 逻辑异或,


bit 位清除,
bic r0,r1,#0x1f@将r1中的数bit0到bit4清零后赋值给r0,


mrs(读),msr(写),cpsr访问指令,
mrs r0,cpsr
@...
@对r0中值进行处理
@...
msr cpsr,r0


b 直接跳转,
bl 跳转并保存返回地址到lr,


多字批量访问,
ldm/stm 


立即数,前面加#,
合法立即数:经过移位后非0不超过8位,


swi,software interrupt,


(18).
mcr(写),mrc(读),读写协处理器,
协处理器和MMU,cache,TLB等处理有关,功能上和操作系统的虚拟地址映射,cache管理等有关,


用法张得好奇怪,
       /*
        * disable MMU stuff and caches
        */
        mrc p15, 0, r0, c1, c0, 0
        bic r0, r0, #0x00002000     @ clear bits 13 (--V-)
        bic r0, r0, #0x00000007     @ clear bits 2:0 (-CAM)
        orr r0, r0, #0x00000002     @ set bit 1 (--A-) Align
        orr r0, r0, #0x00000800     @ set bit 12 (Z---) BTB
        mcr p15, 0, r0, c1, c0, 0

(19).
ldr/str每周期只能访问4字节内存,
于是,出现
ldm(load  register mutiple),
stm(store register mutiple),
又是好多后缀,烦躁~ia啊,ib啊,


空栈/满栈,
增栈/减栈,




ldmfd sp!,{r0-r6,pc}
ldmfd sp!,{r0-r6,pc}^
!作用,sp中的值在变化中是否保存,
^作用,在目标寄存器中有pc时,会同时将spsr写入cpsr,一般用于从异常模式返回,
我们常用就stmia和stmfd,


(20).
@这里是注释,下面是标号,
flag:b flag
或者
b .
.代表当前地址,
#0x1f @这是个立即数
.globl _start @添加外部链接属性,
.word @可以当作unsigned int
.align 4 @2^4=16字节对齐,
.end @标识文件结束
.include @头文件包含


ldr 大范围地址加载指令
adr 小范围地址加载指令
adrl 中等范围地址加载指令
nop 空指令

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARM体系结构与编程PDF是一本关于ARM架构和编程的电子书,它主要介绍了ARM处理器的体系结构和相关的编程知识。 首先,ARM体系结构与编程PDF详细介绍了ARM架构的基本概念和特点。ARM架构是一种常见的嵌入式处理器架构,广泛应用于移动设备、嵌入式系统、智能家居等领域。了解ARM架构的基本概念对于学习和理解如何正确地编写ARM程序至关重要。 其次,ARM体系结构与编程PDF讲解了ARM指令集的设计和特点。ARM指令集是用于编写ARM程序的一组指令,它包括了各种数据处理、控制流和存储操作等功能。学习ARM指令集的使用方法和特点,能够帮助我们编写高效、稳定的ARM程序。 此外,ARM体系结构与编程PDF还介绍了ARM开发工具的使用。ARM开发工具是用于编写、编译和调试ARM程序的软件,例如ARM指令集模拟器、ARM汇编器和调试器等。学会使用ARM开发工具能够提高我们的ARM编程效率和调试能力。 最后,ARM体系结构与编程PDF提供了一些ARM编程的示例和实践。通过这些实例和实践,我们可以深入了解如何在ARM处理器上编写各种应用程序,例如嵌入式系统的驱动程序、图像处理算法和网络通信等。这些实例和实践能够帮助我们加深对ARM编程的理解和掌握。 总的来说,ARM体系结构与编程PDF是一本系统全面介绍ARM架构和编程的电子书。通过学习和掌握其中的知识,我们可以成为一名专业的ARM程序员,并能够在各种嵌入式系统和应用中灵活运用ARM处理器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值