Cortex-A7常用汇编指令

Cortex-A7常用汇编指令

本节我们将介绍一些常用的 Cortex-A7汇编指令,如果想系统的了解 Cortex-A7的所有汇
编指令请参考《 ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》的 A4章节。

处理器内部数据传输指令

使用处理器做的最多事情就是在处理器内部来回的传递数据,常见的操作有:
①、将数据从一个寄存器传递到另外一个寄存器。
②、将数据从一个寄存器传递到特殊寄存器,如 C PSR 和 S PSR 寄存器。
③、将立即数传递到寄存器。
数据传输常用的指令有三个: MOV、 MRS和 MSR,这三个指令的用法如表 7.2.1.1所
示:
指令 目的 源 描述
MOV
R0
R1

R1里面的数据复制到 R0中。
MRS
R0
CPSR
将特殊寄存器
CPSR里面的数据复制到 R0中。
MSR
CPSR
R1

R1里面的数据复制到特殊寄存器 CPSR里中。
表 7.2.1.1 常用数据传输指令
分别来详细的介绍一下如何使用这三个指令:
1、 MOV指令
MOV指令用于将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄
存器里面,使用示例如下:
MOV R0 R1 @将寄存器 R1中的数据传递给 R0,即 R0=R1 MOV R0, #0X12 @将立即数 0X12传递给 R0寄存器,即 R0=0X12
2、 MRS指令
MRS指令用于将特殊寄存器 (如 CPSR和 SPSR)中的数据传递给通用寄存器,要读取特殊
寄存器的数据只能使用 MRS指令!使用示例如下:
MRS R0, CPSR @将特殊寄存器 CPSR里面的数据传递给 R0,即 R0=CPSR
3、 MSR指 令
MSR指令和 MRS刚好相反, MSR指令用来将普通寄存器的数据传递给特殊寄存器,也就
是写特殊寄存器,写特殊寄存器只能使用 MSR,使用示例如下
MSR CPSR, R0 @将 R0中的数据复制到 CPSR中,即 CPSR=R0

存储器访问指令

ARM不能直接访问存储器,比如 RAM中的数据, I.MX6UL中的寄存器就是 RAM类型
的,我们用汇编来配置 I.MX6UL寄存器的时候需要借助存储器访问指令,一般先将要配置的值
写入到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx中的数据写入到 I.MX6UL寄存器分别来详细的介绍一下如何使用这两个指令:
1、 LDR指令
LDR主要用于从存储加载数据到寄存器 Rx中, LDR也可以将一个立即数加载到寄存器 Rx中, LDR加载立即数的时候要使用“ “=”,而不是 “#”。在嵌入式开发中 LDR最常用的就是读
取 CPU的寄存器值,比如 I.MX6UL有个寄存器 GPIO1_GDIR,其地址为 0X0209C004,我们
现在要读取这个寄存器中的数据,示例代码如下:
示例代码7.2.2.1 LDR指令使用 1 LDR R0, =0X0209C004 @将寄存器地址0X0209C004加载到R0中,即R0=0X0209C004 2 LDR R1, [R0] @读取地址0X0209C004中的数据到R1寄存器中
上述代码就是读取寄存器 GPIO1_GDIR中的值,读取到的寄存器值保存在 R1寄存器中,
上面代码中 offset是 0,也就是没有用到 offset。
2、 STR指令
LDR是从存储器读取数据, STR就是将数据写入到存储器中,同样以 I.MX6UL寄存器
GPIO1_GDIR为例,现在我们要配置寄存器 GPIO1_GDIR的值为 0X20000002,示例代码如下
示例代码7.2.2.2 STR指令使用 1 LDR R0, =0X0209C004 @将寄存器地址0X0209C004加载到R0中,即R0=0X0209C004 2 LDR R1, =0X20000002 @R1保存要写入到寄存器的值,即R1=0X20000002 3 STR R1, [R0] @将R1中的值写入到R0中所保存的地址中
LDR和 STR都是按照字进行读取和写入的,也就是操作的 32位数据,如果要按照字节、
半字进行操作的话可以在指令“ LDR”后面加上 B或 H,比如按字节操作的指令就是 LDRB和
STRB,按半字操作的指令就是 LDRH和 STRH。

压栈和出栈指令

我们通常会在 A函数中调用 B函数,当 B函数执行完以后再回到 A函数继续执行。要想
再 跳回 A函数以后代码能够接着正常运行,那就必须在跳到 B函数之前将当前处理器状态保存
起来 (就是保存 R0~R15这些寄存器值 ),当 B函数执行完成以后再用前面保存的寄存器值恢复
R0~R15即可。保存 R0~R15寄存器的操作就叫做现场保护,恢复 R0~R15寄存器的操作就叫做
恢复现场。在进行现场保护的时候需要进行压栈 (入栈 )操作,恢复现场就要进行出栈操作。压栈
的指令为 PUSH,出栈的指令为 POP PUSH和 POP是一种多存储和多加载指令,即可以一次
操作多个寄存器数据,他们利用当前的栈指针 SP来生成地址, PUSH和 POP的用法如表
处理器的堆栈是向下增长的,使用的汇编代码如下:
PUSH {R0~R3, R12} @将R0~R3 和R12 压栈
压栈完成以后的堆栈如图7.2.3.1 所示:
在这里插入图片描述

