ARM汇编指令精讲:从数据处理到内存操作

ARM汇编指令集·带例题 ARM汇编指令集 阅读详情

1. ARM汇编基础入门:从零认识指令集

刚开始接触ARM汇编的时候,我也觉得这些指令看起来像天书一样难懂。但实际用起来才发现,只要掌握了核心的几种指令类型,就能解决大部分嵌入式开发中的问题。ARM汇编主要分为数据处理指令、内存操作指令、跳转指令等几大类,今天我们就重点聊聊数据处理和内存操作这两个最常用的部分。

如果你有C语言基础,理解ARM汇编会容易很多。其实每条汇编指令都对应着底层硬件的具体操作,比如数据处理指令就是让CPU对数据进行各种计算和变换,而内存操作指令则是负责在寄存器和内存之间传递数据。我刚开始学的时候,总是把MOV指令和LDR指令搞混,后来才发现关键在于分清是在操作寄存器还是内存。

学习汇编最重要的就是动手实践。你可以先用简单的MOV指令开始,慢慢熟悉各种寻址方式和条件码的使用。记得我最初写汇编时,经常因为忘记加条件码而导致程序逻辑错误,调试了好久才找到问题。所以建议初学者从最简单的数据处理指令开始,逐步深入。

2. 数据处理指令详解:让数据随心所欲

2.1 数据搬移指令:MOV和MVN的妙用

MOV指令是ARM汇编中最基础也最常用的指令,它的作用就是把一个数从一个地方搬到另一个地方。比如说MOV R1, R0就是把R0寄存器里的值复制到R1寄存器。你还可以直接搬移立即数,比如MOV R1, #100就是把十进制100放到R1中。

MVN指令就比较有意思了,它会在搬移数据之前先按位取反。比如执行MVN R1, #0后,R1的值就会变成0xFFFFFFFF,因为0的二进制全是0,取反后就全是1了。这个指令在掩码操作和位操作中特别有用。

我在实际开发中经常用MOV指令来初始化寄存器值。比如在设置外设寄存器时,往往需要先给控制寄存器赋初始值,这时候MOV指令就派上用场了。需要注意的是,MOV指令只能操作8位立即数或者通过移位得到的有效立即数,这点初学者经常忽略。

2.2 算术运算指令:加减乘除的底层实现

ADD和SUB指令分别实现加法和减法运算。它们的语法很直观:ADD R1, R2, R3 就是把R2和R3相加,结果存到R1。你还可以直接加立即数:ADD R1, R2, #10。

在实际使用中,我发现ADC和SBC指令特别适合做多精度运算。比如要计算64位加法时,可以先加低32位,然后用ADC加高32位,这样就能自动处理低位的进位。记得有一次做传感器数据融合算法,需要处理40位的累加运算,就是靠ADC指令完美解决的。

MUL指令做乘法运算时有个需要注意的地方:它的第二个操作数不能是立即数,必须是寄存器。所以MUL R1, R2, R3是合法的,但MUL R1, R2, #5就不行。这个限制我刚开始经常忘记,编译时总是报错。

2.3 位操作指令:精准控制每一个比特位

位操作在嵌入式开发中特别重要,特别是当你需要操作硬件寄存器时。AND指令常用于掩码操作,比如要清零某个寄存器的低4位,可以用AND R1, R0, #0xFFFFFFF0。ORR指令则用于置位,比如要把第3位置1:ORR R1, R0, #0x8。

EOR指令在数值交换和标志位翻转时很好用。有个经典的技巧:不用临时变量交换两个寄存器的值,可以用三次EOR操作实现。BIC指令是按位清零,选择性地清除指定位。比如要清零R0的第0位和第1位:BIC R1, R0, #0x3。

我在GPIO控制中就经常用到这些位操作指令。每个GPIO端口都有配置寄存器,需要精确设置每个引脚的工作模式,这时候位操作指令就显示出它们的威力了。通过合理的掩码设计和位操作,可以高效地配置硬件外设。

2.4 移位指令:数据变形的艺术

移位操作看似简单,但用好了能大大提升代码效率。LSL是逻辑左移,右边补0;LSR是逻辑右移,左边补0。循环右移ROR比较特殊,移出的位会从左边补进来。

在性能优化时,我经常用移位指令代替乘除法。比如乘以4可以用左移2位实现:LSL R1, R0, #2,这比用MUL指令快得多。同样,除以8可以用右移3位实现。但在使用算术右移时要注意符号位的问题,对有符号数和无符号数的处理方式是不同的。

