汇编基础(1)--ARM32

这篇具有很好参考价值的文章主要介绍了汇编基础(1)--ARM32。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

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架构中,函数调用参数的传递遵循一定的规则,这些规则通常由编译器实现。下面是一般情况下的函数调用参数传递规则:文章来源地址https://www.toymoban.com/news/detail-779584.html

  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进行按位与操作并更新标志位

实战

参考

到了这里,关于汇编基础(1)--ARM32的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM底层汇编基础指令

    伪操作 不参与程序执行,但是用于告诉编译器程序怎么编译 .text .global .end .if .else .endif .data 汇编指令 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能 伪指令 不是指令,看起来像是一条指令,可以实现和指令类似

    2024年02月06日
    浏览(28)
  • 嵌入式:ARM汇编语言程序设计基础教程

    ① 合理地分配存储器资源,将前述的目标系统‘数据结构模型’表示到各存储器单元。 ② CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。 用计算机语言,对数据结

    2023年04月23日
    浏览(71)
  • KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2

    根据《KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记6 - STM32的CAN学习与测试1》的讨论,我实现了单机的回环模式的CAN测试。后来在测试中又有下面的积累。 在回环模式下,不会有ACK检定,也不会有ACK不应答的报警。 由于CANTX实际上并不把数据发给CAN收发器,只是在芯片里面转一圈就

    2024年02月22日
    浏览(36)
  • [ARM汇编]计算机原理与数制基础—1.1.4 逻辑运算

    在计算机中,逻辑运算是对二进制数据进行操作的基础。逻辑运算主要包括以下几种:与(AND)、或(OR)、非(NOT)和异或(XOR)。接下来,我们将详细介绍这几种逻辑运算的原理及其应用。 与(AND)运算 与运算的规则如下: 0 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1 两个二进

    2024年02月08日
    浏览(40)
  • [ARM汇编]计算机原理与数制基础—1.1.3 二进制补码

    在计算机中,为了表示有符号整数(即正数和负数),通常采用二进制补码表示法。二进制补码不仅可以表示负数,还能简化计算机的加法和减法运算。接下来,我们将介绍二进制补码的概念及其计算方法。 原码、反码和补码 在讨论补码之前,我们先了解一下原码和反码的

    2024年02月08日
    浏览(35)
  • [ARM汇编]计算机原理与数制基础—1.1.1计算机的基本原理

    计算机是一种能够根据指令集自动、高速处理数据的现代化设备。它的基本原理可以总结为:输入、存储、处理和输出数据。接下来,我们将详细介绍这些基本原理。 输入 计算机通过输入设备(如键盘、鼠标等)接收外部数据。用户可以通过这些设备输入指令或数据,计算

    2024年02月08日
    浏览(34)
  • [ARM汇编]计算机原理与数制基础—1.1.2 二进制与十进制数制转换

    在计算机中,我们通常使用二进制数制来表示数据,因为计算机的基本电平只有两种状态:高电平(通常表示为 1)和低电平(通常表示为 0)。而在我们的日常生活中,我们习惯使用十进制数制。为了方便理解,我们需要掌握二进制与十进制之间的转换方法。 二进制转十进

    2024年02月08日
    浏览(38)
  • 【ARM64 常见汇编指令学习 12 -- ARM 汇编函数 的学习】

    上篇文章:ARM64 常见汇编指令学习 11 – ARM 汇编宏 .macro 的学习 下篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 ARM汇编中的函数定义并不像高级语言那样有特定的语法,但通常可以通过 标签(label) 和 子程序调用指令 (如BL,BLX) 来实现类似于函数的功能。 例如

    2024年02月14日
    浏览(35)
  • 【ARM系列】ARM常用汇编指令

    在调试芯片启动代码或者分析ARM core运行流程的过程中,尝尝需要对照软件代码的反汇编文件进行分析,因此有必要掌握一些常用的arm汇编指令。 指令格式:MOV{条件}{S} 目的寄存器,源操作数 指令含义:将源操作数赋值给目的寄存器。源操作数可以是寄存器,立即数或带移位

    2024年02月04日
    浏览(26)
  • ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习

    下篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 上篇文章:ARM64 常见汇编指令学习 10 – 无符号位域提取指令 BFXIL 在 ARM 汇编中,“ .macro ” 是用来定义一个宏的指令。宏可以看作是一个可以在汇编程序中重用的代码段。当调用宏时,汇编器会将宏的内容插入到调

    2024年02月14日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包