当前位置: 首页 > news >正文

ARM32常见指令


### 📌 1. 保存和设置堆栈框架


`.text:00002E88                 PUSH            {R11,LR}`

**PUSH {R11,LR}**:将R11(帧指针)和LR(链接寄存器)推入堆栈,以保存当前的帧指针和返回地址。

`.text:00002E8C                 MOV             R11, SP`

**MOV R11, SP**:将堆栈指针的当前值保存到帧指针R11中。

`.text:00002E90                 SUB             SP, SP, #0x20`

**SUB SP, SP, #0x20**:为本地变量在堆栈上分配32字节的空间。

### 📌 2. 加载字符串地址和处理字符


`.text:00002E94                 LDR             R0, =0xFFFFDEDF`

**LDR R0, =0xFFFFDEDF**:将立即数0xFFFFDEDF加载到R0寄存器中。


`.text:00002E98                 ADD             R0, PC, R0 ; "Alice"`

**ADD R0, PC, R0**:将R0中的值与PC(程序计数器)的值相加,得到字符串"Alice"的地址。

`.text:00002E9C                 LDRB            R1, [R0] ; "Alice"`

**LDRB R1, [R0]**:从R0寄存器指向的内存地址加载一个字节到R1寄存器中。

`.text:00002EA0                 STRB            R1, [R11,#-6]`

