当前位置: 首页 > news >正文

arm汇编指令详细整理及实例详解

目录

    • 一、简介
    • 二、ARM 汇编指令说明
      • 2.1 32位数据操作指令
      • 2.2 32位存储器数据传送指令
      • 2.3 32位转移指令
      • 2.4 其它32位指令
    • 三、实例讲解
      • 3.1 MRS
      • 3.2 MSR
      • 3.3 PRIMASK
      • 3.4 FAULTMASK
      • 3.5 BX指令
      • 3.6 零寄存器 wzr、xzr
      • 3.7 立即寻址指令
      • 3.8 寄存器间接寻址指令
      • 3.9 寄存器移位寻址指令
      • 3.10 基址寻址指令
      • 3.11 多寄存器寻址指令
      • 3.12 无条件转移B,BAL
      • 3.13 条件转移
      • 3.14 WFE 和 WFI 对比

一、简介

本文主要整理了arm常用的汇编指令,同时通过实例进一步讲述语句的用法。

二、ARM 汇编指令说明

2.1 32位数据操作指令

名字功能
ADC带进位加法
ADD加法
ADDW宽加法(可以加 12 位立即数)
AND按位与
ASR算术右移
BIC位清零(把一个数按位取反后,与另一个数逻辑与)
BFC位段清零
BFI位段插入
CMN负向比较(把一个数和另一个数的二进制补码比较,并更新标志位)
CMP比较两个数并更新标志位
CLZ计算前导零的数目
EOR按位异或
LSL逻辑左移
LSR逻辑右移
MLA乘加
MLS乘减
MOVW把 16 位立即数放到寄存器的底16位,高16位清0
MOV加载16位立即数到寄存器(其实汇编器会产生MOVW——译注)
MOVT把 16 位立即数放到寄存器的高16位,低 16位不影响
MVN移动一个数的补码
MUL乘法
ORR按位或
ORN把源操作数按位取反后,再执行按位或(
RBIT位反转(把一个 32 位整数先用2 进制表达,再旋转180度——译注)
REV对一个32 位整数做按字节反转
REVH/REV16对一个32 位整数的高低半字都执行字节反转
REVSH对一个32 位整数的低半字执行字节反转,再带符号扩展成32位数
ROR圆圈右移
RRX带进位的逻辑右移一格(最高位用C 填充,且不影响C的值——译注)
SFBX从一个32 位整数中提取任意的位段,并且带符号扩展成 32 位整数
SDIV带符号除法
SMLAL带符号长乘加(两个带符号的 32 位整数相乘得到 64 位的带符号积,再把积加到另一个带符号 64位整数中)
SMULL带符号长乘法(两个带符号的 32 位整数相乘得到 64位的带符号积)
SSAT带符号的饱和运算
SBC带借位的减法
SUB减法
SUBW宽减法,可以减 12 位立即数
SXTB字节带符号扩展到32位数
TEQ测试是否相等(对两个数执行异或,更新标志但不存储结果)
TST测试(对两个数执行按位与,更新标志但不存储结果)
UBFX无符号位段提取
UDIV无符号除法
UMLAL无符号长乘加(两个无符号的 32 位整数相乘得到 64 位的无符号积,再把积加到另一个无符号 64位整数中)
UMULL无符号长乘法(两个无符号的 32 位整数相乘得到 64位的无符号积)
USAT无符号饱和操作(但是源操作数是带符号的——译注)
UXTB字节被无符号扩展到32 位(高24位清0——译注)
UXTH半字被无符号扩展到32 位(高16位清0——译注)

2.2 32位存储器数据传送指令

名字功能
LDR加载字到寄存器
LDRB加载字节到寄存器
LDRH加载半字到寄存器
LDRSH加载半字到寄存器,再带符号扩展到 32位
LDM从一片连续的地址空间中加载多个字到若干寄存器
LDRD从连续的地址空间加载双字(64 位整数)到2 个寄存器
STR存储寄存器中的字
STRB存储寄存器中的低字节
STRH存储寄存器中的低半字
STM存储若干寄存器中的字到一片连续的地址空间中
STRD存储2 个寄存器组成的双字到连续的地址空间中
PUSH把若干寄存器的值压入堆栈中
POP从堆栈中弹出若干的寄存器的值

2.3 32位转移指令

名字功能
B无条件转移
BL转移并连接(呼叫子程序)
TBB以字节为单位的查表转移。从一个字节数组中选一个8位前向跳转地址并转移
TBH以半字为单位的查表转移。从一个半字数组中选一个16 位前向跳转的地址并转移

2.4 其它32位指令

名字功能
LDREX加载字到寄存器,并且在内核中标明一段地址进入了互斥访问状态
LDREXH加载半字到寄存器,并且在内核中标明一段地址进入了互斥访问状态
LDREXB加载字节到寄存器,并且在内核中标明一段地址进入了互斥访问状态
STREX检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的字
STREXH检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的半字
STREXB检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的字节
CLREX在本地的处理上清除互斥访问状态的标记(先前由 LDREX/LDREXH/LDREXB做的标记)
MRS加载特殊功能寄存器的值到通用寄存器
MSR存储通用寄存器的值到特殊功能寄存器
NOP无操作
SEV发送事件
WFE休眠并且在发生事件时被唤醒
WFI休眠并且在发生中断时被唤醒
ISB指令同步隔离(与流水线和 MPU等有关——译注)
DSB数据同步隔离(与流水线、MPU 和cache等有关——译注)
DMB数据存储隔离(与流水线、MPU 和cache等有关——译注)
DMB数据存储器隔离。DMB 指令保证: 仅当所有在它前面的存储器访问操作都执行完毕后,才提交(commit)在它后面的存储器访问操作。
DSB数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访 问操作——译者注)
ISB指令同步隔离。最严格:它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令。

