ARM汇编指令速过

目录

ARM的寄存器

ARM汇编指令

存储访问

数据传送指令

算数逻辑运算指令

操作数2的详细说明

比较指令

条件组合指令

跳转指令

ARM寻址方式

ARM伪指令

ARM汇编程序的基本格式

符号和标号

伪操作


本博客是一个速记,不是专门的讲解!打算后修再进一步细究!

ARM的寄存器

ARM的寄存器比x86下的体系要多得多。在ARM架构中,寄存器可以根据功能和用途进行分类,主要包括通用寄存器、状态寄存器、浮点寄存器、专用寄存器、访问控制寄存器和调试寄存器。

通用寄存器通常有16个(R0-R15),用于存储操作数、中间结果和函数参数。其中,R13是堆栈指针(SP),R14是链接寄存器(LR),R15是程序计数器(PC)。状态寄存器包括程序状态寄存器(CPSR)和中断控制寄存器(SPSR),CPSR保存当前程序的状态信息,SPSR用于保存异常处理前的CPSR值。

浮点寄存器专门用于处理浮点运算和SIMD操作,支持多种浮点数据类型。专用寄存器用于特定功能,例如控制和中断处理。访问控制寄存器存储访问权限信息,确保系统安全。调试寄存器则用于调试和性能监控,帮助开发人员跟踪程序执行。通过这些分类,ARM架构的寄存器有效支持了各种操作模式和计算需求。

ARM汇编指令

<opcode> {<cond> {s} <Rd>, <Rn>, {, <oprand2>}}

<>是必选项,{}是可选的

  • <opcode>是二进制机器指令的操作助记符, <cond>是执行条件。S表达是否影响CPSR寄存器的标志位

  • <Rd>: 目标寄存器

  • <Rn>:第一个操作数

  • <oprand>:第二个操作数

存储访问

ARM是典型的加载/存储架构体系,只能通过Load, Store指令对内存进行操作。

  • LDR R1, [R0]

  • STR R1, [R0]

  • LDRB/STRB

  • LDM/STM

  • SWP R1, R1, [R0]

  • SWP R1, R2, [R0]

STM / LDM 指令可以用来模拟栈。这里有四种类型的堆栈:满递增堆栈,满递减堆栈,空递增堆栈,空递减堆栈。

  • 满递增堆栈是指堆栈从低地址向高地址增长,数据项按顺序填充至堆栈顶部。此格式适用于当堆栈在初始化时已经分配了固定的空间,并且数据逐渐增加。

  • 满递减堆栈则是从高地址向低地址增长,类似于满递增堆栈,但堆栈顶部位于低地址。这种格式通常用于需要在程序运行中向堆栈中压入数据的情况。

  • 空递增堆栈意味着堆栈从低地址向高地址增长,但在实际使用中,堆栈并未被填满,通常用于动态分配内存的场景,以便在后续操作中逐渐填充数据。

  • 空递减堆栈与空递增堆栈相反,它从高地址向低地址增长,但同样未被完全填充。这种格式通常用于动态管理堆栈空间,以便灵活地处理数据。

当然,堆栈满足的栈特性,我们不再赘述

数据传送指令

MOV {cond} {S} Rd, oprand2
MVN {cond} {S} Rd, oprand2

MOV指令用于将一个寄存器的值传送到另一个寄存器。它可以用来加载常数值或者将一个寄存器的内容复制到另一个寄存器。MOV指令支持多种寻址方式,可以直接传递立即数,也可以传递寄存器的值。该指令在进行数据处理时非常常用。

MVN指令则是“Move Negative”的缩写,用于将立即数的补码(即反转所有位并加一)加载到目标寄存器。MVN指令的作用与MOV相似,但它的结果是将目标寄存器设置为立即数的逻辑非(按位取反)。这使得MVN在需要对某个值取反时非常有用。

算数逻辑运算指令

让我们先看看格式:

ADD {cond} {S} Rd, oprand2
ADC {cond} {S} Rd, oprand2
SUB {cond} {S} Rd, oprand2
AND {cond} {S} Rd, oprand2
ORR {cond} {S} Rd, oprand2
EOR {cond} {S} Rd, oprand2
BIC {cond} {S} Rd, oprand2

