• 汇编基础(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架构中,函数调用参数的传递遵循一定的规则,这些规则通常由编译器实现。下面是一般情况下的函数调用参数传递规则:

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

    实战

    参考

  • 相关阅读:
    什么是Vue的Vetur插件?它有哪些功能
    设计模式之代理模式
    深入理解ClickHouse跳数索引
    24v转12v转9v转5v转4.2v降压电源芯片AH8788
    【ACWING】【2】前缀和
    PMP 考试常见工具与技术点总结
    图像检测:医疗影像分割
    [附源码]Python计算机毕业设计SSM健身房预约平台(程序+LW)
    关于Synchronized锁的到底是什么元素
    fastify-swagger 7.4.1
  • 原文地址:https://blog.csdn.net/qq_30135181/article/details/133091225