汇编基础(1)--ARM32

2023-09-20 18:05:26

简介

ARM32,也称为ARM Architecture v7,是一种32位的指令集架构(ISA),由ARM公司开发并广泛应用于嵌入式系统和移动设备。ARM32是ARM体系结构中较早的版本,被许多处理器核使用,包括Cortex-A、Cortex-R和Cortex-M系列。

ARM32架构的主要特点如下:

  1. 精简指令集:ARM32使用了精简指令集(RISC),指令长度固定为32位,使得指令执行更加高效。

  2. 可变长度指令:ARM32指令可以是16位或32位长,因此可以灵活地进行代码密度和性能的权衡。

  3. 寄存器:ARM32架构提供了一组寄存器,包括通用寄存器、程序计数器(PC)、堆栈指针(SP)等。这些寄存器在程序执行过程中扮演重要的角色。

  4. 特殊模式:ARM32架构支持不同的特殊模式,如用户模式、系统模式、中断模式等,以提供对不同操作环境的支持和保护机制。

  5. 条件执行:ARM32指令集支持条件执行,即指令的执行可以依赖于先前指令执行的结果和标志位的状态。

  6. 异常处理:ARM32具备强大的异常处理能力,可以对外部事件(如中断、故障)做出响应,并进行适当的处理。

函数调用

在ARM32架构中,函数调用参数的传递遵循一定的规则,这些规则通常由编译器实现。下面是一般情况下的函数调用参数传递规则:

  1. 前四个整型(1字长)或指针类型(32位地址)的参数通过寄存器传递,按照顺序依次使用R0、R1、R2和R3寄存器进行传递。
  2. 如果有超过四个整型或指针类型的参数,额外的参数将被依次存储在栈上,从高地址到低地址。
  3. 浮点参数(单精度或双精度)遵循相同的规则,但使用浮点寄存器S0、S1、S2和S3进行传递,并且多余的参数存储在栈上。
  4. 如果参数的大小超过一个字长(4字节),例如结构体或数组,则会将参数的地址传递给对应的寄存器或栈上的位置,而不是直接传递参数的值。
  5. 返回值通常通过R0寄存器返回,如果返回值大于一个字长,则额外的返回值将存储在R1寄存器或栈上。

寄存器

寄存器用途用法示例
R0-R7通用寄存器 用于传递参数MOV r0, #10 :将10移动到R0寄存器
R8-R12通用寄存器ADD r10, r8, r9 :将R8和R9相加并存储到R10
SP堆栈指针PUSH {r0, r1, r2} :将R0、R1和R2推入堆栈
LR链接寄存器,保存返回地址BL subroutine :跳转到子程序subroutine,并保存返回地址
PC程序计数器,存储当前执行的指令地址
CPSR当前程序状态寄存器,保存各种标志位和模式信息TST r0, r1 :对R0和R1进行按位与操作并更新标志位
寄存器用途示例说明
S0单精度浮点数VCVTs32F32 s0, r0将整数值r0转换为单精度浮点数,并存储到S0寄存器
S1单精度浮点数VADDs32 s0, s1, s2将S1和S2寄存器中的浮点数相加,并将结果存储到S0寄存器
S2单精度浮点数VMULs32 s0, s1, s2将S1和S2寄存器中的浮点数相乘,并将结果存储到S0寄存器
S3单精度浮点数VSUBs32 s0, s1, s2将S1和S2寄存器中的浮点数相减,并将结果存储到S0寄存器
S4单精度浮点数VLDR s0, [r0]从内存地址[r0]加载单精度浮点数,并存储到S0寄存器
S5单精度浮点数VSTR s0, [r0]将S0寄存器中的单精度浮点数存储到内存地址[r0]
S6单精度浮点数VCMPs32 s0, s1比较S0和S1寄存器中的浮点数,并设置标志位
S7单精度浮点数VCVTf32s32 s0, s1将S1寄存器中的整数值转换为单精度浮点数,并存储到S0寄存器
S8单精度浮点数VABSs32 s0, s1对S1寄存器中的浮点数取绝对值,并将结果存储到S0寄存器
S9单精度浮点数VNEGs32 s0, s1对S1寄存器中的浮点数求负,并将结果存储到S0寄存器
S10单精度浮点数VSQRTs32 s0, s1对S1寄存器中的浮点数进行平方根运算,并将结果存储到S0寄存器
S11单精度浮点数VDIVs32 s0, s1, s2将S1寄存器中的浮点数除以S2寄存器中的浮点数,并将结果存储到S0寄存器
S12单精度浮点数VFMS32 s0, s1, s2, s3执行先乘后减操作,并将结果存储到S0寄存器
S13单精度浮点数VMAXs32 s0, s1, s2比较S1和S2寄存器中的浮点数,将较大值存储到S0寄存器
S14单精度浮点数VMINs32 s0, s1, s2比较S1和S2寄存器中的浮点数,将较小值存储到S0寄存器
S15单精度浮点数VMOV s0, s1将S1寄存器中的浮点数复制到S0寄存器

指令

指令说明示例
ADC带进位相加ADC r0, r1, r2 :r0 = r1 + r2 (带进位)
ADD相加ADD r0, r1, r2 :r0 = r1 + r2
AND逻辑与AND r0, r1, r2 :r0 = r1 & r2
B分支到另一个位置执行B label :无条件分支到标签为label的位置
BIC位清除(与非)BIC r0, r1, r2 :r0 = r1 & ~r2
BL分支并链接BL subroutine :分支到子程序subroutine,并保存返回地址
BX分支并切换到另一个指令集状态BX r0 :分支到寄存器r0所指示的地址,并切换指令集状态
CMN条件相加并更新标志位CMN r0, r1 :相加r0和r1并更新标志位
CMP条件比较并更新标志位CMP r0, #10 :比较r0和10并更新标志位
EOR异或操作EOR r0, r1, r2 :r0 = r1 ^ r2
LDM从内存加载多个寄存器LDMIA r0!, {r1, r2} :从(r0)加载r1和r2,然后递增r0
LDR从内存加载一个寄存器LDR r0, [r1, #4] :从(r1+4)加载数据到r0
MOV数据移动MOV r0, #10 :将10移动到r0寄存器
MUL乘法运算MUL r0, r1, r2 :r0 = r1 * r2
MVN取反操作MVN r0, r1 :r0 = ~r1
ORR逻辑或操作ORR r0, r1, r2 :r0 = r1
POP出栈操作POP {r0, r1, r2} :从栈中弹出r0、r1和r2
PUSH入栈操作PUSH {r0, r1, r2} :将r0、r1和r2推入栈
RSB反向减法RSB r0, r1, #0 :r0 = 0 - r1
SBC带借位减法SBC r0, r1, r2 :r0 = r1 - r2 - borrow
STM存储多个寄存器到内存STMIA r0!, {r1, r2} :存储r1和r2到(r0),然后递增r0
STR存储一个寄存器到内存STR r0, [r1, #4] :将r0存储到(r1+4)
SUB减法SUB r0, r1, r2 :r0 = r1 - r2
SWI软中断SWI 0x0 :触发软中断0x0
TST位测试操作TST r0, r1 :对r0和r1进行按位与操作并更新标志位

实战

参考

更多推荐

【腾讯云Cloud Studio 实战训练营】深入解析Cloud Studio—React 快速构建点餐页面

序言运气不会凭空而来,只有当你足够努力的时候,才会足够幸运。文章标记颜色说明:黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点腾讯云CloudStudio是一款基于云端的集成开发环境(IDE),它可以让开发人员在任何地方、任何时间使用互联网访问和编写代码,而无需安装任何软件或工具。在本文中,将详细介

Windows 上的 React(初学者)

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录必备条件一些基本术语和概念尝试在VisualStudioCode中使用React尝试通过API使用React如果你不熟悉如何使用React,本指南介绍了一些基础知识,可帮助你入门。一些基本术语和概念尝试在Vis

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio快速构建React完成点餐H5页面还原

文章目录一、前言二、CloudStudio功能介绍三、实验介绍四、实操指导打开官网注册CloudStudio五、开发一个简版的点餐系统安装antd-mobile安装Less六、发布仓库七、开发空间八、总结一、前言IDE(集成开发环境)是一种软件工具,旨在为开发者提供一个集成的开发平台,其中包含了各种用于编写、调试和部署

Pandas 掉包侠刷题实战--条件筛选

本博文内容为力扣刷题过程的记录,所有题目来源于力扣。题目链接:https://leetcode.cn/studyplan/30-days-of-pandas/文章目录准备工作1.isin(values)和~2.df.drop_duplicates()3.df.sort_values()4.df.rename()5.pd

使用FileZilla连接本地和服务器进行文件传输

项目场景:使用FileZilla连接本地和服务器进行文件传输问题描述使用FileZilla连接本地和服务器进行文件传输出现150或425原因分析:1.防火墙是否开放端口2.公共ip或账号密码是否正确解决方案:从配置到解决问题的步骤1.下载安装FileZilla搭建步骤步骤一:安装FileZillaServer服务软件安

适用于 Android™️ 的 Windows 子系统

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录开发人员GitHub预览计划设置开发环境先决条件安装AmazonAppstore适用于Android™️的Windows子系统设置测试和调试在Windows“设置”中启用开发人员模式连接到适用于Android™

适用于 Android 的 Windows 子系统™️发行说明

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录内部版本2304.40000.3.0内部版本2303.40000.3.0内部版本2302.4000内部版本2301.40000.4.0内部版本2211.40000.11.0内部版本2210.40000.7.0内

winscope怎么实现user版本上导出方案设计探讨-千里马android framework车载车机手机系统开发

背景在马哥给讲解怎么用winscope来分析各种闪黑,黑屏等问题后,很多买课的同学都开始使用这个工具用于实际公司的项目了,但是很多同学又开始发现有一个问题,那就发现在user版本的手机设备上发现无法抓取相关的winscope,哪怕可以抓取也发现没办法导出来分析。这个问题在群里求助马哥,这边今天就给出相关的一些解决方案。

【Flutter】 Flutter 状态管理 BLoC 简明使用指南

文章目录一、前言二、FlutterBLoC的安装和配置三、FlutterBLoC的基本使用四、FlutterBLoC的简单示例五、总结一、前言🎉想要精通Flutter,掌握更多技巧和最佳实践?好消息来了!👉Flutter专栏->FlutterDeveloper101入门小册正在等你!📚🔍这里有你需要的所有Flu

【计算机毕业设计】基于SpringBoot+Vue热门网游推荐网站的设计与实现

博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻不然下次找不到哟Sp

2023:生成式AI与存储最新发展和趋势分析(上)

生成式AI的热潮在短时间内席卷全球,以一种势不可挡的趋势迅速出圈,在某一时间段,似乎出现了“除了IT行业,人人都是AI专家”的盛况。这一轮如火如荼的全民AI热潮迸发至今,业已过半载,待最初的烟花绚烂散去,现如今又情形何如?1.独角兽OpenAI倒闭倒计时?2023年8月,印度媒体AnalyticsIndiaMagazi

热文推荐