加法指令

  1. ADD:将两个寄存器的值相加,并将结果存储在目标寄存器。

  2. ADC:带进位的加法,用于处理多字节加法,考虑了前一操作的进位。

减法指令:

  1. SUB:将一个寄存器的值从另一个寄存器中减去,并将结果存储在目标寄存器。

  2. SBC:带借位的减法,用于处理多字节减法,考虑了前一操作的借位。

乘法指令:

  • MUL:计算两个寄存器的乘积,并将结果存储在目标寄存器。

  • MLA:乘法后加,计算两个寄存器的乘积并加上第三个寄存器的值。

逻辑运算指令:

  • AND:按位与操作,将两个寄存器的对应位进行与运算。

  • ORR:按位或操作,将两个寄存器的对应位进行或运算。

  • EOR:按位异或操作,将两个寄存器的对应位进行异或运算.

  • BIC:按位清除操作,用于清除一个寄存器中与另一个寄存器对应位相同的位。

移位指令:

  • LSL(逻辑左移):将寄存器的位向左移动,右侧用零填充。

  • LSR(逻辑右移):将寄存器的位向右移动,左侧用零填充。

  • ASR(算术右移):将寄存器的位向右移动,保持符号位。

  • ROR(循环右移):将寄存器的位循环右移。

操作数2的详细说明

我们看到了太多的例子说明oprand2的使用了,现在我们说说oprand2的,这里既可以是一个操作数:#N(N是一个常数),也可以是一个寄存器

比较指令

在ARM架构中,比较指令主要用于对两个操作数进行比较,以设置条件标志而不存储结果。常见的比较指令包括:

CMP指令,用于比较两个寄存器的值。该指令会计算第一个寄存器的值减去第二个寄存器的值,并更新状态寄存器中的条件标志(如零标志、负标志和进位标志)。

CMN指令,用于比较一个寄存器的值与另一个寄存器的值相加。实际上,它执行的是加法运算并更新条件标志。CMN通常用于检查是否存在溢出或负值。

TST指令,用于按位与操作两个寄存器的值,并根据结果更新状态标志。TST不改变任何寄存器的值,只是用于设置条件标志。

TEQ指令,执行按位异或操作以比较两个寄存器的值,并更新状态标志。TEQ也不会改变寄存器的值,而是用于检查两个值是否相等。

这些比较指令为条件执行和分支提供了基础,使得ARM架构能够高效地处理条件逻辑

条件组合指令

在ARM架构中,CPSR(Current Program Status Register)寄存器包含多个标志位,用于指示程序的状态,并用于条件执行指令的判断。这些标志位主要包括:

  • N(Negative Flag):当结果为负数时设置,用于指示最后一次运算的符号。

  • Z(Zero Flag):当结果为零时设置,指示最后一次运算的结果是否为零。

  • C(Carry Flag):在加法操作中,表示是否发生了进位;在减法操作中,表示是否发生了借位。

  • V(Overflow Flag):当发生溢出时设置,指示最后一次运算的结果超出了能够表示的范围。

在ARM指令集中,各种条件码与这些标志位的组合如下:

  1. EQ(Equal):条件为真,当Z标志被设置。

  2. NE(Not Equal):条件为真,当Z标志未被设置

  3. GT(Greater Than):条件为真,当N标志和Z标志都未被设置。

  4. LT(Less Than):条件为真,当N标志被设置。

  5. GE(Greater Than or Equal):条件为真,当N标志和Z标志一致

  6. LE(Less Than or Equal):条件为真,当N标志被设置或Z标志被设置。

  7. MI(Minus):条件为真,当N标志被设置。

  8. PL(Plus):条件为真,当N标志未被设置。

  9. VS(Overflow):条件为真,当V标志被设置。

  10. VC(No Overflow):条件为真,当V标志未被设置。

  11. HI(Higher):条件为真,当C标志被设置且Z标志未被设置。

  12. LS(Lower or Same):条件为真,当C标志未被设置。

  13. AL(Always):无条件执行,始终为真。

