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
相关文章:
ARM常用汇编指令
文章目录 前言一、处理器内部数据传输指令MOV: 将数据从一个寄存器复制到另一个寄存器。MRS: 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。MSR: 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。 二、存储器访问指令LDR:用于从内存中加…...
kali系统入侵电脑windows(win11系统)渗透测试,骇入电脑教学
本次渗透测试将使用kali虚拟机(攻击机)对本机(靶机)进行入侵并监控屏幕 声明:本篇仅仅是将本机作为靶机的一次简易渗透测试,实际情况中基本不可能出现如此简单的木马骇入(往往在上传木马时就被防…...
力扣hot100 矩阵置零 标识位
Problem: 73. 矩阵置零 文章目录 思路复杂度Code 思路 👨🏫 参考 复杂度 时间复杂度: O ( n m ) O(nm) O(nm) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public static void setZeroes(int[][] matrix) {int n matrix.length;i…...
Android App开发-简单控件(3)——常用布局
3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,CommonLayouts以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线…...
Linux使用二进制包安装MySQL
目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载:MySQL :: Download MySQL Community Server 二、上传软件…...
【vue3-pbstar-admin】一款基于vue3和nodejs的简洁后台管理系统
Vue3-pbstar-admin 是一个简洁的后台解决方案,提供了基础的用户体系和页面接口权限配置,方便用户进行自定义开发,避免不必要的代码冗余。该方案结合了 Vue3、Element-Plus、Pinia 和 Vite 等先进技术,实现高效的页面布局、状态管理…...
顺序表和链表【数据结构】【基于C语言实现】【一站式速通】
目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组 3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义 2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双…...
SpringBoot 有什么优点?
Spring Boot 是一个用于简化和加速 Spring 框架应用程序开发的项目。它构建在 Spring 框架之上,提供了一种快速开发、简化配置和集成的方式。以下是 Spring Boot 的一些优点: 1、简化配置: Spring Boot 使用约定大于配置的理念,通…...
扫地机器人(二分算法+贪心算法)
1. if(robot[i]-len<sweep)这个代码的意思是——如果机器人向左移动len个长度后,比现在sweep的位置(现在已经覆盖的范围)还要靠左,就是覆盖连续不起来,呢么这个len就是有问题的,退出函数,再…...
Unity中创建Ultraleap 3Di交互项目
首先,创建新的场景 1、创建一个空物体,重命名为【XP Leap Provider Manager】,并在这个空物体上添加【XR Leap Provider Manager】 在物体XP Leap Provider Manager下,创建两个子物体Service Provider(XR)和Service Provider(…...
【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗
一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…...
C数据类型
目录 1. 数据类型分类 2. 整数类型 3. 浮点类型 4. void 类型 5. 类型转换 1. 数据类型分类 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。 C 中…...
JAVA和Go的不解之缘
JAVA和Go的不解之缘 Java和Go是两种不同的编程语言,它们在语法、特性和设计理念上存在一些明显的异同之处。 1. 语法和特性: Java是一种面向对象的语言,而Go则是一种面向过程的语言。Java拥有类、继承、接口等传统的面向对象特性ÿ…...
(免费领源码)java#SSM#MySQL汽车车辆管理系统68424-计算机毕业设计项目选题推荐
摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作…...
25考研每日的时间安排
今天要给大家分享一下25考研每日的时间安排。 没有完美的计划,只有合适的计划。 仅供参考 很多人说复习不要只看时长而是要看效率,所以学多长时间不重要,重要的高效率完成任务。 完美的计划 这个计划看起来很完美,从早到晚有学习…...
小程序直播项目搭建
项目功能: 登录实时聊天点赞功能刷礼物取消关注用户卡片直播带货优惠券直播功能 项目启动: 1 小程序项目创建与配置: 第一步 需要登录小程序公众平台的设置页面进行配置: 首先需要是企业注册的才可以个人不能开通直播功能。服务类…...
《Python 简易速速上手小册》第10章:Python 项目实战(基于最新版 Python3.12 编写)
注意:本《Python 简易速速上手小册》 核心目的在于让零基础新手「快速构建 Python 知识体系」 文章目录 <mark >注意:本《Python 简易速速上手小册》<mark >核心目的在于让零基础新手「快速构建 Python 知识体系」 10.1 项目规划和结构10.1…...
防御保护第六天笔记
一、防火墙的用户认证 用户、行为、流量 --- 上网行为管理三要素 防火墙管理员登录认证的作用有两点:检验身份的合法性,划分身份权限 用户认证 --- 上网行为管理的一部分 用户认证分类有以下三类: 1、上网用户认证 --- 三层认证 --- 所有的…...
【yaml 文件使用】pytest+request 框架中 yaml 配置文件使用
又来进步一点点~~ 背景:最近在学习pytestrequest框架写接口测试自动化,使用yaml文件配置更方便管理用例中的数据,这样更方便 yaml 介绍: 什么是 yaml 文件:YAML 是 “YAML Ain’t a Markup Language”(Y…...
浅析Redis②:命令处理之epoll实现(中)
写在前面 Redis作为我们日常工作中最常使用的缓存数据库,其重要性不言而喻,作为普通开发者,我们在日常开发中使用Redis,主要聚焦于Redis的基层数据结构的命令使用,很少会有人对Redis的内部实现机制进行了解,…...
蓝牙抓包不求人:从HCI日志里‘挖’出Link Key的两种实用方法(附安卓路径)
蓝牙安全逆向实战:从HCI日志中提取Link Key的深度解析在蓝牙协议安全研究领域,Link Key作为设备配对认证的核心凭证,其获取方式一直是逆向工程师关注的焦点。许多安全审计场景下,我们往往只能获得加密后的HCI通信日志,…...
用数字逻辑门复刻柏林钟:从二进制编码到硬件实现
1. 项目概述:用数字电路复刻“柏林钟”作为一个在柏林长大的孩子,我从小就对库达姆大街上的那座“柏林钟”着迷。它不像传统时钟那样用指针或数字告诉你时间,而是通过几排不同颜色的发光方块,以一种近乎艺术的方式呈现时间。这种独…...
小米MIMO最新邀请码
欢迎使用,各得10元体验金...
2026 西安 AI 问答曝光搭建技术解析:GEO 知识图谱 + 深度测评
随着大语言模型技术的快速普及,AI 搜索已经成为用户获取企业信息、商家服务的核心入口。根据中国互联网信息中心 2026 年发布的《中国人工智能搜索发展报告》显示,2025 年国内 AI 搜索用户规模突破 8.2 亿,日均搜索请求超过 20 亿次ÿ…...
Unity主题系统设计:状态驱动的主题抽象与自动注入方案
1. 这不是换个颜色那么简单:为什么Unity项目里“换肤”总在发布前夜崩盘?你有没有经历过这样的场景:美术同学凌晨两点发来一套新主题资源包,UI设计师说“这次配色更符合品牌调性”,产品说“上线前必须支持深色模式”&a…...
SMUDebugTool终极指南:如何深度掌控AMD Ryzen处理器的隐藏性能
SMUDebugTool终极指南:如何深度掌控AMD Ryzen处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...
网络配置工具类详解
CNet 网络配置工具类详解平台:仅支持 Linux,大量使用 ioctl 系统调用一、概述 CNet 是一个 纯静态方法的网络配置工具类,封装了 Linux 下常用的网络操作:功能类别涵盖内容IP 地址读取/设置本机 IP、子网掩码网关读取/添加/删除/设…...
2027考研全套资料免费分享
备战27考研最全备考资料整理完毕,一路走来深知备考搜集资料耗费大量时间,浪费不少精力。特意整理2027考研全科完整版资源,全部打包汇总,零基础考生直接拿来就能使用,省去四处搜集资料的烦恼。资料内含:&…...
FairyGUI Unity鼠标悬停与点击对象获取原理与实战
1. 这不是“加个OnMouseEnter就能用”的事:FairyGUI在Unity中处理鼠标交互的真实困境很多人第一次在Unity里集成FairyGUI,想实现“鼠标悬停显示提示”或“点击高亮当前按钮”,下意识就去翻Unity的MonoBehaviour文档,找OnMouseEnte…...
在Hermes Agent项目中接入Taotoken作为自定义模型供应商
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Hermes Agent项目中接入Taotoken作为自定义模型供应商 基础教程类,针对使用Hermes Agent框架的开发者,详…...