移位指令还可以用来组合立即数。ARM指令中的立即数有限制,但通过移位操作可以生成更大的立即数。比如要加载0xFF00到寄存器,可以用MOV R1, #0xFF, LSL #8。这个技巧在初始化大型常数时特别有用。

3. 内存操作指令:数据存储与读取的精髓

3.1 基本内存访问:LDR和STR的使用技巧

LDR和STR是ARM汇编中最重要的内存操作指令。LDR用于从内存加载数据到寄存器,STR用于将寄存器数据存储到内存。基础用法很简单:LDR R1, [R2] 就是把R2指向的内存地址的数据加载到R1。

但在实际使用中,寻址方式多种多样。比如前变址寻址:LDR R1, [R2, #4]! 表示先给R2加4,然后加载数据,同时更新R2的值。后变址寻址:LDR R1, [R2], #4 表示先加载数据,然后给R2加4。这些寻址模式在数组遍历和数据结构访问时特别高效。

我刚开始使用时经常混淆前变址和后变址的顺序,后来总结了个记忆窍门:感叹号!表示先计算地址,没有!表示后计算地址。在实际的嵌入式开发中,合理使用各种寻址模式可以显著提升代码效率,特别是在处理内存缓冲区时。

3.2 多寄存器操作:LDM和STM的高效批量处理

LDM和STM指令可以一次性操作多个寄存器,极大提高了内存读写效率。STM用于将多个寄存器值存储到内存,LDM用于从内存加载多个值到寄存器。

这在函数调用时特别有用。函数开头经常用STM指令保存寄存器到栈:STMDB SP!, {R0-R12, LR}。函数结尾用LDM指令恢复寄存器:LDMIA SP!, {R0-R12, PC}。这里的DB和IA表示地址变化方式:Decrement Before和Increment After。

我在优化音频处理算法时,就大量使用了多寄存器操作。音频数据通常是连续的内存块,用LDM/STM指令批量处理比用单条LDR/STR指令快得多。但要注意栈指针的对齐问题,ARM通常要求8字节对齐,否则可能遇到性能下降甚至硬件异常。

3.3 数据大小控制:字节和半字操作

除了32位的字操作,ARM还支持8位的字节操作和16位的半字操作。LDRB/STRB用于字节操作,LDRH/STRH用于半字操作。这在处理不同数据类型的数组时特别有用。

比如处理字符串时,每个字符就是一个字节,用LDRB指令逐个读取就很合适。处理短整型数组时,用LDRH指令更高效。但要注意内存对齐问题:半字操作要求2字节对齐,字操作要求4字节对齐,不对齐的访问可能导致性能下降或硬件异常。

我在通信协议处理中就经常用到这些指令。协议帧中往往混合了不同长度的字段,有的8位,有的16位,有的32位。灵活运用不同长度的内存操作指令,可以高效地解析和组

ARM汇编指令学习 arm基础指令集 阅读详情

相关推荐

ARM汇编指令集

ldr,str ldr(load register)指令将内存内容加载入通用寄存器。 str(store register)指令将寄存器内容存入内存空间中。 (ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。ldr/str组合用来实现 ARM CPU和内存数据交换) 8种寻址方式 寄存器寻址 mov r1, r2(C语言中的r1=r2) 立即寻址(立即数) mov r0, #0xFF00(加#表示是一个数字) 寄存器移位寻址 mov

weixin_44705391的博客 5462

ARM开发入门学习———ARM汇编指令集

arm入门指令集

wuyuxiang00的博客 1399

全面ARM汇编指令参考手册

数据传输指令是ARM汇编语言中最基本的指令类型之一,负责在寄存器与内存之间,以及不同寄存器之间移动数据。这类指令可以细分为加载(Load)和存储(Store)指令。加载指令用于将内存中的数据读入寄存器中,而存储指令则是将寄存器中的数据写入到内存中。数据传输指令的格式通常包含三个主要部分:操作码、目的寄存器、源地址(包括立即数、寄存器内容或寄存器加偏移量等形式)。例如,以下是一些常见的数据传输指令:将立即数0x12345678加载到寄存器R0将寄存器R1的内容存储到地址R2+4处。

weixin_35755640的博客 937

arm学习之基本汇编指令

arm汇编指令

4147

从零开始:用Kimi API和LangChain打造智能写作助手

本文详细介绍了如何从零开始,利用Kimi API提供的强大AI大模型能力,结合LangChain框架构建一个智能写作助手。通过实战演示了环境搭建、核心写作链构建、以及引入检索增强生成和智能体等进阶功能,旨在解决长文档创作、事实准确性等痛点,打造一个能理解意图、调用工具并保持记忆的智能创作伙伴。

weixin_29294395的博客 139

步进电机原理及梯形加速算法

步进电机重理解与梯形加速算法

weixin_39912966的博客 1324

ARM汇编指令详解

ARM的编程模式和七种模式 基本设定 架构(32位) 约定 Byte(字节):8bits Halfword(半字) :16 bits (2 byte) Word(字):32bits(4 byte) 指令集 ARM指令集(32-bit) Thumb指令集(16-bit) Thunmb指令集(16&32bit)不考虑 工作模式 种类:七种 非特权模式(Normal:普通模式) User(用户模式):非特权模式,大部分时候在这个模式下工作 特权模式(Privilege:特

菜菜的博客 7928

LBM模式学习·保姆级安装及初步使用教程

在学习LBM的过程中,我感觉可供参考的材料较为有限,对于一个独立学习LBM模式的初学者非常不友好(我就是这个初学者哈哈),因此萌生了写一篇保姆级的LBM模式教程,并将我踩过的坑一一指出,有助于后来者更快地上手该模式,而非半途而废。

weixin_42762673的博客 1万+

ARM指令之--MVN

MVN指令和MOV指令异同点: 相同点: 将一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器 不同点: MVN指令不同的是在传送之前,将被传送的对象先按位取反,再传送到目的寄存器。 举例: MVN  r1 ,  r2 MVN  r1 ,  #0xFF          ;r1 ← 0x FFFF FF00 MVN  r1,  #0x00000007; r1 ←0x

Evolution 8576

[数据转换]将NetCDF(NC)文件转换成单个GeoTIFF文件

有时候要提取tif格式数据中的气象数据,但从气象网站上下载的却是NC格式的文件。这就需要我们将NC格式的文件转换成TIF格式的文件。

G_sea_young的博客 1004

Multisim实现555计时器模拟简易电子琴

一. 元器件介绍 这里用到的元器件有: DIgital power(VCC)数字电源 频率计数器(XFC) 示波器(XSC) ground 数字地 Capacitan 电容器 Resistor 电阻器 555_VIRTUAL 555计时器 触发按键(DIPSW)(DPST)(SPST)

是你呀星途的博客 2万+

arm---mvn指令

 mvn:与mov指令用法差不多,唯一的区别是:它赋值的时候,先按位取反 eg1:   mvn r0,0xa0000007   执行结果:r0=0x5ffffff8  eg2:    mvn r0,#4执行结果:r0=-5 过程分析:先对4转换成2进制(00000100),取反(11111011),求其补码,因为是负数,所以先对其正数(01111011)

shift_f的专栏 9426

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析

本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。

weixin_67440240的博客 637

ARM汇编指令

ARM指令是通用指令,指的是所有的ARM芯片都支持。 1.ARM汇编程序 一个ARM汇编程序,大体是由下列的三类指令组成: 1)ARM汇编指令 ARM汇编指令由ARM公司定的。 汇编语言是CPU执行效率最高的一门语言。 一条汇编指令是唯一对应一条机器指令(二进制码)。 汇编指令由两个部分组成: 汇编指令 = 操作码 + 操作数 操作码:表示一种操作,一种运算 比如: ADD 表示加法运算 MOV 表示移动(赋值) SUB 表示减法运算 操作数:表示要操作

m0_60265426的博客 8903

基于Simulink建模仿真的滑模控制的磁悬浮轴承稳定控制仿真

磁悬浮轴承(Magnetic Bearing)利用电磁力来支撑和定位转子,无需机械接触,因此在高速旋转设备中具有广泛应用。滑模控制(Sliding Mode Control, SMC)是一种鲁棒性强的非线性控制方法,适用于磁悬浮轴承的精确控制。以下是基于Simulink的磁悬浮轴承滑模控制系统的详细设计与仿真步骤。通过上述步骤,设计并实现了基于 Simulink 和 Control System Toolbox 的磁悬浮轴承滑模控制系统。

MHD0815的博客 780

模型实战(16)之StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解

StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解

yohnyang的博客 1771

【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编

介绍了ARM的大概架构,包括CPU中的寄存器,地址空间,还讲解了常用汇编指令的使用,还有四种栈的原理,以及C语言和汇编之间的关系,还使用纯汇编点了灯。

weixin_63726869的博客 2499

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ARM汇编与机器码、汇编指令

ARM芯片属于精简指令集计算机(RISC)

TENET123的博客 2996

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ARM64汇编寻址、汇编指令、指令编码方式

以及专门的栈指针(SP)和程序计数器(PC)寄存器,用于管理函数调用和指令执行。在上面的例子中,由于使用的是 64 位的 X 寄存器,每个寄存器占 8 字节(64 位),所以 STP 和 LDP 指令会操作两个 8 字节的数据。在 MOV(bitmask immediate)中,该字段固定为 11111,表示使用零寄存器(WZR 或 XZR),以便执行立即数到寄存器的移动操作。支持多种寻址方式,例如偏移寻址、基地址寄存器加偏移等,非常适合访问内存中的数据,如全局变量、数组元素等。例如,存储和加载局部变量。

2674

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ARM A32多数据处理汇编指令理解分享

在ARM A32多数据处理汇编指令分为多数据存储指令和多数据加载指令:1,多数据存储指令:push, STMFD(STMDB), STMED(STMDA) , STMFA(STMIB), STMEA(STMIA);2,多数据加载指令:pop,LDMF(LDMIA), LDMFA(LDMDA), LDMEA(LDMDB), LDMED(LDMIB);

天使之翼 1891

ARM汇编指令以及伪指令

文章目录ARM寄存器ARM寻址方式数据处理指令转移指令程序状态寄存器访问指令加载/存储指令异常指令伪指令ARM的存储系统ATPCS介绍异常中断处理ARM链接器 ARM寄存器 R13:栈指针寄存器(SP) R14:连接寄存器(LR) R15:程序计数器(PC) 由于ARM指令是字对齐,PC值的第0位和第1位总为0 ARM寻址方式 数据处理指令 转移指令 程序状态寄存器访问指令 加载/存储指令 异常指令 伪指令 ARM的存储系统 ATPCS介绍 异常中断处理 ARM链接器 ...

qq_24601427的博客 1万+

STM32--ARM常用汇编指令

ARM常用汇编指令: 1、 EQU:给数字常量取一个符号名,相当于C语言中的define 2、 AREA:汇编一个新的代码段或者数据段 3、 SPACE:分配内存空间 4、 PRESERVE8:当前文件栈需要按照8字节对齐 5、 EXPORT:声明一个标号具有全局属性,可被外部的文件使用 6、 DCD:以字为单位分配内存,要求4字节对齐,并要求初始化这些内存 7、 PROC:定义子程序,与END...

tyustli 9398

ARM 常用汇编指令

{R4-R7};递减地址存储R4-R7,SP递减(堆栈操作), {R1-R3};递增地址加载R1-R3,R0递增。按位清除(R1 & ~R2)STR R2, [R1, #4];将R2存储到R1+4地址。从R1指向的地址加载数据到R0。跳转并链接,保存返回地址到LR。BGE label;

wangjinjin180的博客 797

[内核开发手册] ARM汇编指令速查表

ARM汇编指令速查摘要 本文整理了ARM处理器常见汇编指令及其功能描述和语法示例。主要内容包括: 数据传送指令:mov、ldr、str等 算术运算指令:add、sub、mul等 逻辑运算指令:and、orr、eor等 移位指令:lsl、asr等 控制流指令:b、bl、bx等跳转指令 栈操作指令:push、pop 条件执行指令:cmp、it系列等 特殊指令:如mla(乘加)、uxtb(位扩展)等,本表可作为ARM汇编程序开发的快速参考手册。

qq_36016038的博客 1683

ARM 汇编指令集

寄存器 寄存器的寄存器用于数据处理及控制。 如内存中数据处理,需先从内存中加载数据到寄存器中,处理完毕后,再把寄存器的数据存放到内存中。 寄存器组拥有16个寄存器,R0R12是通用寄存器,R13R15是特殊寄存器。 寄存器 作用 comment R0~R7 通用寄存器-Low register 16 bits 指令 R8~12 通用寄存器-Hig Register 16 bits 指令 + 32 bits 指令 R13 Stack Pointer-SP MSP:(Main stack

qq_35056682的博客 3257
上一篇: 色彩与动画的数学之美:用C语言和SDL实现动态渐变圆
下一篇: FPGA实战:手把手教你实现HDMI的TMDS编码
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值