图7.2.3.1 就是对R0~R3,R12 进行压栈以后的堆栈示意图,此时的SP 指向了0X7FFFFFEC,
假如我们现在要再将LR 进行压栈,汇编代码如下:
PUSH {LR} @将LR 进行压栈
对LR 进行压栈完成以后的堆栈模型如图7.2.3.2 所示:
在这里插入图片描述

图7.2.3.2 就是分两步对R0~R3,R12 和LR 进行压栈以后的堆栈模型,如果我们要出栈的话
就是使用如下代码:
POP {LR} @先恢复LR
POP {R0~R3,R12} @在恢复R0~R3,R12
出栈的就是从栈顶,也就是SP 当前执行的位置开始,地址依次减小来提取堆栈中的数据
到要恢复的寄存器列表中。PUSH 和POP 的另外一种写法是“STMFD SP!”和“LDMFD SP!”,

因此上面的汇编代码可以改为:
示例代码7.2.3.1 STMFD和LDMFD指令 1 STMFD SP!,{R0~R3, R12} @R0~R3,R12入栈 2 STMFD SP!,{LR} @LR入栈 3 4 LDMFD SP!, {LR} @先恢复LR 5 LDMFD SP!, {R0~R3, R12} @再恢复R0~R3, R12
STMFD可以分为两部分: STM和 FD,同理 LDMFD也可以分为 LDM和 FD。看到 STM和 LDM有没有觉得似曾相识 (不是 STM32啊啊啊啊 ),前面我们讲了 LDR和 STR,这两个是
数据加载和存储指令,但是每次只能读写存储器中的一个数据。 STM和 LDM就是多 存储 和多
加载 ,可以连续的读写存储器中的多个连续数据。
FD是 Full Descending的缩写,即满递减的意思。根据 ATPCS规则 ,ARM使用的 FD类型
的堆栈, SP指向最后一个入栈的数值,堆栈是由高地址向下增长的,也就是前面说的向下增长
的堆栈,因此最常用的指令就是 STMFD和 LDMFD。 STM和 LDM的指令寄存器列表中编号
小的对应低地址,编号高的对应高地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/4002.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马点评笔记(自用)

1.优惠卷秒杀 (1)全局唯一ID 订单如果用自增,容易被猜到交易量,且数据量大的话分成多个表,都是自增,容易出现重复。所以用全局ID生成器,Redis独立自增不会重复,但安全性不保证&#…

Vue Nginx 配置跨域

1、方案1:Nginx配置跨域,Vue不用配置vite代理 1.nginx 配置SSL证书 listen *:443;server_name gitlab.xxxxxx.com;server_tokens off; ## Dont show the nginx version number, a security best practicessl on;ssl_certificate /etc/gitlab/xxxxxx.c…

俺的面试qwq

1.JavaScript的基本数据类型都有什么? 布尔型、数值型、字符串、数组、null、undefined、object、symbol 2.数组方法pop()push() unshift() shift()的作用? pop()删除最后一个元素、push()在数组最后增加元素、unshift()在数组最前面增加元素、shift()删除第一个元素 3.box-s…

【ChatGPTAIGC研讨社】“iPhone时刻”:未来已来

