ARM常用汇编指令

文章目录

  • 前言
  • 一、处理器内部数据传输指令
      • MOV: 将数据从一个寄存器复制到另一个寄存器。
      • MRS: 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。
      • MSR: 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。
  • 二、存储器访问指令
      • LDR:用于从内存中加载数据到寄存器。LDR Rd, [Rn, #offset]
      • STR:用于从内存中加载数据到寄存器。这个指令非常常见,用于访问内存中的变量、数组元素或其他数据。STR Rd, [Rn, #offset]
  • 三、压栈和出栈指令
      • 压栈指令(Push):
      • 出栈指令(Pop):
  • 四.跳转指令
      • 无条件跳转B:
      • 子程序调用和返回BL:
      • 条件跳转:
  • 五.算术运算指令
      • 加法指令:
      • 减法指令:
      • 乘法指令:
      • 除法指令:
  • 六.逻辑运算指令
      • 按位与指令:
      • 按位或指令:
      • 按位异或指令:
      • 按位取反指令:
  • 总结


前言

因为Cortex-A芯片上电的时候SP指针还没初始化,C环境还没有准备好,所以肯定不能运行C代码,就必须先用汇编语言设置好C环境,遂记录一下一些常用的汇编指令。


一、处理器内部数据传输指令

在ARM架构中,包括Cortex-A7处理器内部,有一些专门用于数据传输的指令,这些指令用于在寄存器之间移动数据或在寄存器和内存之间进行数据传输。

MOV: 将数据从一个寄存器复制到另一个寄存器。

MOV R0, R1         @将寄存器R1中的数据传给寄存器R0 即R0=R1
MOV R0, #0X01      @将立即数0x01传给寄存器R0 即R0=0X01

MRS: 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。

MRS R0, CPSR  

MSR: 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。

MRS CPSR, R0  

二、存储器访问指令

在很多计算机体系结构中,包括ARM架构,不能直接访问存储器,而是需要借助存储器访问指令去配置寄存器,原因是为了实现灵活性、可编程性以及动态配置的需要。

LDR:用于从内存中加载数据到寄存器。LDR Rd, [Rn, #offset]

在这里插入图片描述

LDR Rd, [Rn, #offset]LDR R0, [R1]       ; 将R1寄存器指向的内存地址处的数据加载到R0中
LDR R2, [R3, #8]   ; 将R3寄存器指向的内存地址 + 8 处的数据加载到R2中
LDR R4, [R5, R6]   ; 将R5寄存器指向的内存地址 + R6 寄存器的值处的数据加载到R4中

STR:用于从内存中加载数据到寄存器。这个指令非常常见,用于访问内存中的变量、数组元素或其他数据。STR Rd, [Rn, #offset]

在这里插入图片描述

三、压栈和出栈指令

现场保护(Save Context):
在函数调用、中断或异常处理开始时,程序通常会保存当前执行环境的状态,主要包括一些关键的寄存器的值、堆栈指针等信息。这个过程被称为现场保护。目的是为了在执行完特定任务后,能够正确返回到之前的状态。
恢复现场(Restore Context)
在函数调用、中断或异常处理结束时,程序需要将之前保存的执行环境状态恢复,确保返回到调用前的状态。这个过程被称为恢复现场。

在这里插入图片描述
在汇编语言中,压栈(Push)和出栈(Pop)指令通常用于实现现场保护和恢复现场的操作。这些指令可以用来将寄存器的值保存到栈中(现场保护),以及从栈中弹出值并存储回寄存器中(恢复现场)。

压栈指令(Push):

PUSH 指令用于将寄存器或数据压入栈中。这会将数据推入栈顶,并将栈指针递减以指向新的栈顶位置。

PUSH {R0, R1, R2}  @将寄存器R0、R1、R2中的数据依次压入栈中。

出栈指令(Pop):

POP 指令用于从栈中弹出数据,同时将栈指针递增以指向新的栈顶位置。出栈的顺序与入栈的顺序相反。

POP {R0, R1, R2}   @将从栈顶弹出数据,并分别存储到寄存器R2、R1、R0中。

四.跳转指令

在汇编语言中,跳转指令用于改变程序的执行流程,即从一个地址转移到另一个地址。跳转指令是实现条件分支、循环、函数调用等控制流操作的基本工具。

无条件跳转B:

B(Branch)指令是无条件跳转指令,它会将程序控制转移到指定地址。

B target_address     @将程序无条件地跳转到 target_address 处。

子程序调用和返回BL:

BL(Branch with Link)指令用于调用子程序,并将返回地址保存在链接寄存器中。返回时使用 BX 或 POP 指令。BL相比于B,在跳转之前会在寄存器LR中保存当前PC寄存器值,所以可以通过将LR寄存器中的值重新加载到PC中来继续从跳转之前的代码处运行,这是子程序调用的一个基本但常用的手段。

BL subroutine_address   @调用子程序
BX LR                   @从链接寄存器中加载返回地址,实现返回

条件跳转:

条件跳转指令根据某个条件是否满足来决定是否执行跳转。常见的条件跳转指令有:
BEQ(Branch if Equal):等于零时跳转
BNE(Branch if Not Equal):不等于零时跳转
BLT(Branch if Less Than):小于时跳转
BGT(Branch if Greater Than):大于时跳转

五.算术运算指令

算术运算指令用于执行各种数学运算,如加法、减法、乘法、除法等。这些指令允许程序对数据进行处理并得出结果。在嵌入式开发中,咱们一般只会用到加减命令,乘除命令基本用不到。

加法指令:

ADD(Addition)指令用于将两个操作数相加,并将结果存储在目标寄存器中。

ADD Rd, Rn, Operand2
@Rd 是目标寄存器,Rn 是源寄存器,Operand2 是另一个操作数。

减法指令:

SUB(Subtraction)指令用于将一个操作数减去另一个操作数,并将结果存储在目标寄存器中。

SUB Rd, Rn, Operand2
@Rd 是目标寄存器,Rn 是源寄存器,Operand2 是另一个操作数。

乘法指令:

MUL(Multiply)指令用于将两个操作数相乘,并将结果存储在目标寄存器中。

MUL Rd, Rn, Operand2
@Rd 是目标寄存器,Rn 是源寄存器,Operand2 是另一个操作数。

除法指令:

DIV(Divide)指令用于将一个操作数除以另一个操作数,并将结果存储在目标寄存器中。

SDIV Rd, Rn, Operand2
@Rd 是目标寄存器,Rn 是源寄存器,Operand2 是另一个操作数。

六.逻辑运算指令

逻辑运算指令用于执行各种逻辑运算,例如按位与、按位或、按位异或等。这些指令允许程序员对二进制数据进行逻辑操作。

按位与指令:

AND(Bitwise AND)指令用于对两个操作数执行按位与操作,并将结果存储在目标寄存器中。

AND Rd, Rn, Operand2
@Rd 是目标寄存器,Rn 是源寄存器,Operand2 是另一个操作数。

按位或指令:

ORR(Bitwise OR)指令用于对两个操作数执行按位或操作,并将结果存储在目标寄存器中。

ORR Rd, Rn, Operand2
@Rd 是目标寄存器,Rn 是源寄存器,Operand2 是另一个操作数。

按位异或指令:

EOR(Bitwise Exclusive OR,异或)指令用于对两个操作数执行按位异或操作,并将结果存储在目标寄存器中。

EOR Rd, Rn, Operand2
@Rd 是目标寄存器,Rn 是源寄存器,Operand2 是另一个操作数。

按位取反指令:

MVN(Bitwise NOT)指令用于对一个操作数执行按位取反操作,并将结果存储在目标寄存器中。

MVN Rd, Rn
@Rd 是目标寄存器,Rn 是源寄存器。

总结

本节主要讲解了一些常用的ARM汇编指令,唐怡佳继续加油! 想要了解更多更详细的ARM指令,可以参考ARMArchitectureReference Mannual ARMv7-A and ARMv7-R edition.pdf

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣面试题 16.06. 最小差

Problem: 面试题 16.06. 最小差 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 注意本题目的数据范围!!! 1.对数组a与数组b进行排序;获取a与b的数组长度aLen,bLen,定义一个long类型的变量min; 2.分别让两个指针i,j指向数组的开…

56. 合并区间 - 力扣(LeetCode)

题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 题目示例 输入:intervals [[1,3…

LeNet跟LeNet5详解

1 LeNet结构 主要是为了手写数字识别 具体结构讲解:从图中例子可得 1 先传入一个灰度图像尺寸为1x28x28,通道数为1,尺寸为28x28的灰度图像 2 第一层5x5卷积,经过公式 输入图像尺寸-卷积核尺寸2padding/步长1,&#…

༺༽༾ཊ—设计-抽象-05-工厂-模式—ཏ༿༼༻

名称:抽象工厂 类型:创建型 目的:当有多个抽象角色时使用的一种工厂模式。 抽象工厂模式可以向客户端提供一个接口,使 客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。 优点&#xf…

Linux第38步_编译“正点原子移植好的uboot”

uboot的全称是Universal Boot Loader,uboot是一个遵循GPL协议的开源软件,uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。 uboot官方的uboot源码是给所有的半导体厂商准备的。ST公司会…

v38.恒星金字塔

1.循环嵌套 1.1矩阵(i,j) i行 j列 将矩阵与循环嵌套结合起来: 2.2.于是,金字塔就是

基于QC-LDPC编码的循环移位网络的FPGA实现

一、桶式移位寄存器(barrel shifter) 八位桶式移位寄存器的VHDL实现如下,由于每一层结构相似,于是采用生成语句for_generate实现,使用该代码实现的RTL级分析和理论的结构一致,仿真结果也符合预期。 entity barrel_shift isGENE…

从关键新闻和最新技术看AI行业发展(2024.1.15-1.28第十五期) |【WeThinkIn老实人报】

Rocky Ding 公众号:WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术,同时Rocky会对这些关键信息进行解读,力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议,一起交流学习&…

GEE数据集——MOD13A1.006Terra星搭载的中分辨率成像光谱仪获取的L3级植被指数产品

数据名称: MOD13A1.006 Modis 16天 Terra 500m 数据来源: NASA 时空范围: 2000-2022年 空间范围: 全国 波段 名称波段单位最小值最大值比例因子波长描述NDVIB1NDVI-2000100000.0001Normalized Difference Vegetation…

for循环里i++和++i的区别

主要有以下三个区别: 1、i是先改变i的值即加1后再使用i的值;而i是先使用i的值在改变它的值即加。 2、for循环内部仅形式不同:当i循环和i循环在for循环内部,虽然形式上明显不同,但输出结果可以一样。 public static …

“群载波”全频强插无线应急广播在高速公路交通管控中的应用

一、“群载波”全频强插应急广播系统基本概念 群载波应急广播系统的技术是北京恒星科通科技发展有限公司技术总监刘军先生多年从事无线通信与应急通信产品的研发,突破传统无线电理论,开创性地提出了“群载波”通信理论,并亲自投入很大精力潜心…

docker 安装python3.8环境镜像并导入局域网

一、安装docker yum -y install docker docker version #显示 Docker 版本信息 可以看到已经下载下来了 拉取镜像python3镜像 二、安装docker 中python3环境 运行本地镜像,并进入镜像环境 docker run -itd python-38 /bin/bash docker run -itd pyth…

Steam游戏免费玩 gamebox 一起来玩幻兽帕鲁吧

steam大作免费畅玩 幻兽帕鲁也有资源 UI设计精美 还有补票链接,点击一下,就能跳转至Steam商店 可以自定义安装位置 下载链接 gamebox:https://rssm666.lanzn.com/b039g6dqj

如何用一根网线和51单片机做简单门禁[带破解器]

仓库:https://github.com/MartinxMax/Simple_Door 支持原创是您给我的最大动力… 原理 -基础设备代码程序- -Arduino爆破器程序 or 51爆破器程序- 任意选一个都可以用… —Arduino带TFT屏幕——— —51带LCD1602——— 基础设备的最大密码长度是0x7F,因为有一位…

游戏设计模式

单列模式 概念 单例模式是一种创建型设计模式,可以保证一个类只有一个实例,并提供一个访问该实例的全局节点。 优点 可以派生:在单例类的实例构造函数中可以设置以允许子类派生。受控访问:因为单例类封装他的唯一实例&#xf…

小土堆pytorch学习笔记004

目录 1、神经网络的基本骨架-nn.Module的使用 2、卷积操作实例 3、神经网络-卷积层 4、神经网络-最大池化的使用 (1)最大池化画图理解: (2)代码实现: 5、神经网络-非线性激活 (1&#xf…

预训练语言模型transformer

预训练语言模型的学习方法有三类:自编码(auto-encode, AE)、自回归(auto regressive, AR),Encoder-Decoder结构。 决定PTM模型表现的真正原因主要有以下几点: 更高质量、更多数量的预训练数据增加模型容量…

NAS系统折腾记 – 申请域名和数字签名

群晖NAS硬件和DSM安装完毕,现在已经可以在家里局域网的环境下正常服务了。下一个问题自然是考虑出门在外的时候,怎样能通过外网远程访问NAS的服务了。为此,我需要给我的NAS服务器申请一个便于记忆的域名,然后配合DDNS服务实现域名…

uniapp微信小程序-input默认字的样式

需要的是这样的 问题 正常是在input框上面写样式就行&#xff0c;但是uniapp不起作用 解决 直接在input上写placeholder-style"color就解决了 <input class"findInput" type"text" placeholder"关键词查询"placeholder-style"co…

【PyTorch】n卡驱动、CUDA Toolkit、cuDNN全解安装教程

文章目录 GPU、NVIDIA Graphics Drivers、CUDA、CUDA Toolkit和cuDNN的关系使用情形判断仅仅使用PyTorch使用torch的第三方子模块 安装NVIDIA Graphics Drivers&#xff08;可跳过&#xff09;前言Linux法一&#xff1a;图形化界面安装&#xff08;推荐&#xff09;法二&#x…