【ARM汇编速成】零基础入门汇编语言之指令集(三)

简介: 【ARM汇编速成】零基础入门汇编语言之指令集(三)

4.基本指令

4.1数据传输指令

  • 将数据从一个寄存器传递到另外一个寄存器。
  • 将数据从一个寄存器传递到特殊寄存器,如 CPSR 和 SPSR 寄存器。
  • 将立即数传递到寄存器。
指令 目的 描述
MOV R0 R1 将 R1 里面的数据复制到 R0 中。
MRS R0 CPSR 将特殊寄存器 CPSR 里面的数据复制到 R0 中。
MSR CPSR R1 将 R1 里面的数据复制到特殊寄存器 CPSR 里中。

4.2存储器访问指令

指令 描述
LDR Rd, [Rn , #offset] 从存储器 Rn+offset 的位置读取数据存放到 Rd 中。
STR Rd, [Rn, #offset] 将 Rd 中的数据写入到存储器中的 Rn+offset 位置。


LDR   R0, =0X0209C004      ;将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004

LDR     R0, =0X0209C004   ;将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004

LDR  R1, =0X20000002    ;R1 保存要写入到寄存器的值,即 R1=0X20000002

STR  R1, [R0]         ;将 R1 中的值写入到 R0 中所保存的地址中

4.3压栈和出栈指令


指令 描述
PUSH 将寄存器列表存入栈中。
POP 从栈中恢复寄存器列表。
1. PUSH   {R0~R3, R12}  ;将 R0~R3 和 R12 压栈
2. 
3. POP   {LR}          ;先恢复 LR
4. POP   {R0~R3,R12}   ;再恢复 R0~R3,R12

或者可以这样写:

STMFD  SP!,{R0~R3, R12}  ;R0~R3,R12 入栈

STMFD  SP!,{LR}    ;LR 入栈

LDMFD  SP!, {LR}    ;先恢复 LR

LDMFD  SP!, {R0~R3, R12}  ;再恢复 R0~R3, R12

4.4跳转指令

指令 描述

B 跳转到 label,如果跳转范围超过了+/-2KB,可以指定 B.W使用 32 位版本的跳转指令, 这样可以得到较大范围的跳转

BX 间接跳转,跳转到存放于 Rm 中的地址处,并且切换指令集

BL 跳转到标号地址,并将返回地址保存在 LR 中。

BLX 结合 BX 和 BL 的特点,跳转到 Rm 指定的地址,并将返回地址保存在 LR 中,切换指令集。

1 、B 指令(无条件分支)

这是最简单的跳转指令,B 指令会将 PC 寄存器的值设置为跳转目标地址, 一旦执行 B 指令,ARM 处理器就会立即跳转到指定的目标地址。如果要调用的函数不会再返回到原来的执行处,那就可以用 B 指令。

   LDR R0, =#10     ; 将10加载到寄存器R0

   B loop           ; 无条件跳转到loop标签

next:

   LDR R1, =#20     ; 将20加载到寄存器R1

   B end            ; 无条件跳转到end标签

loop:

   ADD R0, R0, #1   ; R0 = R0 + 1

   CMP R0, #15      ; 比较 R0 和 15

   BNE loop         ; 如果 R0 不等于 15,跳转到loop标签

end:

   HALT             ; 停止执行

2 、BL 指令(带链接的分支)

BL 指令相比 B 指令,在跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以通过将 LR 寄存器中的值重新加载到 PC 中来继续从跳转之前的代码处运行,这是子程序调用一个基本但常用的手段。比如 Cortex-A 处理器的 irq 中断服务函数都是汇编写的,主要用汇编来实现现场的保护和恢复、获取中断号等。但是具体的中断处理过程都是 C 函数,所以就会存在汇编中调用 C 函数的问题。而且当 C 语言版本的中断处理函数执行完成以后是需要返回到irq 汇编中断服务函数,因为还要处理其他的工作,一般是恢复现场。


   LDR R0, =#10     ; 将10加载到寄存器R0

   BL subroutine    ; 跳转到子程序subroutine,并将返回地址保存在LR

   LDR R1, =#20     ; 将20加载到寄存器R1

end:

   HALT             ; 停止执行

subroutine:

   ADD R0, R0, #5   ; R0 = R0 + 5

   MOV PC, LR       ; 返回到调用点

4.5算术运算指令

ADD Rd, Rn, Rm    Rd = Rn + Rm    加法运算,指令为 ADD

ADD Rd, Rn, #immed    Rd = Rn + #immed    加法运算,指令为 ADD

ADC Rd, Rn, Rm    Rd = Rn + Rm + 进位    带进位的加法运算,指令为 ADC

ADC Rd, Rn, #immed    Rd = Rn + #immed +进位    带进位的加法运算,指令为 ADC

SUB Rd, Rn, Rm    Rd = Rn – Rm    减法

SUB Rd, #immed    Rd = Rd - #immed    减法

SUB Rd, Rn, #immed    Rd = Rn - #immed    减法

SBC Rd, Rn, #immed    Rd = Rn - #immed – 借位    带借位的减法

SBC Rd, Rn ,Rm    Rd = Rn – Rm – 借位    带借位的减法

MUL Rd, Rn, Rm    Rd = Rn * Rm    乘法(32 位)

UDIV Rd, Rn, Rm    Rd = Rn / Rm    无符号除法

SDIV Rd, Rn, Rm    Rd = Rn / Rm    有符号除法

4.6逻辑运算指令

AND(逻辑与)


格式:AND{<cond>} {S} <Rd>, <Rn>, <operand2>

作用:将 <Rn> 和 <operand2> 的每一位进行逻辑与操作,结果存储在 <Rd> 中。

示例:AND R1, R2, #0xFF;将 R2 的值与 0xFF 进行逻辑与,结果存储在 R1 中。

ORR(逻辑或)


格式:ORR{<cond>} {S} <Rd>, <Rn>, <operand2>

作用:将 <Rn> 和 <operand2> 的每一位进行逻辑或操作,结果存储在 <Rd> 中。

示例:ORR R1, R2, #0xF0;将 R2 的值与 0xF0 进行逻辑或,结果存储在 R1 中。

EOR(逻辑异或)


格式:EOR{<cond>} {S} <Rd>, <Rn>, <operand2>

作用:将 <Rn> 和 <operand2> 的每一位进行逻辑异或操作,结果存储在 <Rd> 中。

示例:EOR R1, R2, #0xAA;将 R2 的值与 0xAA 进行逻辑异或,结果存储在 R1 中。

BIC(位清除)


格式:BIC{<cond>} {S} <Rd>, <Rn>, <operand2>

作用:将 <Rn> 中与 <operand2> 对应的位设置为0,结果存储在 <Rd> 中。相当于对 <operand2> 取反后与 <Rn> 进行逻辑与操作。

示例:BIC R1, R2, #0x0F;将 R2 中低4位清零,结果存储在 R1 中。

MVN(位取反后移动)


格式:MVN{<cond>} {S} <Rd>, <operand2>

作用:对 <operand2> 进行位取反操作,结果存储在 <Rd> 中。

示例:MVN R1, #0xFF;将 0xFF 取反后的结果存储在 R1 中。

相关文章
|
2月前
|
存储 编译器 C语言
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
|
2月前
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
221 0
|
22天前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器架构有啥区别?X86计算、Arm、GPU异构、裸金属和高性能计算对比
阿里云ECS涵盖x86、ARM、GPU/FPGA/ASIC、弹性裸金属及高性能计算等多种架构。x86架构采用Intel/AMD处理器,适用于广泛企业级应用;ARM架构低功耗,适合容器与微服务;GPU/FPGA/ASIC专为AI、图形处理设计;弹性裸金属提供物理机性能;高性能计算则针对大规模并行计算优化。
|
2月前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
2月前
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器计算架构X86/ARM/GPU/FPGA/ASIC/裸金属/超级计算集群有啥区别?
阿里云服务器ECS提供了多种计算架构,包括X86、ARM、GPU/FPGA/ASIC、弹性裸金属服务器及超级计算集群。X86架构常见且通用,适合大多数应用场景;ARM架构具备低功耗优势,适用于长期运行环境;GPU/FPGA/ASIC则针对深度学习、科学计算、视频处理等高性能需求;弹性裸金属服务器与超级计算集群则分别提供物理机级别的性能和高速RDMA互联,满足高性能计算和大规模训练需求。
|
2月前
|
存储 Docker 容器
ARM架构鲲鹏主机BClinux离线安装docker步骤
下载并安装适用于ARM架构的Docker CE二进制文件,解压后移动至/usr/bin目录。创建docker组,配置systemd服务脚本(docker.service、docker.socket、containerd.service),重载systemd配置,启动并启用docker服务。编辑daemon.json配置存储驱动、镜像加速地址等,最后拉取所需镜像。
65 0
|
2月前
|
NoSQL MongoDB Docker
求助,有没有大神可以找到arm64架构下mongodb的3.6.8版本的docker镜像?
在Docker Hub受限的情况下,寻求适用于ARM架构的docker镜像资源或拉取链接,以便在x86架构上获取;内网中的机器为ARM架构,因此优先请求适合ARM的Docker镜像或Dockerfile,非常感激您的帮助。
|
4月前
|
机器学习/深度学习 算法 数据库
阿里云服务器架构区别解析:从X86计算、Arm计算到高性能计算架构的区别参考
在我们选择阿里云服务器的架构时,选择合适的云服务器架构对于提升业务效率、保障业务稳定至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供参考和选择。
阿里云服务器架构区别解析:从X86计算、Arm计算到高性能计算架构的区别参考
|
4月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
141 3
|
3月前
ARM64架构提供的Cache操作
ARM64架构提供的Cache操作

热门文章

最新文章