文章目录前言一、ChaGPT&AIGC研讨社简介二、ChatGPT&AIGC研讨社的优势1.丰富充实的资料库Github开源:[ChatGPT_Project](https://github.com/shawshany/ChatGPT_Project)飞书资料库2.重量级嘉宾3.工作机会4.投资资源总结前言 去年年末,ChatGPT以…

Linux编译器-gcc/g++ 使用

在介绍gcc/g的使用前我们先了解一下两者的不同 gcc时主要编译c语言,而g主要编译c的,但是两者的选项是相同的,因此我们以gcc和c语言为例来讲解。背景知识 gcc和g都是编译器其核心作用将文本类文件翻译成二进制可执行 那么其过程是怎样的&…

dolphinscheduler 2.0.6 资源中心改造方案二:通过NFS挂载共享目录

目录调度资源中心存储概要安装NFS服务器客户端调度验证关闭SFTP开关(可忽略)重新上传资源文件worker执行任务验证服务器woker客户端worker其它nfs共享目录的配置文件/etc/exports说明调度资源中心存储概要 针对现有的单机存储可以做哪些扩展?…

免费1年服务器,部署个ChatGPT专属网页版

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com port 443: Connection timed out 你是…

【统计学习】25个必须掌握的数据分析基础概念

16个必须掌握的数据分析基础概念1. 描述性统计2. 假设性检验2.1 参数检验2.2 非参数检验3. 置信度分析4. 列联表分析5. 相关分析6. 方差分析7. 回归分析8. 聚类分析9. 判别分析10. 主成分分析11. 因子分析12. 时间序列分析13. 生存分析14. 典型相关分析15. ROC分析16. 偏差-方差…

MATLAB中quiver函数用法

目录 语法 说明 示例 创建箭头图 禁用自动缩放 绘制梯度和等高线 指定箭头颜色 指定箭头图的坐标区 在创建后修改箭头图 quiver函数的功能是绘制箭头图或向量图。 语法 quiver(X,Y,U,V) quiver(U,V) quiver(___,scale) quiver(___,LineSpec) quiver(___,LineSpec,fi…

List和list迭代器的模拟实现

list的使用 我们list表示带头双向循环链表。 我们再找我们的list中每个数据的位置&#xff0c;就不可以再用我们的下标[]了。 我们就必须用迭代器。 void test_list1() {list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list<int>:…

MySQL基础-视图

文章目录MySQL基础-视图一、数据库对象二、视图概念三、视图的使用1、创建视图2、查看视图3、修改视图4、修改/删除视图四、总结MySQL基础-视图 一、数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行…

STM32输出PWM波控制电机转速,红外循迹避障智能车+L298N的详细使用手册、接线方法及工作原理,有代码

智能循迹红外避障小车 本设计的完整的系统主要包括STM32单片机最小系统、L298n电机驱动&#xff0c;超声波 &#xff0c;舵机 &#xff0c;红外模块等。寻迹小车相信大家都已经耳熟能祥了。 我们在这里主要讲一下L298N驱动电机和单片机输出PWM控制电机转速。 本设计软件系统采…

这个时候了,你还不会不知道JavaMail API吧

一、概述 1.1 简述 JavaMail API 顾名思义&#xff0c;提供给开发者处理电子邮件相关的编程接口&#xff0c;它是Sun发布的用来处理email的API&#xff0c;其提供独立于平台且与协议无关的框架来构建邮件和消息传递应用。JavaMail API 提供了一组抽象类&#xff0c;用于定义组…

第十四届蓝桥杯三月真题刷题训练——第 24 天

目录 第 1 题&#xff1a;旋转 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 思路&#xff1a; 第 2 题&#xff1a;附近最小_单调队列模板 代码&#xff1a; 第 3 题&#xff1a;扫地机器人_二分 题目描述 输入描述 输出描述 输入输出样…

【蓝桥杯】​蓝桥杯——每日四道编程题(两道真题+两道模拟)​| 第 二 天

专栏&#xff1a; 蓝桥杯——每日四道编程题&#xff08;两道真题两道模拟&#xff09; “蓝桥杯就要开始了&#xff0c;这些题刷到就是赚到” ₍ᐢ..ᐢ₎♡ 另一个专栏&#xff1a; 蓝桥杯——每日四道填空题&#xff08;两道真题两道模拟题&#xff09; 目录 第一道真题&…

Kafka 基础整理、 Springboot 简单整合

定义&#xff1a; Kafka 是一个分布式的基于发布/订阅默认的消息队列是一个开源的分布式事件流平台&#xff0c;被常用用于数据管道、流分析、数据集成、关键任务应用 消费模式&#xff1a; 点对点模式 (少用) 消费者主动拉取数据&#xff0c;消息收到后清除消息 发布/订阅模式…

【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛2]客观题及详细题解

题1 解析 USART_CR1:控制寄存器1&#xff0c;其中的M位定义了数据字的长度&#xff0c;由软件对其设置和清零。USART_CR2:控制寄存器2。USART_BRR:波特率寄存器。USART_DR:数据寄存器。 (如果现场不记得&#xff0c;可以查阅芯片手册) 答案: A 题2 解析 在STM32微控制器中&a…

每日学术速递3.29

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.CC3D: Layout-Conditioned Generation of Compositional 3D Scenes 标题&#xff1a;CC3D&#xff1a;合成 3D 场景的布局条件生成 作者&#xff1a;Sherwin Bahmani, Jeong Joon …

五、MyBatis各种查询功能

MyBatis的各种查询功能 如果查询出的数据只有一条&#xff0c;可以通过 实体类对象接收List集合接收Map集合接收 如果查询出的数据有多条&#xff0c;一定不能用实体对象接收&#xff0c;会抛TooManyResultsException&#xff0c;可以通过 实体类类型的List集合接收Map类型的L…

学习系统编程No.11【重定向的本质】

引言&#xff1a; 北京时间&#xff1a;2023/3/27/7:05&#xff0c;哈哈哈&#xff0c;首先是开心&#xff0c;因为上篇博客热榜目前第15&#xff0c;让我初步掌握了上热榜的小妙招&#xff0c;不单单只是要日更&#xff0c;还有非常多的上榜小技巧&#xff0c;但是首先连续更…
最新文章