跳转指令

  • B(Branch):无条件跳转到指定的地址。该指令将程序计数器(PC)更新为目标地址,实现跳转。

  • BL(Branch with Link):无条件跳转并将返回地址(下一条指令的地址)保存到链接寄存器(LR),通常用于调用函数。返回时可以使用BL指令所保存的LR值进行返回。

  • BX(Branch and Exchange):跳转到指定地址,并根据目标地址的最低位来决定是切换到ARM状态还是Thumb状态。如果目标地址最低位为1,则进入Thumb状态;如果为0,则保持ARM状态。

  • CBZ(Compare and Branch if Zero):比较寄存器的值,如果值为零则跳转到指定地址。

  • CBNZ(Compare and Branch if Not Zero):比较寄存器的值,如果值不为零则跳转到指定地址。

  • TBZ(Test and Branch if Zero):测试寄存器中的某一位,如果该位为零则跳转到指定地址。

  • TBNZ(Test and Branch if Not Zero):测试寄存器中的某一位,如果该位不为零则跳转到指定地址。

ARM寻址方式

  • 立即数寻址方式使用直接指定的数值作为操作数。立即数通常以特定格式编码在指令中,便于快速访问常量。

  • 寄存器寻址方式通过指定一个寄存器来获取操作数,指令直接使用寄存器中的值,适合快速访问数据。

  • 基址寻址方式结合基址寄存器和偏移量,使用基址寄存器中的值加上一个立即数或另一个寄存器的值来计算目标地址。这种方式常用于访问数组或结构体元素。

  • 索引寻址方式类似于基址寻址,通常用于数组访问。它将一个寄存器作为基址,另一个寄存器作为索引,计算出目标地址。

  • 相对寻址方式将当前程序计数器的值与立即数相加,计算出跳转目标地址。该方式广泛应用于控制流指令,如跳转和分支。

  • 间接寻址方式通过寄存器中的地址来获取操作数,适合动态数据结构,如链表和树。

ARM伪指令

LDR(Load Register)指令用于从内存加载数据到寄存器。它可以直接使用地址、基址加偏移量的形式,或通过立即数加载常量到寄存器。其基本语法为:

LDR Rn, [address] ADR(Address of Label)是一个伪指令,用于将一个标签(地址)加载到寄存器中。它允许程序员将一个特定的内存地址赋值给寄存器,便于后续的操作。它的语法通常如下:

ADR Rn, label ADR会计算标签所对应的地址,并将其加载到指定的寄存器中。与LDR相比,ADR不会访问内存,只是处理地址,因此通常用于跳转或调用函数时。

ARM汇编程序的基本格式

    AREA my_code, CODE, READONLY  ; 定义代码区域ENTRY _start                   ; 定义入口点
​
_start:                           ; 程序开始MOV R0, #5                    ; 将5放入R0寄存器MOV R1, #10                   ; 将10放入R1寄存器ADD R2, R0, R1                ; R2 = R0 + R1 (5 + 10)
​; 结束程序MOV R7, #1                    ; 系统调用号,1表示退出SVC 0                         ; 调用系统服务
​AREA my_data, DATA, READWRITE ; 定义数据区域
message: .asciz "Hello, ARM!"     ; 字符串数据
​END                            ; 程序结束

上面就是一个最平凡的纯汇编程序,当然,在没有汇编链接器的作用下,不得不使用ENTRY告诉我们的程序入口在哪里。

符号和标号

在ARM汇编程序中,符号和标签是理解和编写程序的关键元素。这些元素不仅帮助程序员组织代码,还增强了可读性和可维护性。

符号在汇编语言中充当标识符,通常用于代表变量、常量、函数或内存地址。它们允许程序员使用更具描述性的名称来代替硬编码的数值或地址,使代码更加易读。例如,假设我们需要在程序中存储一个整数,如果直接使用数字,可能会让人感到困惑。通过定义一个符号,我们可以清晰地表达这个整数的意义,比如“MAX_SIZE”。在代码中引用该符号时,编译器会自动将其替换为相应的值,这样,程序员可以更容易理解和维护代码。

符号的使用不仅限于数据定义。在函数调用和返回值处理中,符号也起到了至关重要的作用。通过符号,程序员可以清楚地指示函数的参数和返回值的位置,而不是依赖于固定的寄存器或内存地址。这种方式减少了错误的可能性,使得函数的使用更加灵活。

