IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> (一)ARM体系结构与汇编指令 -> 正文阅读

[嵌入式](一)ARM体系结构与汇编指令

(一)ARM体系结构与汇编指令

前言

以下学习笔记是基于朱老师(朱有鹏)的ARM裸机学习中的内容开发板使用的是s5pv210,记录自己的学习过程希望以下内容也能对其他小伙伴有所帮助。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是汇编?

1.汇编

汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

2.汇编与c语言的区别

1)汇编难写,c好写
2)汇编无可移植性,c具有一定的可移植性。
3)汇编语言效率最高,c语言次之
4)汇编语言不适合完成大型复杂项目,更高级的语言适合完成大型项目

汇编语言的本质:是机器指令(机器码)的助记符,是一种低级符号语言。
机器指令集是一款cpu的编程特征是这款CPU的设计者制定的,CPU的指令集就相当于API。
不同CPU的机器指令集设计不同因此汇编程序不能再不同的CPU间互相移值
语言越高级越接近人的思维,语言越低级越接近机器思维

二、RISC、CISC、哈佛、冯洛伊曼

1.CISC

complex instruction set computer复杂指令集CPU
CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可)
因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计

2.RISC

Reduced Instruction-Set Computer精简指令集CPU
RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集。
因此RISC CPU的指令集中只有很少的指令,这种设计相对于CISC,CPU的设计和工艺简单了,但是编译器的设计变难了
一般典型CISC CPU指令在300条左右
ARM CPU常用指令30条左右

3.哈佛结构 与 冯洛伊曼结构

程序和数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构。譬如Intel的CPU均采用冯诺依曼结构。
程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分的单片机(MCS51、ARM9等)均采用哈佛结构。
冯诺依曼结构中程序和数据不区分的放在一起,因此安全和稳定性是个问题,好处是处理起来简单。
哈佛结构中程序(一般放在ROM、flash中)和数据(一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)

三、访问方式

1.IO与内存统一编址方式

该访问的方式形象的来说 类似于内存的访问,即把外设寄存器当做一个内存地址来读写,从而以访问内存相同的方式来操作外设

2.IO与内存独立编址

该方式使用专用的CPU指令来访问莫种特定外设,这种方式和我们上面所提到的CISC结构符合,对外设的操作通过一定的指令来实现

3.二者优缺点

由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高。
IO与内存统一编址方式,优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源。
IO与内存独立编织方式,优势是 不占用CPU地址空间,缺点是CPU设计变复杂了

四、寄存器详解

1.什么是寄存器

寄存器属于CPU外设的硬件组成部分
CPU可以像访问内存一样访问寄存器
寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关”
正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器

基于s5pv210中寄存器主要包括两类寄存器
1.通用寄存器(37个通过寄存器)
2.SFR寄存器(特殊功能寄存器)
3.在后面学习过程中会大量的对着两类寄存器进行使用

在这里插入图片描述

在这里插入图片描述

2.汇编指令访问

//1.寄存器方式访问内存
ldr r1, =0xE0200280 //ldr 指令将0xE020080这个地址加载到r1寄存器中
str r0, [r1] //str指令将r0赋值到r1所指地址的内存中
mov r0, #0 //将立即数0移到r0中

//2.c语言形式访问
int *p = (int *)0x30008000;
*p = 16;

五、常见汇编指令集

1.指令和伪指令

(汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。
(汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码

2.两种不同风格的ARM指令

ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如: LDR R0, [R1]
GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, [r1]

3.汇编特点

ldr /str结构与寻址方式

ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。
ldr(load register)指令将内存内容加载入通用寄存器。
str(store register)指令将寄存器内容存入内存空间中。
ldr/str组合用来实现 ARM CPU和内存数据交换

8种寻址方式


寄存器寻址			mov r1, r2
立即寻址				mov r0, #0xFF00
寄存器移位寻址		mov r0, r1, lsl #3
寄存器间接寻址		ldr r1, [r2]
基址变址寻址			ldr r1, [r2, #4]
多寄存器寻址			ldmia r1!, {r2-r7, r12}
堆栈寻址				stmfd sp!, {r2-r7, lr}
相对寻址		        beq flag

指令后缀

//同一指令经常附带不同后缀,变成不同的指令。
经常使用的后缀有:
B(byte)功能不变,操作长度变为8位
H(half word)功能不变,长度变为16位
S(signed)功能不变,操作数变为有符号
如 ldr ldrb ldrh ldrsb ldrsh
S(S标志)功能不变,影响CPSR标志位
如 mov和movs		movs r0, #0

条件执行后缀
在这里插入图片描述

4.常用指令

数据处理指令

数据传输指令	mov mvn
算术指令		add sub rsb adc sbc rsc 
逻辑指令		and orr eor bic
比较指令		cmp cmn tst teq
乘法指令		mvl mla umull umlal smull smlal
前导零计数		clz

cpsr访问指令

mrs & msr
mrs用来读psr,msr用来写psr
CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。

跳转分支指令

b & bl & bx
b 直接跳转(就没打开算返回)
bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用
bx跳转同时切换到ARM模式,一般用于异常处理的跳转。

访存指令

ldr/str &	ldm/stm & swp
单个字/半字/字节访问 ldr/str
多字批量访问  ldm/stm
swp r1, r2, [r0]
swp r1, r1, [r0]
ARM中的立即数
合法立即数与非法立即数
ARM指令都是32位,除了指令标记和操作标记外,
本身只能附带很少位数的立即数。
因此立即数有合法和非法之分。
合法立即数:
经过任意位数的移位后非零部分可以用8位表示
即为合法立即数

软中断指令

swi(software interrupt)
软中断指令用来实现操作系统中系统调用

协处理指令

mcr & mrc
mrc用于读取CP15中的寄存器
mcr用于写入CP15中的寄存器


//什么是协处理器
SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务。
ARM设计上支持多达16个协处理器,但是一般SoC只实现其中的CP15.(cp:coprocessor)
协处理器和MMU、cache、TLB等处理有关,功能上和操作系统的虚拟地址映射、cache管理等有关。

//mcr mrc使用方法
mcr{<cond>}   p15, <opcode_1>, <Rd>, <Crn>, <Crm>, {<opcode_2>}
opcode_1:对于cp15永远为0
Rd:ARM的普通寄存器
Crn:cp15的寄存器,合法值是c0~c15
Crm:cp15的寄存器,一般均设为c0
opcode_2:一般省略或为0

//eg
mrc p15, 0, r0, c1, c0, 0
orr	r0, r0, #1
mcr p15, 0, r0, c1, c0, 0

5.伪指令

伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
伪指令的意义在于指导编译过程。
伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。

gnu中的一些符号及gnu伪指令

@ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似
# 做注释,一般放在行首,表示这一行都是注释而不是代码。
:以冒号结尾的是标号
.  点号在gnu汇编中表示当前指令的地址
# 立即数前面要加#或$,表示这是个立即数

.global _start		@ 给_start外部链接属性
.section .text		@ 指定当前段为代码段
.ascii .byte .short .long .word 
.quad .float .string @ 定义数据
.align 4			@ 以16字节对齐
.balignl 16 0xabcdefgh 	@ 16字节对齐填充

.end			@标识文件结束
.include			@ 头文件包含
.arm / .code32	@声明以下为arm指令
.thumb / .code16	@声明以下为thubm指令

比较重要的伪指令

ldr	大范围的地址加载指令 链接地址
adr	小范围的地址加载指令 运行地址
adrl	中等范围的地址加载指令
nop	空操作
ARM中有一个ldr指令,还有一个ldr伪指令
一般都使用ldr伪指令而不用ldr指令

adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池方式处理;
adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里
ldr加载的地址和链接时给定的地址有关,由链接脚本决定。


总结

通过以上的学习让我第一次对汇编有了一个比较清晰的认识和基础指令的使用,当然这只是嵌入式学习过程中渺小的一部分,在后面的学习过程中也会做出相应的总结,对学过的知识也要反复复习,把重要知识点牢记在心中。

加油鸭^@^

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 12:12:06  更:2021-12-05 12:12:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:51:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码