三、实例讲解

3.1 MRS

将CPSR或SPSR的内容移动到一个通用寄存器

MRS R0,CPSR                         //传送CPSR的内容到R0
MRS R0,SPSR                         //传送 SPSR的内容到R0

3.2 MSR

将立即数或通用寄存器的内容加载到CPSR或SPSR的指定字段中

MSR CPSR,R0        //传送R0的内容到CPSR
MSR SPSR,R0        //传送R0的内容到SPSR
MSR CPSR_c,R0     //传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域

3.3 PRIMASK

用于disable NMI和硬 fault之外的所有异常,它有效地把当前优先级改为 0(可编程 优先级中的最高优先级)。
CPS指令会更改CPSR中的一个或多个模式以及A、I和F位,但不更改其他CPSR位。CPSID就是中断禁止,CPSIE中断允许,

A:表示启用或禁止不精确的中止;I:表示启用或禁止IRQ中断;F:表示启用或禁止FIQ中断

3.4 FAULTMASK

CPSIE f; / CPSID f;MSR FAULTMASK,R0

FAULTMASK更绝,它把当前优先级改为-1。这么一来,连硬fault都被掩蔽了。使用方案与
PRIMASK的相似。但要注意的是,FAULTMASK会在异常退出时自动清零。

3.5 BX指令

BX{条件} 目标地址
BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。

3.6 零寄存器 wzr、xzr

因为我们在使用 str 的是没法使用立即数 0 给寄存器赋值,所以 wzr xzr就是干这个事情的。是一个比较特殊又常常见到的寄存器。

3.7 立即寻址指令

SUBS R0,R0,#1   //R0 减 1 ,结果放入 R0 ,并且影响标志位
MOV R0,#0xFF000 //将立即数 0xFF000 装入 R0 寄存器 寄存器寻址指令举例如下: 
MOV R1,R2    //将 R2 的值存入 R1
SUB R0,R1,R2 //将 R1 的值减去 R2 的值,结果保存到 R0

3.8 寄存器间接寻址指令

LDR R1,[R2]    //将 R2 指向的存储单元的数据读出保存在 R1 中 
SWP R1,R1,[R2] //将寄存器 R1 的值和 R2 指定的存储单元的内容交换,将R2的数值作为一个地址,将此地址处的数值与R1中的内容交换

3.9 寄存器移位寻址指令

MOV R0,R2,LSL #3     //R2 的值左移 3 位,结果放入R0 ,即是R0=R2×8 
ANDS R1,R1,R2,LSL R3  //R2 的值左移 R3 位,然后和R1相“与”操作,结果放入R1

