ARM汇编 2.arm常用指令

MOV 赋值操作

寄存器 <= 寄存器/存储器/立即数

MOV{条件}{S} 目的寄存器,源操作数

没有S时指令不更新 CPSR 中条件标志位的值

在这里插入图片描述

立即数:由0-255之间的数据循环右移偶数位生成。(移动规则不用掌握)

在这里插入图片描述

#0xfff不是立即数,而0x80000001是立即数

对于ARM指令 => 机器码 存在一定的规则:(也不用记,只需要有这个概念)

在这里插入图片描述

移位操作

  • LSL(或ASL)逻辑(算术)左移

​ MOV R0,R1, LSL #2 将R1中的内容左移两位后传送到R0,低位用0填充

  • LSR逻辑右移,高位补0

​ MOV R0, R1, LSR #2

  • ASR算术右移,高位用原第31位的值(符号位)填充

​ MOV R0,R1,ASR #2

  • ROR循环右移,高位用低位移出的位来填充

​ MOV R0, R1, ROR #2

  • RRX带扩展的循环右移,高位用进位标志位C来填充

​ MOV R0, R1, RRX #2

# CMP指令

CMP{ 条件 } 操作数 1 ,操作数 2

CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新 CPSR 中条件标志位的值。

CMP R1 R0 ;将寄存器 R1 的值与寄存器 R0 的值相减,并根据结果设置 CPSR 的标志位

TST条件指令

TST{ 条件 } 操作数 1 ,操作数 2

TST 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新 CPSR 中条件标志位的值。

操作数 1 是要测试的数据,而操作数 2 是一个位掩码,根据测试结果设置相应位。

TST R1 #%1 ;用于测试在寄存器 R1 中是否设置了最低位(%表示二进制数)。

在这里插入图片描述

数据处理指令 add sub等

  • ADD

    ADD{ 条件 }{S} 目的寄存器,操作数 1 ,操作数 2:操作数1+操作数2结果存放于目的寄存器

  • ADC

    ADC{ 条件 }{S} 目的寄存器,操作数 1 ,操作数 2:除了操作数1+操作数2,还要加上CPSR中的C条件标志位

  • SUB

    SUB{ 条件 }{S} 目的寄存器,操作数 1 ,操作数 2:SUB 指令用于把操作数 1 减去操作数 2 ,并将结果存放到目的寄存器中。

  • SBC

    SBC{ 条件 }{S} 目的寄存器,操作数 1 ,操作数 2:除了正常的减法,还要再减去CPSR中C条件标志位的反码

  • AND

    AND{ 条件 }{S} 目的寄存器,操作数 1 ,操作数 2:两个操作数按位与

  • ORR

    ORR{ 条件 }{S} 目的寄存器,操作数 1 ,操作数 2:逻辑或

  • BIC

    BIC{ 条件 }{S} 目的寄存器,操作数 1 ,操作数 2:清除操作数1的某些位(看操作数的32位哪些位为1)

跳转指令

在ARM程序中两种方法实现跳转:

1、专门的跳转指令

  • B 跳转指令:B{ 条件 } 目标地址

  • BL 带返回的跳转指令:BL{ 条件 } 目标地址,在跳转之前会自动将PC值保存于R14,后续可以通过将R14的值赋给PC来实现返回

  • BLX 带返回和状态切换的跳转指令 thumb 指令

  • BX 带状态切换的跳转指令 thumb 指令

    目标地址用label表示

    B指令最大寻址空间只有±32MB,对于全部32Bit地址空间,需要直接修改PC来实现

2、直接向PC写入跳转地址值,注意在跳转前把当前PC存下来 MOV LR,PC

程序状态寄存器访问指令MRS、MSR

CPSR访问指令:用于CPSR和通用寄存器之间传送数据

MRS {条件} 通用寄存器,程序状态寄存器( CPSR 或 SPSR):将CPSR的内容传送到通用寄存器

MRS R0,CPSR ;传送 CPSR 的内容到 R0

MSR {条件} 程序状态寄存器( CPSR 或 SPSR )_ <域>,操作数:用于将操作数的内容传送到程序状态寄存器的特定域中。操作数可以为通用寄存器/立即数,<域> 用于设置状态寄存器中需要操作的位,用字符表示不同的位。

MSR CPSR_c ,R0 ;传送 R0 的内容到 CPSR ,但仅仅修改 CPSR 中的控制位域([7:0]位)

MSR SPSR , R0 ; 传送R0的内容到SPSR

LDR STR指令

LDR = load register