**STRB R1, [R11,#-6]**:将R1中的字节存储到R11指向的地址减去6的内存位置中。

### 📌 重复字符处理


类似的指令继续加载和存储字符串 "Alice" 的每个字符到不同的内存位置。

### 📌 3. 加载立即数和浮点操作

`.text:00002ECC                 MOVW            R0, #0x1E`

**MOVW R0, #0x1E**:将立即数0x1E加载到R0寄存器中。

`.text:00002ED0                 STR             R0, [R11,#var_C]`

**STR R0, [R11,#var_C]**:将R0中的值存储到R11指向的地址减去某个偏移量的内存位置中。

`.text:00002ED4                 VLDR            S0, =65.5`

**VLDR S0, =65.5**:将浮点常数65.5加载到S0寄存器中。

`.text:00002ED8                 VSTR            S0, [SP,#0x20+var_10]`

**VSTR S0, [SP,#0x20+var_10]**:将S0寄存器中的浮点数存储到堆栈上的某个偏移位置。

### 📌 4. 转换和调用函数

`.text:00002EE4                 VLDR            S0, [SP,#0x20+var_10]`

**VLDR S0, [SP,#0x20+var_10]**:从堆栈加载浮点数到S0寄存器中。

`.text:00002EE8                 VCVT.F64.F32    D16, S0`

**VCVT.F64.F32 D16, S0**:将单精度浮点数S0转换为双精度浮点数并存储到D16寄存器中。

`.text:00002EF4                 VSTR            D16, [SP,#0x20+var_20]`

**VSTR D16, [SP,#0x20+var_20]**:将D16寄存器中的双精度浮点数存储到堆栈上的某个偏移位置。

`.text:00002EF8                 BL              printf`

**BL printf**:调用`printf`函数。

### 数据处理指令

1. **MOV(Move)**
    
    - **功能**: 将一个值传送到寄存器中。
    - **示例**:
        `MOV R0, #1  ; 将立即数1加载到R0寄存器`
        
2. **ADD(Add)**
    
    - **功能**: 执行加法运算。
    - **示例**:
        `ADD R0, R1, R2  ; 将R1和R2的值相加,并将结果存储到R0中`
        
3. **SUB(Subtract)**
    
    - **功能**: 执行减法运算。
    - **示例**:
        `SUB R0, R1, #10  ; 将R1减去10,并将结果存储到R0中`
        
4. **MUL(Multiply)**
    
    - **功能**: 执行乘法运算。
    - **示例**:
        `MUL R0, R1, R2  ; 将R1和R2的值相乘,并将结果存储到R0中`
        
5. **AND(Logical AND)**
    
    - **功能**: 执行按位与运算。
    - **示例**:
        `AND R0, R1, R2  ; 对R1和R2的值执行按位与运算,并将结果存储到R0中`
        
6. **ORR(Logical OR)**
    
    - **功能**: 执行按位或运算。
    - **示例**:
        `ORR R0, R1, R2  ; 对R1和R2的值执行按位或运算,并将结果存储到R0中`
        
7. **EOR(Exclusive OR)**
    
    - **功能**: 执行按位异或运算。
    - **示例**:
        `EOR R0, R1, R2  ; 对R1和R2的值执行按位异或运算,并将结果存储到R0中`
        
8. **CMP(Compare)**
    
    - **功能**: 比较两个值,并设置条件标志。
    - **示例**:
        `CMP R0, #10  ; 比较R0和10`
        

### 内存访问指令

1. **LDR(Load Register)**
    
    - **功能**: 从内存加载一个字到寄存器。
    - **示例**:
        `LDR R0, [R1]  ; 从R1指向的内存地址加载一个字到R0中`
        
2. **STR(Store Register)**
    
    - **功能**: 将一个字从寄存器存储到内存。
    - **示例**:
        `STR R0, [R1]  ; 将R0中的值存储到R1指向的内存地址`
        
3. **LDRB(Load Register Byte)**
    
    - **功能**: 从内存加载一个字节到寄存器。
    - **示例**:
        `LDRB R0, [R1]  ; 从R1指向的内存地址加载一个字节到R0中`
        
4. **STRB(Store Register Byte)**
    
    - **功能**: 将一个字节从寄存器存储到内存。
    - **示例**:
        `STRB R0, [R1]  ; 将R0中的一个字节存储到R1指向的内存地址`
        

### 分支和控制流指令

1. **B(Branch)**
    
    - **功能**: 无条件跳转到一个地址。
    - **示例**:
        `B label  ; 跳转到标签label处`
        
2. **BL(Branch with Link)**
    
    - **功能**: 跳转到一个地址,并保存返回地址到LR寄存器。
    - **示例**:
        `BL function  ; 跳转到函数function,并保存返回地址`
        
3. **BX(Branch and Exchange)**
    
    - **功能**: 跳转到寄存器中存储的地址,并切换处理器状态(如从ARM状态到Thumb状态)。
    - **示例**:
        `BX LR  ; 跳转到LR寄存器中存储的地址`
        
4. **BEQ(Branch if Equal)**
    
    - **功能**: 如果上一次比较的结果为相等,跳转到一个地址。
    - **示例**:
        `BEQ label  ; 如果相等,跳转到标签label处`
        
5. **BNE(Branch if Not Equal)**
    
    - **功能**: 如果上一次比较的结果为不相等,跳转到一个地址。
    - **示例**:
        `BNE label  ; 如果不相等,跳转到标签label处`
        

### 浮点和SIMD指令

1. **VADD(Vector Add)**
    
    - **功能**: 执行浮点数加法。
    - **示例**:
        `VADD.F32 S0, S1, S2  ; 将S1和S2的浮点数相加,并将结果存储到S0中`
        
2. **VSUB(Vector Subtract)**
    
    - **功能**: 执行浮点数减法。
    - **示例**:
        `VSUB.F32 S0, S1, S2  ; 将S1和S2的浮点数相减,并将结果存储到S0中`
        
3. **VMUL(Vector Multiply)**
    
    - **功能**: 执行浮点数乘法。
    - **示例**:
        `VMUL.F32 S0, S1, S2  ; 将S1和S2的浮点数相乘,并将结果存储到S0中`
        
4. **VSTR(Vector Store Register)**
    
    - **功能**: 将浮点寄存器中的值存储到内存。
    - **示例**:
        `VSTR S0, [SP, #4]  ; 将S0寄存器中的浮点数存储到堆栈上的偏移地址4`
        
5. **VLDR(Vector Load Register)**
    
    - **功能**: 从内存加载一个浮点数到寄存器。
    - **示例**:
        `VLDR S0, [SP, #4]  ; 从堆栈上的偏移地址4加载一个浮点数到S0寄存器`
        
6. **VCVT(Vector Convert)**
    
    - **功能**: 执行浮点数格式转换。
    - **示例**:
        `VCVT.F64.F32 D0, S0  ; 将单精度浮点数S0转换为双精度浮点数并存储到D0中`
        

### 条件执行

在ARM指令中,许多指令可以带有条件码,以便根据条件执行。例如:

1. **ADDEQ(Add if Equal)**
    
    - **功能**: 如果条件为相等,则执行加法。
    - **示例**:
        `ADDEQ R0, R1, R2  ; 如果相等,将R1和R2的值相加,并将结果存储到R0中`
        
2. **MOVNE(Move if Not Equal)**
    
    - **功能**: 如果条件为不相等,则执行移动操作。
    - **示例**:
        `MOVNE R0, #0  ; 如果不相等,将立即数0加载到R0寄存器`

相关文章:

  • JAVA学习笔记DAY11——Java 与 Spring框架发展
  • Scala 中的匿名函数
  • 探索数据结构:集合、线性结构、树状结构和图形结构
  • 一文搞懂Linux信号【下】
  • 【网络安全的神秘世界】关于Linux中一些好玩的字符游戏
  • C# Winform Datagridview查询项目实例
  • vcpkg安装g2o,提示找不到cs.h,debug模式运行提示找不到libcxsparse.dll
  • 注解详解系列 - @Conditional:条件化配置的利器
  • ai assistant激活成功后,如何使用
  • React的Redux的状态管理
  • 如何处理Android应用程序的内存泄漏
  • 聊聊 Mybatis 动态 SQL
  • 【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
  • 命名冲突常见的领域
  • 红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇防火墙组策略ICMPDNSSMB协议出网判断C2上线解决方案
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 2017-08-04 前端日报
  • 77. Combinations
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • JavaScript DOM 10 - 滚动
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node入门
  • OSS Web直传 (文件图片)
  • Python 反序列化安全问题(二)
  • 阿里云前端周刊 - 第 26 期
  • 二维平面内的碰撞检测【一】
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 面试遇到的一些题
  • 前端技术周刊 2019-02-11 Serverless
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用权重正则化较少模型过拟合
  • 我与Jetbrains的这些年
  • MyCAT水平分库
  • ​你们这样子,耽误我的工作进度怎么办?
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • (20)docke容器
  • (安卓)跳转应用市场APP详情页的方式
  • (分布式缓存)Redis持久化
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (三) diretfbrc详解
  • (算法)求1到1亿间的质数或素数
  • (已解决)vscode如何选择python解释器
  • ./configure,make,make install的作用
  • .ai域名是什么后缀?
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET建议使用的大小写命名原则
  • .NET开源、简单、实用的数据库文档生成工具
  • .NET开源项目介绍及资源推荐:数据持久层
  • .Net面试题4
  • .net下简单快捷的数值高低位切换
  • .sdf和.msp文件读取
  • ??myeclipse+tomcat
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [AIGC] HashMap的扩容与缩容:动态调整容量以提高性能