3.10 基址寻址指令

LDR R2,[R3,#0x0C]  //读取 R3+0x0C 地址上的存储单元的内容,放入 R2 
STR R1,[R0,#-4]! 	//先 R0=R0-4 ,然后把 R1 的值寄存到 R0 指定的存储单元 

3.11 多寄存器寻址指令

LDMIA R1!,{R2-R7,R12}   //将 R1 指向的单元中的数据读出到R2 ~R7、R12 中 (R1自动加1) 
STMIA R0!,{R2-R7,R12}    //将寄存器 R2 ~ R7 、 R12 的值保存到 R0 指向的存储单元中(R0自动加1)

3.12 无条件转移B,BAL

举例: B LABEL ; LABEL为某个位置

CMP      x3,x4
B.CS     {pc}+0x10 ; 0xc000800094

BCC是指CPSR寄存器条件标志位为0时的跳转。结合CMP R3, R1,意思是比较R3 R1寄存器,当相等时跳转到环测试。因为CMP指令减去两个值并在CPSR中设置条件标志位。

3.13 条件转移

BEQ 相等
BNE 不等
BPL 非负
BMI 负
BCC 无进位
BCS 有进位
BLO 小于(无符号数)
BHS 大于等于(无符号数)
BHI 大于(无符号数)
BLS 小于等于(无符号数)
BVC 无溢出(有符号数)
BVS 有溢出(有符号数)
BGT 大于(有符号数)
BGE 大于等于(有符号数)
BLT 小于(有符号数)
BLE 小于等于(有符号数)
blr Xm:跳转到由Xm目标寄存器指定的地址处,同时将下一条指令存放到X30寄存器中。例如:blr x20.
br Xm:跳转到由Xm目标寄存器指定的地址处。不是子程序返回
ret {Xm}:跳转到由Xm目标寄存器指定的地址处。是子程序返回。Xm可以不写,默认是X30.

3.14 WFE 和 WFI 对比

wfi 和 wfe 指令都是让ARM核进入standby睡眠模式。wfi是直到有wfi唤醒事件发生才会唤醒CPU,wfe是直到wfe唤醒事件发生,这两类事件大部分相同。唯一不同之处在于wfe可以被其他CPU上的sev指令唤醒,sec指令用于修改event寄存器的指令。

WFE
Wait For Event,是否实现此指令是可选的。如果此指令未实现,它将作为NOP指令来执行。如果指令作为NOP在目标处理器上执行,汇编程序将生成诊断消息。

SEV
Set Event,其是否实现是可选的。如果未实现,它将作为NOP执行。如果指令作为NOP在目标上执行,汇编程序将生成诊断消息。
SEV在ARMv6T2中作为NOP指令执行。

IMPORT |Image$RW_IRAM1$Base|            //从别处导入data段的链接地址
IMPORT |Image$RW_IRAM1$Length|         //从别处导入data段的长度
IMPORT |Load$RW_IRAM1$Base|            //从别处导入data段的加载地址
IMPORT |Image$RW_IRAM1$ZI$Base|        //从别处导入ZI段的链接地址
IMPORT |Image$RW_IRAM1$ZI$Length|      //从别处导入ZI段的长度
Load$$region_name$$Base 	//Load address of the region.
Load$$region_name$$Length 	//Region length in bytes.
Load$$region_name$$Limit 	//Address of the byte beyond the end of the execution region.
//复制数据段
LDR R0, = |Load$RW_IRAM1$Base|           //将data段的加载地址存入R0寄存器
LDR R1, = |Image$RW_IRAM1$Base|   //将data段的链接地址存入R1寄存器
LDR R2, = |Image$RW_IRAM1$Length| //将data段的长度存入R2寄存器
CopyData                
SUB R2, R2, #4                      //每次复制4个字节的data段数据
LDR R3, [R0, R2]                    //把加载地址处的值取出到R3寄存器
STR R3, [R1, R2]                   //把取出的值从R3寄存器存入到链接地址                                        
CMP R2, #0                         //将计数和0相比较
BNE CopyData                      //如果不相等,跳转到CopyData标签处,相等则往下执行//清除BSS段
LDR R0, = |Image$RW_IRAM1$ZI$Base|   //将bss段的链接地址存入R1寄存器
LDR R1, = |Image$RW_IRAM1$ZI$Length| //将bss段的长度存入R2寄存器
CleanBss        
SUB R1, R1, #4                                                //每次清除4个字节的bss段数据
MOV R3, #0                                                  //将0存入r3寄存器
STR R3, [R0, R1]                                        //把R3寄存器存入到链接地址                                        
CMP R1, #0                                                 //将计数和0相比较
BNE CleanBss                       //如果不相等,跳转到CleanBss标签处,相等则往下执行IMPORT  mymain                                              //通知编译器要使用的标号在其他文件
BL                mymain                                    //跳转去执行main函数
B                .                                          //原地跳转,即处于循环状态
ENDP
ALIGN                                                      //填充字节使地址对齐
END                                                        //整个汇编文件结束

相关文章:

arm汇编指令详细整理及实例详解

目录一、简介二、ARM 汇编指令说明2.1 32位数据操作指令2.2 32位存储器数据传送指令2.3 32位转移指令2.4 其它32位指令三、实例讲解3.1 MRS3.2 MSR3.3 PRIMASK3.4 FAULTMASK3.5 BX指令3.6 零寄存器 wzr、xzr3.7 立即寻址指令3.8 寄存器间接寻址指令3.9 寄存器移位寻址指令3.10 …...

高等数学笔记(下下)

无穷级数 定义 一般的,如果给定一个数列u1,u2,u3,...un,...,u_1, u_2, u_3, ... u_n, ... ,u1​,u2​,u3​,...un​,...,,那么由这个梳理构成的表达式u1u2u3...un...u_1u_2u_3...u_n...u1​u2​u3​...un​...叫做(常数项)无穷级数,简称(常…...

零基础如何入门网络安全(黑客)

我经常会看到这一类的问题: 学习XXX知识没效果;学习XXX技能没方向;学习XXX没办法入门; 给大家一个忠告,如果你完全没有基础的话,前期最好不要盲目去找资料学习,因为大部分人把资料收集好之后&a…...

【C++】map和set用法详解

文章目录1.关联式容器2.键值对3.树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的模板参数列表3.1.3 set的使用3.2 mapmap的介绍map的模板参数列表map的使用关于map的元素访问总结3.3multimap1.关联式容器 我们接触过STL中的部分容器,比如:vecto…...

BLIP2-图像文本预训练

文章目录摘要解决问题算法模型结构通过frozen图像编码器学习视觉语言表征图像文本对比学习(ITC)基于图像文本生成(ITG)图文匹配(ITM)从大规模语言模型学习视觉到语言生成模型预训练预训练数据预训练图像编码…...

Faster-Rcnn修改转数据集文件

目录 学习python的一些基础知识 argparser assert关键字 让你秒懂Python 类特殊方法__getitem__ lxml.etree.fromstring的使用 统计一下json文件内的种类 正脸红外光 正脸-混合红外光 正脸-交叉偏振光 正脸-平行偏振光 正脸-紫外光 正脸-棕色光 调用mydataset可视化…...

带你沉浸式体验删库跑路

前言:学习的过程比较枯燥,后面会记录一些比较有意思的东西,比如程序员之间流传的删库跑路的梗,当然本次测试是在虚拟机上进行的并进行了快照保护,所以其实没太大问题。首先得要有一个虚拟机要有一个linux iso文件装在虚拟机上以上两点不是本文重点,如果有需要可以私…...

Linux学习(8.5)文件内容查阅

目录 文件内容查阅: 直接检视文件内容 cat (concatenate) tac (反向列示) nl (添加行号列印) 可翻页检视 more (一页一页翻动) less (一页一页翻动) 数据撷取 tail (取出后面几行) 非纯文字档: od 修改文件时间或建置新档: touc…...

【Docker】命令总结

目录 1.镜像命令 1.1拉取镜像 1.2查看镜像 1.3保存镜像 1.4导入镜像 2.容器命令 2.1创建并运行容器 2.2删除容器 2.3进入容器 2.4查看容器状态 2.5暂停容器 2.6恢复容器 2.7停止容器 2.8启动容器 2.8查看容器日志 3.数据卷命令 3.1创建数据卷 3.2查看所有数据…...

并发编程-学习总结(上)

目录 1、线程基础 1.1、线程实现方法 1.2、如何正确停止线程 1.3、Java线程的六种状态 1.4、wait/notify/notifyAll注意事项 1.4.1、为什么 wait 、notify、notifyAll必须在 synchronized 保护的同步代码中使用? 1.4.2、为什么 wait/notify/notifyAll 被定义…...

QT之OpenGL混合

QT之OpenGL混合1. 概述2. 实现2.1 丢弃片段2.1.1 Demo2.2 混合2.2.1 相关函数2.2.2 排序问题2.2.3 Demo1. 概述 OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。 2. 实现 2.1 丢弃片段 在某些情况下,有些片段是只需要设置显…...

【1255. 得分最高的单词集合】

来源:力扣(LeetCode) 描述: 你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score。 请你帮忙计算玩家在单词拼写游戏中所能获…...

nginx模块介绍

新编译前,在对应的nginx原编译文件夹 如:nginx-1.23.0 下,要 make clean 清空以前编译的objs文件夹,实际上就是执行了rm objs文件夹。 很多要用到git,先yum install git -y echo-nginx-module 让nginx直接使用echo的…...

排错工具ping和trace(电子科技大学TCP/IP实验四)

一.实验目的 1、了解网络连通性测试的方法和工作原理 2、了解网络路径跟踪的方法和工作原理 3、掌握 MTU 的概念和 IP 分片操作 4、掌握 IP 分组生存时间(TTL)的含义和作用 5、掌握路由表的作用和路由查找算法 二.预备知识 …...

node.js中ws模块创建服务端和客户端

一、WebSocket出现的原因 1、Http协议发布REST API 的不足: 每次请求响应完成之后,服务器与客户端之间的连接就断开了,如果客户端想要继续获取服务器的消息,必须再次向服务器发起请 求。这显然无法适应对实时通信有高要求的场景…...

kubernates-1.26.1 kubeadm containerd 单机部署

k8s1.26 kubeadm containerd 安装 kubeadm init 时提示 containerd 错误 failed to pull image “k8s.gcr.io/pause:3.6” 报错日志显示containerd pull时找不到对应的pause版本,而不是registry.k8s.io/pause:3.9 [rootk8s-master containerd]# kubeadm init --k…...

如何在 iPhone 上恢复已删除的通话记录/通话记录

您的通话记录/通话记录可能很重要,尤其是当您想要拨打之前联系过但未保存的号码时。如果您碰巧删除了通话记录(有意或无意),本指南将帮助您了解如何检索它们并找回您需要使用的所有记录。我们将根据您的情况和您拥有的工具讨论不同…...

Canonical为所有支持的Ubuntu LTS系统发布了新的Linux内核更新

导读Canonical近日为所有支持的Ubuntu LTS系统发布了新的Linux内核更新,以解决总共19个安全漏洞。新的Ubuntu内核更新仅适用于长期支持的Ubuntu系统,包括Ubuntu 22.04 LTS(Jammy Jellyfish)、Ubuntu 20.04 LTS(Focal F…...

MS9122是一款USB单芯片投屏器,内部集成了USB2 0 控制器和数据收发模块、HDMI 数据接口和音视频处理模块。MS9122可以通过USB接口显示

MS9122是一款USB单芯片投屏器,内部集成了USB2.0 控制器和数据收发模块、HDMI 数据接口和音视频处理模块。MS9122可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备,支持HDMI视频接口。 主要功能特征 HDMI v1.4兼容 最大…...

C++学习笔记-数据抽象

简单的说,数据抽象是用来描述数据结构的。数据抽象就是 ADT。一个 ADT 主要表现为它支持的一些操作,比方说 stack.push、stack.pop,这些操作应该具有明确的时间和空间复杂度。另外,一个 ADT 可以隐藏其实现细节,比方说…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

深度学习水论文:mamba+图像增强

🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...