【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 中。

相关文章
|
10月前
|
存储 编译器 C语言
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
246 0
【ARM汇编速成】零基础入门汇编语言之C与汇编混合编程(四)
|
10月前
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
863 0
|
3月前
|
存储 机器学习/深度学习 数据库
阿里云服务器X86/ARM/GPU/裸金属/超算五大架构技术特点、场景适配参考
在云计算技术飞速发展的当下,云计算已经渗透到各个行业,成为企业数字化转型的关键驱动力。选择合适的云服务器架构对于提升业务效率、降低成本至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供大家了解和选择参考。
694 61
|
3月前
|
消息中间件 数据可视化 Kafka
docker arm架构部署kafka要点
本内容介绍了基于 Docker 的容器化解决方案,包含以下部分: 1. **Docker 容器管理**:通过 Portainer 可视化管理工具实现对主节点和代理节点的统一管理。 2. **Kafka 可视化工具**:部署 Kafka-UI 以图形化方式监控和管理 Kafka 集群,支持动态配置功能, 3. **Kafka 安装与配置**:基于 Bitnami Kafka 镜像,提供完整的 Kafka 集群配置示例,涵盖 KRaft 模式、性能调优参数及数据持久化设置,适用于高可用生产环境。 以上方案适合 ARM64 架构,为用户提供了一站式的容器化管理和消息队列解决方案。
242 10
|
4月前
|
存储 机器学习/深度学习 算法
阿里云X86/ARM/GPU/裸金属/超算等五大服务器架构技术特点、场景适配与选型策略
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别。本文将深入解析这些架构的特点、优势及适用场景,帮助用户更好地根据实际需求做出选择。
|
6月前
|
弹性计算 编解码 运维
飞天技术沙龙回顾:业务创新新选择,倚天 Arm 架构深入探讨
飞天技术沙龙回顾:业务创新新选择,倚天 Arm 架构深入探讨
101 1
|
7月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器ECS架构区别及选择参考:X86计算、ARM计算等架构介绍
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别,本文主要简单介绍下这些架构各自的主要性能及适用场景,以便大家了解不同类型的架构有何不同,主要特点及适用场景有哪些。
1077 10
|
8月前
|
人工智能 芯片 Windows
ARM架构PC退货率与CEO策略透视
ARM架构PC退货率与CEO策略透视
|
9月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器架构有啥区别?X86计算、Arm、GPU异构、裸金属和高性能计算对比
阿里云ECS涵盖x86、ARM、GPU/FPGA/ASIC、弹性裸金属及高性能计算等多种架构。x86架构采用Intel/AMD处理器,适用于广泛企业级应用;ARM架构低功耗,适合容器与微服务;GPU/FPGA/ASIC专为AI、图形处理设计;弹性裸金属提供物理机性能;高性能计算则针对大规模并行计算优化。
519 7
|
10月前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。