LDR {条件} 目的寄存器, <存储器地址>:LDR 指令用于从存储器中将一个 32 位的字数据传送到目的寄存器中。

  • LDR R0 ,[R1] ;将存储器地址为 R1 的字数据读入寄存器 R0
  • LDR R0 ,[R1 R2] ;将存储器地址为 R1+R2 的字数据读入寄存器 R0

STR = store register

STR{条件} 源寄存器, <存储器地址>:STR指令用于从源寄存器中将一个32位的字数据传送到寄存器中。

  • STR r0,[r1,#12]:将r0寄存器的值发送到(r1寄存器中存放数据 偏移#12后)的内存

  • STR r0,[r1],#12:将r0寄存器的值发送到(r1寄存器中的值对应的内存),然后再将r1寄存器的值加上#12

    也就是一个是先赋值后偏移,另一个是先偏移后赋值。

Push Pop指令

push本质上是写内存指令,pop本质上是读指令,读写的位置是sp所指向的位置

push {r3,lr} ; 进栈顺序是高标号的寄存器写到高地址,低标号的寄存器写到低地址,与大括号内寄存器的顺序无关。指令含义是:将lr寄存器的值写入sp,然后sp-4,将r3寄存器的值写入sp,sp-4

pop {r3,pc} ; 将sp指向的值读给r3,sp+4,将sp指向的值读给pc,sp+4

这样的栈是向下增长,即高地址向低地址增长。

ARM寻址方式

  • 立即寻址:立即数寻址
  • 寄存器寻址:利用寄存器中的数值作为操作数
  • 寄存器间接寻址:以寄存器中的值作为操作数的地址,操作数存放在存储器中,如LDR R0,[R1]
  • 基址变址寻址:将寄存器的内容和给定偏移量相加,作为操作数的有效地址,如LDR R0,[R1, #4]
  • 相对寻址:与基址变址寻址方式相类似,相对寻址以程序计数器 PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。(如 BL)
  • 多寄存器寻址:一条指令可以完成多个寄存器值的传送,如LDMIA
  • 堆栈寻址、批量加载/存储指令:LDM批量数据加载、STM批量数据存储

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

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

相关文章

Mysql-ReadView + MVCC-RR 与 RC

实验准备 创建脚本 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,age int(11) NULL DEFAULT NULL,addr varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY …

3款最好用的tron钱包解读:TronLink,Ledger,Bitget钱包

电子钱包是用户连接到区块链网络的重要媒介。除了接收和发送功能外&#xff0c;它还可用于传输虚拟货币。它也是使用分散应用程序&#xff08;DApp&#xff09;的必要工具&#xff01;无论您是想在ON上使用以太坊&#xff0c;EOS还是任何DApp&#xff0c;您都必须先拥有钱包。因…

vxe-table表格合并行和虚拟滚动冲突

项目一直用的vxe-table 2.0版本&#xff0c;支持表格的虚拟滚动&#xff0c;最近要做表格合并行功能&#xff0c;虚拟滚动便失效了&#xff0c;强行虚拟滚动&#xff0c;合并行会有错行现象。 vxe-table2.0给出的解释是&#xff1a;合并行不能和虚拟滚动一起使用。 目前找到两种…

华为配置小型网络WLAN 的基本业务示例

配置小型网络WLAN基本业务示例 组网图形 图1 配置小型网络WLAN基本业务组网图 小型WLAN网络简介配置注意事项组网需求数据规划配置思路操作步骤配置文件 小型WLAN网络简介 本文介绍的WLAN网络是指利用频率为2.4GHz或5GHz的射频信号作为传输介质的无线局域网&#xff0c;相对于有…

【css】设置渐变阴影

css的属性中没有直接设置渐变阴影的&#xff0c;但是可以通过伪元素去实现。 .box-wrap{width: 100%;display: grid;place-content: center; } .box {width: 150px;height: 150px;background: #eee;border: 1px solid #585252;position: relative;transform: translate(0);/* …

论文阅读,Domain Specific ML Prefetcher for Accelerating Graph Analytics(一)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

微调入门篇:大模型微调的理论学习

1、为什么大模型微调 之前在《大模型这块蛋糕,想吃吗》介绍了普通人如何搭上大模型这块列车, 其中有一个就是模型微调,这个也是未来很多IT公司需要发力的方向,以及在《垂直领域大模型的应用更亲民》中论述了为什么微调适合大家,以及微调有什么价值? 作为小程序猿在开始进行微…

Mac截图软件CleanShot X为什么不能识别文字?CleanShot X文字识别教程

好多朋友在使用CleanShot X for Mac截图软件过程中发现不能进行OCR文字识别&#xff1f;其实这是因为你没有给CleanShot X相应的权限导致的&#xff0c;具体操作如下&#xff1a; 第一步、打开&#xff0c;系统偏好设置-隐私与安全设置-完全磁盘访问权限 点击左下方➕ 在应用程…

能替代微软AD的国产化方案,搭建自主可控的身份管理体系

随着国产化替代步伐加速&#xff0c;以及企业出于信息安全建设的需要&#xff0c;越来越多的企业和组织开始考虑将现有的微软 Active Directory&#xff08;AD&#xff09;替换为国产化的LDAP身份目录服务&#xff08;也称统一身份认证和管理&#xff09;系统。本文将介绍一种国…

App测试中ios和Android有哪些区别呢?

App测试中&#xff0c;大家最常问到的问题就是&#xff1a;ios和 Android有什么区别呢&#xff1f; 在Android端&#xff0c;我们经常会使用 JavaScript、 HTML、 CSS等技术来编写一些简单的 UI界面。而 iOS端&#xff0c;我们经常会使用到 UI设计、界面布局、代码结构、 API等…

【经典项目】Java入门,实现斗地主小游戏

一、需求分析 实现斗地主游戏可以涉及以下几个关键步骤和思路&#xff1a; 游戏规则定义&#xff1a;首先&#xff0c;你需要明确斗地主游戏的规则&#xff0c;包括牌的花色和大小、玩家数量、发牌顺序、出牌规则、胜利条件等。 牌的表示和初始化&#xff1a;定义一套扑克牌的…

AtCoder Beginner Contest 338F - Negative Traveling Salesman【floyd+状态压缩dp】

原题链接&#xff1a;https://atcoder.jp/contests/abc338/tasks/abc338_f Time Limit: 6 sec / Memory Limit: 1024 MB Score: 500 points、 问题陈述 有一个有N个顶点和M条边的加权简单有向图。顶点的编号为 1 到 N&#xff0c;i/th 边的权重为 Wi​&#xff0c;从顶点 U…

十年创业记-01-草根搭上时代快车

十年创业的点点滴滴&#xff0c;记录起步、发展到壮大的过程&#xff0c;有失败的教训&#xff0c;有成功的经验&#xff0c;也有一些建议&#xff0c;与君共勉。 今年35岁&#xff0c;创业的第九年&#xff0c;坐标十八线小城市&#xff0c;软件外包行业。从2015年20万的营业额…

GWIT 和GWFI

关于燃烧的历史&#xff1a; -UL request needle flame (open fire) test to rate flammability per UL-94 Vxx UL 要求针焰&#xff08;明火&#xff09;试验以评定UL-94的易燃性。 - industry recognized that glowing wires ( caused by electrical overload) may put …

SQL注入攻击 - 基于布尔的盲注

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 查看靶场详情:SQL Injections 一、判定是否有注入点 以下是一个常见的步骤: 在URL中尝试输入特殊字符,如: " \ -- 等,并观察页面返回的内容。在URL中尝试输入错误的…

[k8s系列]:kubernetes·概念入门

文章目录 序言1 kubernetes概述1.1 kubernetes解决的问题1.1.1 部署方式的演变1.1.2 容器化部署——容器编排问题 1.2 kubernetes组件1.2.1 kubernetes组件调用关系1.2.2 调用逻辑示例 序言 序言&#xff1a;本文将从&#xff0c;第一节&#xff1a;kubernetes解决的问题、组件…

c语言 -文件操作-详解

目录 1.为什么使用文件&#xff1f; 2.什么是文件&#xff1f; 2.1程序文件 2.2数据文件 2.3文件名 3.⼆进制⽂件和⽂本⽂件&#xff1f; 测试 4. ⽂件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 ⽂件指针 4.3文件的打开和关闭 4.3.1熟悉了解⽂件的打…

Linux:进程信号

文章目录 信号的概念实践信号关于前台和后台进程的操作 操作系统与外设信号的产生 前面的篇章结束了信号量的话题&#xff0c;那么接下来引入的是信号的话题&#xff0c;信号和信号量之间没有任何关系&#xff0c;只是名字比较像 信号的概念 在生活中存在各种各样的信号&…

现代C++之万能引用、完美转发、引用折叠FrancisFrancis

转载&#xff1a;现代C之万能引用、完美转发、引用折叠 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/99524127 后期参考(还未整合)&#xff1a;C 完美转发深度解析:从入门到精通_c完美转发-CSDN博客https://blog.csdn.net/qq_21438461/article/details/129938466 0.导语 …

【数据结构 05】双链表

一、原理 双链表又称双向链表&#xff0c;通常情况下是带头循环结构&#xff0c;在CSTL标准模板库中封装的<list.h>头文件就是带头双向循环链表。 特性&#xff1a;增删灵活且高效&#xff0c;支持随机增删但不支持随机访问 设计思路&#xff1a; 链表包含一个头节点h…