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寄存器`

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

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

相关文章

时间安排表:

首先,我们需要确定从当前时间(2024年6月22日14:05:26)到晚上11点的总时间。然后,我们将从这个总时间中减去你计划的运动时间,以计算出剩余的学习或计算时间。 1. **计算总时间**: - 当前时间:2…

CST初级教程 七

本教程将实例讲解CST设计优化仿真及其操作步骤。下面是一个微带功率分配器的图片: 一 3D建模 Substrate 建模 Step1 绘制Substrate外形 Substrate 的尺寸参数如下: Step2 添加新材料Substrate Step3 将新建的材料分配给Substrate 选中新建材料Substra…

数学建模系列(3/4):典型建模方法

目录 引言 1. 回归分析 1.1 线性回归 基本概念 Matlab实现 1.2 多元回归 基本概念 Matlab实现 1.3 非线性回归 基本概念 Matlab实现 2. 时间序列分析 2.1 时间序列的基本概念 2.2 移动平均 基本概念 Matlab实现 2.3 指数平滑 基本概念 Matlab实现 2.4 ARIM…

C# 一个串口通信的案例实现

通信规格书&#xff1a; 指定页读取规范&#xff1a; HOST&#xff1a;<LF>RPP1<CR> Reader:<LF>R<FAIL> <CR><LF> // 读取失败 Reader&#xff1a;<LF>R12345678<CR><LF>// 读取成功 Example&#xff1a; HOST&…

WordPress插件:子比zibll主题插件 炙焰美化全开源插件V3.2

在网络世界中&#xff0c;开源内容管理系统&#xff08;CMS&#xff09;已经成为了网站构建的关键工具之一。WordPress&#xff0c;作为最受欢迎的开源CMS之一&#xff0c;其广泛的应用及其灵活性使得它成为了创建和管理各种类型网站的理想选择。而Zibll主题插件&#xff0c;作…

IOS Swift 从入门到精通:闭包 第一部分

文章目录 创建基本闭包在闭包中接受参数从闭包返回值闭包作为参数尾随闭包语法 创建基本闭包 Swift 允许我们像使用字符串和整数等其他类型一样使用函数。这意味着您可以创建一个函数并将其分配给一个变量&#xff0c;使用该变量调用该函数&#xff0c;甚至可以将该函数作为参…

【Android WebView】WebView基础

一、简介 WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核&#xff0c;4.4后直接使用了Chrome。 二、重要类 以WebView类为基础&#xff0c;WebSettings、WebViewClient、WebChromeClient为辅助共同完成安卓段加…

2024年【T电梯修理】免费试题及T电梯修理考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理免费试题参考答案及T电梯修理考试试题解析是安全生产模拟考试一点通题库老师及T电梯修理操作证已考过的学员汇总&#xff0c;相对有效帮助T电梯修理考试总结学员顺利通过考试。 1、【多选题】TSGT7005-2012《…

【Java】已解决java.nio.channels.ClosedChannelException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.nio.channels.ClosedChannelException异常 在Java的NIO&#xff08;New I/O&#xff09;编程中&#xff0c;java.nio.channels.ClosedChannelException是一个常见的异常…

XTDrone-多无人机精准降落-配置教程

1 编译AprilTag_ROS AprilTag是一个视觉基准系统&#xff0c;可用于机器人&#xff0c;增强现实和相机校准等。 根据AprilTag可以可靠地计算标签相对于相机的3D位置&#xff0c;方向和ID号。这里我们使用AprilTag的ROS库来实现位姿估计与ID号计算。 编译命令如下&#xff1a; …

python测试工程师 之 python基础大全【13万字总结】

python基础大全【13万字】 Day011、Python概述2、Python解释器和pycharmIDE工具3、Python中的注释4、变量5、标识符的命名规范 ★6、变量的使用7、Python中的数据类型 ★8、Python中的bug和调试9、字符串的格式化及输出 ★10、转译字符 day021、转译字符2、f-string ★3、数据类…

【windows|008】DNS服务详解

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 ​ &#x1f3c5;阿里云ACE认证高级工程师 ​ &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社…

【LinuxC语言】线程重入

文章目录 前言线程重入是什么线程重入实现示例代码总结前言 在并发编程中,我们经常需要处理多个线程同时访问和修改共享资源的问题。这可能会导致数据竞争和状态不一致,从而使程序的行为变得不可预测。为了解决这个问题,我们引入了一种称为“线程重入”的机制。线程重入,或…

家用洗地机哪个品牌好用?四款性价比高的洗地机推荐

还在为下班赶回家打扫卫生而烦恼&#xff1f;曾经的我也是这样&#xff0c;日复一日手动清洁&#xff0c;疲惫不堪。直到有一天&#xff0c;我决定相信现代科技&#xff0c;深入研究了市面上的各种洗地机评测&#xff0c;从此踏入了智能清洁家电的新世界。洗地机作为现代家居的…

Google Earth Engine(GEE)——checkbox的使用

结果 函数: ui.Checkbox(label, value, onChange, disabled, style) A checkbox with a label. Arguments: label (String, optional): The checkboxs label. Defaults to an empty string. value (Boolean, optional): Whether the checkbox is checked. A nu

LangChain 介绍

In recent times, you would probably have heard of many AI applications, one of them being chatpdf.com. 在最近&#xff0c;你可能听说过很多的AI应用&#xff0c;chatpdf.com就是其中的一个。 On this website, you can upload your own PDF. After uploading, you ca…

【面试题】 操作系统面试题 (第一篇)

1.volatile原理 volatile的底层原理主要涉及到多线程环境中共享变量的可见性和有序性。以下是关于volatile底层原理的详细解释&#xff1a; 可见性&#xff1a; 当一个变量被volatile修饰后&#xff0c;它会保证此变量对所有线程都是可见的。这里的“可见性”意味着当一个线程…

CinemachineFreelook相机鬼畜抖动的解决方法

又是培训机构的出品。。。。。。 2020.3.27 发现跟随时抖动的原因了&#xff0c;其实应该按照传统相机的跟随逻辑放在late update里执行&#xff0c;但是由于开发cinemachine的开发组很坑地把cinemachine freelook里的三个轨道Damping值默认给了3&#xff0c;于是相机会以每0.7…

Aquila-Med LLM:开创性的全流程开源医疗语言模型

​论文链接&#xff1a;https://arxiv.org/pdf/2406.12182 开源链接&#xff1a;https://huggingface.co/BAAI/AquilaMed-RL http://open.flopsera.com/flopsera-open/details/AquilaMed_SFT http://open.flopsera.com/flopsera-open/details/AquilaMed_DPO 近年来&#xf…

P10552 [THUPC2024] 警钟长鸣

题目描述 一年两度的 THUPC 又到来了&#xff0c;小 Z 也掏出了他的传统艺能——压轴的整活签到题。对于往年来说&#xff0c;签到题总是能被选手们在刚开场便迅速通过&#xff0c;而这次&#xff0c;小 Z 决定整点不一样的——”如果我把签到题刻意搞得很谜语人&#xff0c;让…