标签则是指在代码中用于标识特定位置的名称,通常以一个标识符加冒号的形式出现。标签的主要目的是为跳转指令提供目标地址,使得程序的控制流能够在不同位置之间跳转。在ARM汇编中,常见的控制流指令包括条件跳转和无条件跳转。通过使用标签,程序员可以在执行过程中改变程序的执行路径,实现循环、条件分支和函数调用等功能。

伪操作

查阅下表,伪操作是不隶属于架构体系下的汇编语言,他只是方便!

伪操作说明
DATA指示后续内容为数据段,通常用于定义变量和常量。
TEXT指示后续内容为代码段,包含可执行指令。
BSS指示未初始化的全局和静态变量,分配内存但不初始化。
GLOBAL定义一个符号为全局可见,使得其他文件可以引用。
EXTERN声明一个外部符号,表示该符号在其他文件中定义。
EQU定义一个常量符号,使得符号可以在程序中以该值引用。
ORG设置程序计数器(PC)到指定的地址。
SECTION定义一个新的节,允许程序员组织代码和数据。
ASCIZ定义以零结尾的字符串,常用于存储字符串数据。
ALIGN确保接下来的数据在指定的字节边界上对齐。
INCLUDE包含其他文件的内容,便于模块化和重用代码。
END指示汇编文件的结束。
SIZE定义一个符号的大小,通常与数据结构的长度相关联。
TYPE定义一个符号的类型,指示该符号是函数、变量等。
MACRO定义一个宏,可以在程序中多次调用以简化代码。
ENDM结束宏定义。
SET定义或修改符号的值。

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

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

相关文章

SD教程 重绘 ControlNet-Inpain

SD教程 重绘 ControlNet-Inpain ———————————————— 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。原文链接&#xff1a;https://blog.csdn.net/A1353192296/article/details/13…

【界面改版】JimuReport 积木报表 v1.9.0 版本发布,填报能力和大屏能力

项目介绍 积木报表JimuReport&#xff0c;是一款免费的数据可视化报表&#xff0c;含报表、仪表盘和大屏设计&#xff0c;像搭建积木一样完全在线设计&#xff01;功能涵盖&#xff1a;数据报表、打印设计、图表报表、门户设计、大屏设计等&#xff01; Web版报表设计器&#x…

【网络】1.UDP通信

UDP通信 1 server1.1 server建立的步骤1.2 运行server 2 client2.1 client的建立步骤2.2 运行client 3 总结3.1 server3.2 client 1 server server的启动方式是&#xff1a;./udpserver 8080 --> 格式就是./proc port端口 port端口自己指定 1.1 server建立的步骤 获取文件描…

告别冰冷机器声:GLM-4-Voice开启情感语音交互新时代!

目录 引言一、GLM-4-Voice概述二、GLM-4-Voice的架构三、GLM-4-Voice的主要功能四、GLM-4-Voice的技术原理五、GLM-4-Voice的应用场景六、GLM-4-Voice体验快速开始结语 引言 在人工智能的不断进步中&#xff0c;语音交互技术正逐渐成为人机沟通的重要桥梁。它不仅极大地提升了…

MySQL定时异机备份

场景&#xff1a;将A机器MySQL数据库部分表每日定时备份到B机器上 &#xff08;只适用于Linux&#xff09; 实现方式算是比简单了&#xff0c;就是用mysqldump生成文件&#xff0c;使用scp命令传输到另一台机器上。 1. 编写备份shell脚本 在A机器新建脚本 (当然没有vim的话vi…

使用VS2019将C#代码生成DLL文件在Unity3D里面使用(一)

系列文章目录 untiy知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、首先你要先有VS&#x1f449;二、引用UnityAPI使用步骤&#x1f449;2-1.引用unitydll文件到项目里面&#x1f449;2-2.导入Dll文件 &#x1f449;三、编辑dll代码&#x1f449;四、导出dll…

平台化运营公司如何在创业市场招商

在当今商业环境中&#xff0c;平台化运营的公司正成为推动经济发展的重要力量。对于这类公司而言&#xff0c;在创业市场招商意义重大。 平台化运营公司具有独特特点&#xff1a;通过搭建开放共享平台连接供需双方&#xff0c;实现资源优化配置与价值创造。比如电子商务平台、社…

聚类分析算法——K-means聚类 详解

K-means 聚类是一种常用的基于距离的聚类算法&#xff0c;旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面&#xff0c;我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…

SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题

目录 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 3.前后端分离的项目SpringMVC执行流程 4. 面试题 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 流程图&#xff1a; 更加生动的描述&#xff1a; DisPatcherServlet…

十分钟Linux中的epoll机制

epoll机制 epoll是Linux内核提供的一种高效I/O事件通知机制&#xff0c;用于处理大量文件描述符的I/O操作。它适合高并发场景&#xff0c;如网络服务器、实时数据处理等&#xff0c;是select和poll的高效替代方案。 1. epoll的工作原理 epoll通过内核中的事件通知接口和文件…

GRE Over IPsec(华三)

GRE Over IPsec 顾名思义&#xff0c;GRE在内&#xff0c;IPsec在外 那么当数据进入tunnel隧道后&#xff0c;会先被GRE封装后再进行IPsec感兴趣流acl匹配&#xff0c;匹配上了则封装IPsec&#xff0c;没匹配上则丢包 实验&#xff1a; 需求&#xff1a;总部pc能够通过gre o…

echarts属性之xAxis

xAxis 直角坐标系 grid 中的 x 轴&#xff0c;一般情况下单个 grid 组件最多只能放上下两个 x 轴&#xff0c;多于两个 x 轴需要通过配置 offset 属性防止同个位置多个 x 轴的重叠。 所有属性 xAxis. id string 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引…

盘点:2024年最新热门项目管理平台TOP11

一、项目管理平台的重要性 在当今竞争激烈的商业环境中&#xff0c;项目管理平台已成为企业提高效率和团队协作的关键工具。这主要是因为现代商业项目日益复杂&#xff0c;涉及多个部门、众多资源以及不断变化的需求。 首先&#xff0c;项目管理平台能够提高工作效率。例如&a…

PHP数据类型

几种常用的数据类型&#xff1a; String&#xff08;字符串&#xff09; Integer&#xff08;整型&#xff09; Float&#xff08;浮点型&#xff09; Boolean&#xff08;布尔型&#xff09; NULL&#xff08;空值&#xff09; Array&#xff08;数组&#xff09; Obje…

【大数据】Flink + Kafka 实现通用流式数据处理详解

目录 一、前言 二、流式数据处理场景介绍 2.1 流式数据处理概述 2.1.1 流式数据处理场景介绍 2.2 流式数据处理技术栈 2.2.1 数据采集 2.2.2 数据处理 2.2.3 数据存储 2.2.4 数据展示 2.3 流式数据处理场景面临的问题和挑战 三、通用的流式数据处理场景解决方案 3.1…

精准测试在基金团队应用实践

以下为作者观点&#xff1a; 一、引言 精准测试是一套计算机测试辅助分析系统&#xff0c;精准测试的核心组件包含&#xff0c;软件覆盖率分析、用例和代码的双向追踪、智能回归测试用例选取、缺陷定位、测试用例聚类分析、测试用例自动生成系统&#xff0c;这些功能完整的构…

参与国家标准制定对企业发展有哪些好处?

1. 提升企业竞争力&#xff1a; • 技术优势凸显&#xff1a;参与标准制定的过程中&#xff0c;企业能将自身先进的技术和管理理念融入标准&#xff0c;这不仅是对企业技术实力的认可&#xff0c;也能使企业在行业中占据技术制高点。 • 质量优势强化&#xff1a;国家标准对产品…

滚柱导轨出现异常损坏的原因

滚柱导轨是一种精密的直线滚动导轨&#xff0c;具有较高的承载能力和较高的刚性&#xff0c;对反复动作、起动、停止往复运动频率较高情况下可减少整机重量和传动机构及动力成本。滚柱导轨可获得较高的灵敏度和高性能的平面直线运动&#xff0c;在重载或变载的情况下&#xff0…

开发了一个成人学位英语助考微信小程序

微信小程序名称&#xff1a;石榴英语 全称&#xff1a;石榴英语真题助手 功能定位 北京成人学士学位英语辅助学习工具&#xff0c;包含记高频单词&#xff0c;高频词组&#xff0c;专项练习&#xff0c;模拟考试等功能。 开发背景 个人工作需要提高学习英文水平&#xff…

基于Matlab 火焰识别技术

Matlab 火焰识别技术 课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff…