ARM架构(ARM汇编指令练习)

news2024/10/7 12:26:37

文章目录

  • 前言
  • 一、MOV指令
  • 二、内存访问指令
    • 1.LDR指令
    • 2.STR指令
  • 三、数据处理指令
    • 1.ADD指令
    • 2.SUB指令
    • 3.位操作指令
    • 4.CMP指令
  • 四、跳转指令
  • 总结


前言

本篇文章带大家来学习ARM汇编的一些常用的指令,这里指令都是非常基础的指令。

一、MOV指令

MOV(Move)指令是在ARM架构中用于将数据从一个位置或寄存器复制到另一个位置或寄存器的指令。

在ARM汇编语言中,MOV指令的基本语法格式如下:

MOV{cond}{S} Rd, Operand2

其中:

{cond}是条件码,可选项。用于指定条件执行MOV指令的条件。

{S}是标志位,可选项。用于指定是否更新标志寄存器。

Rd是目标寄存器,用于存储要加载的数据。

Operand2是操作数,即要移动到目标寄存器的值。它可以是另一个寄存器、立即数或寄存器的移位操作。

下面是一些MOV指令的示例:

1.将立即数移动到寄存器:

MOV R0, #42  ; 将立即数42移动到寄存器R0

2.MOV R0, #42 ; 将立即数42移动到寄存器R0

MOV R1, R0  ; 将寄存器R0的值复制到寄存器R1

3.将一个寄存器的值与立即数进行逻辑或运算后,将结果存储到另一个寄存器:

MOV R2, R0 OR #0x18  ; 将寄存器R0的值与立即数0x18进行逻辑或运算后,将结果存储到寄存器R2

4.将一个寄存器的值进行左移,并将结果存储到另一个寄存器:

MOV R3, R0, LSL #4  ; 将寄存器R0的值左移4位,并将结果存储到寄存器R3

MOV指令可以在不同的操作数之间进行数据传输和操作。它在程序中经常用于加载常数、复制寄存器值、进行逻辑运算等操作。

需要注意的是,ARM架构中的一些条件码(cond)和标志位(S)可以用于指定MOV指令的执行条件和是否更新标志寄存器。条件执行可根据先前的条件(例如,相等、大于等于等)决定是否执行指令,而更新标志位可将结果写入条件寄存器,以便进一步的条件执行。

总结起来,MOV指令是在ARM汇编语言中用于将数据从一个位置或寄存器复制到另一个位置或寄存器的指令。它可以用于加载立即数、复制寄存器值、进行逻辑运算等操作。指令的使用可以通过条件码和标志位进行条件执行和标志位更新。

在模拟器中运行:
在这里插入图片描述

二、内存访问指令

1.LDR指令

LDR指令:
LDR指令用于从内存中加载数据到寄存器。它的基本语法为:

LDR{cond}{B}{T} Rd, [Rn{, #offset}]

其中:

{cond}是条件码,可选项。用于指定条件执行LDR指令的条件。

{B}是字节访问标志,可选项。用于指定是否进行字节级别的加载。

{T}是类型标志,可选项。用于指定加载的数据类型,例如字、半字或字节。

Rd是目标寄存器,用于存储从内存中加载的数据。

Rn是基地址寄存器,其中存储了要加载数据的内存地址。

#offset是可选的偏移量,用于指定基地址寄存器Rn与实际数据的偏移量。

LDR指令可以加载整数、浮点数、字符等类型的数据。

2.STR指令

STR指令:
STR指令用于将数据从寄存器存储到内存。它的基本语法为:

STR{cond}{B}{T} Rd, [Rn{, #offset}]

其中:

{cond}是条件码,可选项。用于指定条件执行STR指令的条件。

{B}是字节访问标志,可选项。用于指定是否进行字节级别的存储。

{T}是类型标志,可选项。用于指定存储的数据类型。

Rd是源寄存器,其中存储了要存储到内存的数据。

Rn是基地址寄存器,其中存储了要存储数据的内存地址。

#offset是可选的偏移量,用于指定基地址寄存器Rn与实际数据的偏移量。

STR指令将寄存器中的数据存储到内存中的指定位置。

示例用法:

1.使用LDR指令加载一个字(4个字节)到寄存器R1中:

LDR R1, [R0]  ; 将内存地址存储在R0中的字加载到寄存器R1

2.使用STR指令将寄存器R2中的值存储为一个字(4个字节)到内存地址存储在R0中的位置:

STR R2, [R0]  ; 将寄存器R2的值存储为一个字到内存地址存储在R0中的位置

除了基本格式之外,LDR和STR指令还可通过偏移量和寄存器间接寻址来加载和存储数据。此外,有许多变体指令可用于处理特定类型和大小的数据。

总结:LDR指令用于从内存中加载数据到寄存器,而STR指令用于将数据从寄存器存储到内存。它们可以加载和存储不同类型和大小的数据,并支持偏移量和寄存器间接寻址。这些指令在ARM汇编语言中被广泛使用,用于处理数据的读取和写入操作。

演示:
在这里插入图片描述

三、数据处理指令

1.ADD指令

ADD指令是一种在计算机指令集中常见的算术指令,用于执行两个操作数的相加操作。它可以用于整数、浮点数等各种数据类型的加法运算。

在典型的计算机体系结构中,ADD指令通常有以下格式:

ADD 目标操作数,源操作数

其中,目标操作数是要进行相加运算并将结果存储的位置,源操作数是要相加的值。具体的操作数可以是寄存器、内存地址或立即数。

执行ADD指令时,计算机会将源操作数中的值(或者是地址对应的值)与目标操作数中的值相加,并将结果存储到目标操作数的位置。这个过程可以描述为:目标操作数 = 目标操作数 + 源操作数。

下面是一个示例,展示了使用ADD指令进行加法运算的过程:

MOV R1, 5      ; 将寄存器R1设置为5
MOV R2, 3      ; 将寄存器R2设置为3
ADD R1, R2     ; R1 = R1 + R2

; 在执行完ADD指令后,寄存器R1的值变为8

在这个例子中,我们首先将寄存器R1设置为5,寄存器R2设置为3。然后使用ADD指令将寄存器R1和寄存器R2的值相加,并将结果存储回寄存器R1。最终,寄存器R1的值变为8,即5 + 3的结果。

2.SUB指令

UB指令是计算机指令集中的一种算术指令,用于执行两个操作数的减法操作。它可以用于整数、浮点数等各种数据类型的减法运算。

在典型的计算机体系结构中,SUB指令通常具有以下格式:

SUB 目标操作数,源操作数

其中,目标操作数是要进行减法运算并将结果存储的位置,源操作数是要减去的值。具体的操作数可以是寄存器、内存地址或立即数。

执行SUB指令时,计算机会将源操作数中的值(或者是地址对应的值)从目标操作数中的值中减去,并将结果存储到目标操作数的位置。这个过程可以描述为:目标操作数 = 目标操作数 - 源操作数。

以下是一个示例,展示了使用SUB指令进行减法运算的过程:

MOV R1, 10     ; 将寄存器R1设置为10
MOV R2, 5      ; 将寄存器R2设置为5
SUB R1, R2     ; R1 = R1 - R2

; 在执行完SUB指令后,寄存器R1的值变为5

在这个例子中,我们首先将寄存器R1设置为10,寄存器R2设置为5。然后使用SUB指令,将寄存器R2的值从寄存器R1的值中减去,并将结果存储回寄存器R1。最终,寄存器R1的值变为5,即10 - 5的结果。

3.位操作指令

位操作指令是计算机指令集中用于对数据进行逐位操作的指令。其中,AND(与)、ORR(或)和BIC(位清除)是常见的位操作指令,用于实现逻辑操作和修改特定位的功能。

AND指令(与指令)用于执行逻辑与操作。它按位比较两个操作数,并在结果中设置对应位置的位,如果两个操作数的对应位都为1。具体操作可以表示为:目标操作数 = 操作数1 AND 操作数2。这个指令可以用于清除某些位上的值或进行位屏蔽操作。

例如,对于以下示例:

MOV R1, 0x0F   ; 将寄存器R1设置为0x0F,二进制为 00001111
MOV R2, 0x03   ; 将寄存器R2设置为0x03,二进制为 00000011
AND R3, R1, R2 ; R3 = R1 AND R2

; 执行完AND指令后,寄存器R3的值为0x03,二进制为 00000011

在这个示例中,AND指令将寄存器R1和R2的值逐位进行与操作,并将结果存储在寄存器R3中。结果为0x03,即二进制的 00000011,对应于两个操作数的共同为1的位。

ORR指令(或指令)用于执行逻辑或操作。它按位比较两个操作数,并在结果中设置对应位置的位,如果两个操作数的对应位中至少有一个为1。具体操作可以表示为:目标操作数 = 操作数1 ORR 操作数2。这个指令可用于设置特定位的值或进行位屏蔽操作。

例如,对于以下示例:

MOV R1, 0x0A   ; 将寄存器R1设置为0x0A,二进制为 00001010
MOV R2, 0x03   ; 将寄存器R2设置为0x03,二进制为 00000011
ORR R3, R1, R2 ; R3 = R1 ORR R2

; 执行完ORR指令后,寄存器R3的值为0x0B,二进制为 00001011

在这个示例中,ORR指令将寄存器R1和R2的值逐位进行或操作,并将结果存储在寄存器R3中。结果为0x0B,即二进制的 00001011,对应于两个操作数中至少有一个为1的位。

BIC指令(位清除指令)用于修改目标操作数中特定位的值。它按位比较目标操作数和指定操作数,并将目标操作数的对应位清除(置为0)。具体操作可以表示为:目标操作数 = 目标操作数 BIC 指定操作数。

例如,对于以下示例:

MOV R1, 0x0F   ; 将寄存器R1设置为0x0F,二进制为 00001111
MOV R2, 0x0C   ; 将寄存器R2设置为0x0C,二进制为 00001100
BIC R3, R1, R2 ; R3 = R1 BIC R2

; 执行完BIC指令后,寄存器R3的值为0x03,二进制为 00000011

在这个示例中,BIC指令将寄存器R1和R2的值逐位进行位清除操作,并将结果存储在寄存器R3中。结果为0x03,即二进制的 00000011,对应于目标操作数中通过指定操作数清除的位。

总结来说,AND、ORR和BIC指令是常用的位操作指令,用于执行逻辑与、逻辑或和位清除操作。它们可以用于逐位处理数据,并在逻辑运算和位操作中发挥重要作用。

4.CMP指令

CMP指令是计算机指令集中的一种比较指令,用于比较两个操作数的大小关系或相等性,并根据比较结果设置或更新条件码寄存器(或程序状态字)的标志位。

在典型的计算机体系结构中,CMP指令通常有以下格式:

CMP 操作数1,操作数2

其中,操作数1和操作数2是要进行比较的值,可以是寄存器、内存地址或立即数。

执行CMP指令时,计算机会计算操作数1与操作数2之间的差值,并更新条件码寄存器中的标志位。常见的标志位包括零标志位(Z),负标志位(N),进位标志位(C)和溢出标志位(V)。

常见的比较结果及标志位设置如下:

如果操作数1等于操作数2,则设置零标志位(Z)为1,表示两个操作数相等。
如果操作数1小于操作数2,则设置负标志位(N)为1,表示操作数1为负值。
如果操作数1大于操作数2,则清除负标志位(N)为0,表示操作数1为正值。
如果操作数1小于操作数2,则设置进位标志位(C)为1。
CMP指令经常与条件跳转指令(例如BEQ、BNE、BLT等)配合使用,用于根据比较结果决定程序的执行路径。

以下是一个示例,展示了使用CMP指令进行比较的过程:

MOV R1, 5    ; 将寄存器R1设置为5
MOV R2, 3    ; 将寄存器R2设置为3
CMP R1, R2   ; 比较 R1 和 R2

; 在执行完CMP指令后,根据比较结果,条件码寄存器的标志位可能会更新

在这个示例中,我们首先将寄存器R1设置为5,寄存器R2设置为3。然后使用CMP指令进行比较,比较R1和R2的值。根据比较结果,条件码寄存器的标志位可能会被更新。

需要注意的是,CMP指令只用于比较操作,它不会修改任何操作数的值,只更新标志位。程序可以根据标志位的值执行条件分支或其他操作。

四、跳转指令

1.B(Branch)指令:
B指令是一种无条件跳转指令。它允许程序直接跳转到指定的目标地址执行代码。B指令使用的目标地址可以是一个立即数(即直接指定的跳转地址)或者一个寄存器中存储的地址。B指令不会将任何返回地址保存在寄存器中,因此它是一种非长跳转的指令。

loop:
  ... ; 一些代码
  B loop ; 无条件跳转到loop标签处

2.BL(Branch with Link)指令:
BL指令也是一种跳转指令,但它在跳转之前会将当前的返回地址保存在链接寄存器(通常是LR)中。这使得BL指令可以用于实现函数调用或子程序的跳转。在跳转执行完后,在返回到调用者时,可以使用之前保存的返回地址来继续执行。

function:
  ... ; 函数的代码
  BX LR ; 返回到调用函数的地址
main:
  BL function ; 调用function函数
  ... ; 继续执行其他代码

3.BLX(Branch with Link and Exchange)指令:
BLX指令是一种特殊的跳转指令,它可以在跳转过程中切换处理器的执行状态。它可以从ARM指令集(32位)切换到Thumb指令集(16位),或者从Thumb切换回ARM。BLX指令一般用于访问和执行不同指令集下的库函数或子程序。

thumb_function:
  ... ; Thumb指令集下的函数代码
  BX LR ; 返回到调用函数的地址
arm_function:
  ... ; ARM指令集下的函数代码
  BX LR ; 返回到调用函数的地址
main:
  BLX thumb_function ; 使用BLX指令调用Thumb指令集下的函数
  ... ; 继续执行其他代码
  BLX arm_function ; 使用BLX指令调用ARM指令集下的函数

4.BX(Branch and Exchange)指令:
BX指令用于无条件跳转,并且允许在跳转过程中切换处理器执行状态。类似于BLX指令,BX指令可以从ARM指令集(32位)切换到Thumb指令集(16位),或者从Thumb切换回ARM。与BLX指令不同的是,BX指令不会将返回地址保存在链接寄存器中。

thumb_function:
  ... ; Thumb指令集下的函数代码
  BX LR ; 返回到调用函数的地址
main:
  BX thumb_function ; 使用BX指令跳转到Thumb指令集下的函数
  ... ; 继续执行其他代码

总结

本篇文章讲解了一些基础的汇编指令,掌握了这些基础的汇编指令后我们就有能力去看懂一些汇编代码了,这对于我们了解ARM架构有非常重要的作用。

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

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

相关文章

一个 Kill 不掉的 MySQL 会话

究竟是什么原因,导致主从切换过程中存在一个无法 kill 的会话? 作者:秦广飞 爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查,对数据库有兴趣,对技术有想法。一入 IT 深似海,从此节…

【钱处理】商业计算怎样才能保证精度不丢失

以项目驱动学习,以实践检验真知 前言 很多系统都有「处理金额」的需求,比如电商系统、财务系统、收银系统,等等。只要和钱扯上关系,就不得不打起十二万分精神来对待,一分一毫都不能出错,否则对系统和用户来…

集群 第一章

目录 1.群集的含义 2.群集分类 3.群集架构 4.负载调度工作模式 5.lvs 虚拟服务器 6.nat 模式 lvs 负载均衡群集部署 7.总结 1.群集的含义 由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名与IP地址)&#…

建筑师们,你们该把三维模型弄到PPT里做汇报了!

➤如何实现项目汇报效率比传统的PPT高,同时汇报效果更直观? ➤如何摆脱方案汇报只能向客户交付数据,安装专业软件查看项目成果? ➤如何将无人机航测数据、CAD图纸、BIM设计成果进行融合,挖掘出更深层次的应用&#x…

mysql体系结构及安装部署mysql

目录 1.体系结构 2.安装mysql 1.yum 源安装 2. 第二种安装方式-通用二进制方式 3.mysql改密方式 第一种,知道密码的情况下 第二种,不知道密码 1.体系结构 MySQL server连接层连接池(缓冲池)SQL层系统管理和控制工具SQL…

亿级日活业务稳如磐石 华为云发布性能测试服务CodeArts PerfTest

HDC期间可参与华为云PaaS生态抽奖活动,活动链接在文末 计算机软件作为人类逻辑智慧的伟大结晶之一,已经渗透到了人类社会的各个角落。早期的计算机发展对硬件有很强的依赖性,只有少数的个人或者机构才能拥有软件这种“奢侈品”。但随着软件行…

了解和搭建zabbix 6.0(来日方长)

前言: 作为一个运维,需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等,利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件,我们可以: 通过一个友好的界面进行浏览整个网站所有…

OpenAI呼吁超级智能需要被监管

ChatGPT的创建者OpenAI发出了对超级智能监管的发人深省的呼吁,并与核能的监管进行了类比。在最近的一篇博客文章中,OpenAI强调了人工智能快速发展可能产生的影响以及这个不断变化的领域治理的紧迫性。该公司表示,预计人工智能系统将在未来十年…

你一定要用这个API管理工具,看完你就知道为什么了

以下是经常发生在程序员之间的对话: 小张:你知道为什么程序员不喜欢写文档? 小王:因为代码就是最好的文档啊!谁还需要写那些冗长的说明呢? 小张:那你知道为什么程序员也不喜欢别人不写文档吗…

JAVA POI的excel中包含图片进行读取保存,单张图片,多张图片

JAVA POI的excel中包含图片进行读取保存,单张图片,多张图片 ---------------------------------------------效果---------------------------------------------------------- 1.单张图片 2.多张图片 import java.io.FileInputStream; import java.io.FileOutputStream;…

途乐证券|有色金属板块崛起涨超2%,云南锗业两连板

周三(7月5日),A股三大股指震荡整理。截至上午收盘,上证指数跌幅达0.51%,报3228.68点;深证成指和创业板指跌幅分别为0.53%和0.59%;沪深两市合计成交额5310.1.6亿元,总体来看,两市个股跌多涨少。 …

机器学习25:《数据准备和特征工程-III》采样和分隔

目录 1.采样和分割数据 1.1 抽样简介 1.2 过滤 PII(个人身份信息) 2.数据不平衡 2.1 下采样和增加权重 3.数据分割示例 3.1 随机分割可能不是最好的方法 4.分割数据 5.随机化 5.1 实际考虑 5.2 散列的注意事项 6.参考文献 1.采样和分割数据-…

2023,中国电商重回元老时代

中国的历史上不缺“太上皇”,但“太上皇”再度站到台前的很少。公元1457年,被囚禁在南宫的“太上皇”朱祁镇复位,上演了中国历史上少见的南宫复辟。而危机时刻被推举为皇帝的朱祁钰,后来的庙号是代宗,阴阳怪气十足。 …

php://input文件包含

实验目的 通过本实验,了解php封装伪协议,掌握php://input文件包含的用法 实验环境 操作机:kali 靶机:Windows 实验地址:http://靶机ip/exp/include2/input/input2/ 工具:burpsuite 用户名&#xff1a…

好用的屏幕录制工具--Bandicam(班迪录屏)

最近准备录个电脑的音频,找了好多个软件,除了收费就是功能有限,经过好一番折腾试用,发现了2个介面友好功能强大的录屏、录音软件: ① Bandicam(班迪录屏)(强烈推荐) ② 数据蛙录屏 Bandicam(班迪…

【PC】CPU与GPU

文章目录 CPU与主板CPU是什么主板是什么功能 GPU与显卡GPU是什么显卡是什么功能 CPU与GPU的关系 ALU: 算术单元(Arithmetic Unit):算术单元执行基本的算术运算,如加法、减法、乘法和除法。它能够对整数、浮点数和定点数…

适合成长型企业的4个 CRM 工作流程

如果你在繁琐的任务上花费太多的时间并难以让你的业务井井有条,CRM工作流程自动化可能会解决你的问题。 CRM(客户关系管理系统)是自动化工作流程最有效的工具之一,因为它可以帮助你从一个地方完成关键工作流程。CRM工作流程使你能…

软件测试技能,JMeter压力测试教程,获取post请求x-www-form-urlencoded格式的数据(二十四)

一、前言 post请求的参数有一些是json格式,也有一些是x-www-form-urlencoded格式,前面讲签名的时候获取到post请求的是json格式 本篇继续讲x-www-form-urlencoded格式的请求body如何获取到 二、x-www-form-urlencoded 在请求头部添加Content-Type类型…

CodeForces..移位密码器.[简单].[字符比较]

题目描述: 题目解读: 对字符串 a 进行加密后得到j加密字符串 s 。 加密规则为: 在字符串 a 的每个字符之后,添加任意(可能为零)数量的小写字母,与字符本身不同。 在每次这样的添加之后,我们将原字符添加…

【来不及刷题之】42、括号生成(递归)

常规的方法是用回溯来写这个题,但是回溯理解起来实在是有一点困难,下面这个思路是直接用递归来生成,首先要明确的是,在已经生成的字符串中,左括号的数量一定要大于等于右括号的数量,否则就不合法&#xff0…