【ARM-汇编】

【ARM-汇编】本文详细介绍了 ARM 汇编中的关键指令 包括 LDR LDRB LDRH 等加载指令 STR STRB STRH 等存储指令 以及数据传输和跳转指令

大家好,欢迎来到IT知识分享网。

■ 概述:

— LDR 字数据加载指令 — LDRB 字节数据加载指令 — LDRH 半字数据加载指令 — STR 字数据存储指令 — STRB 字节数据存储指令 — STRH 半字数据存储指令 

■ 加载指令

1、LDR指令 : 字数据加载指令

LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。 LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。 LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。 LDR R0,[R1,R2] ! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。 LDR R0,[R1,#8] ! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。 LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。 LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。 LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。 

2、LDRB指令:字节数据加载指令

LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。 LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。 

3、LDRH指令:半字数据加载指令

LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。 LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。 LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。 

4、LDM指令:

■ 存储指令

1、STR指令:字数据存储指令

STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。 STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。 

2、STRB指令:字节数据存储指令

STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。 STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。 

3、STRH指令:半字数据存储指令

STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中。 STRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。 

4、STM指令:

■ 数据传输指令

指令 目的 描述
MOV R0 R1 将 R1 里面的数据复制到 R0 中。
MRS R0 CPSR 将特殊寄存器 CPSR 里面的数据复制到 R0 中。
MSR CPSR R1 将 R1 里面的数据复制到特殊寄存器 CPSR 里中。

1、 MOV指令: 将数据从一个寄存器拷贝到另外一个寄存器

MOV R0, R1 @将寄存器 R1 中的数据传递给 R0,即 R0=R1 MOV R0, #0X12 @将立即数 0X12 传递给 R0 寄存器,即 R0=0X12 

2、 MRS 指令: 特殊寄存器(如 CPSR 和 SPSR)中的数据传递给通用寄存器

MRS R0, CPSR @将特殊寄存器 CPSR 里面的数据传递给 R0,即 R0=CPSR 

3、 MSR 指令: MSR 指令用来将普通寄存器的数据传递给特殊寄存器

MSR CPSR, R0 @将 R0 中的数据复制到 CPSR 中,即 CPSR=R0 

■ 存储器访问指令

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

1、 LDR 指令: 从存储加载数据到寄存器 Rx

LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004 LDR R1, [R0] @读取地址 0X0209C004 中的数据到 R1 寄存器中 

2、 STR 指令 : 将数据写入到存储器

LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004 LDR R1, =0X @R1 保存要写入到寄存器的值,即 R1=0X STR R1, [R0] @将 R1 中的值写入到 R0 中所保存的地址中 

■ 压栈(PUSH),出栈(POP)指令

我们通常会在 A 函数中调用 B 函数,当 B 函数执行完以后再回到 A 函数继续执行。 要想再跳回 A 函数以后代码能够接着正常运行,那就必须在跳到 B 函数之前将当前处理器状态保存起来(就是保存 R0~R15 这些寄存器值), 当 B 函数执行完成以后再用前面保存的寄存器值恢复R0~R15 即可。 保存 R0~R15 寄存器的操作就叫做现场保护,恢复 R0~R15 寄存器的操作就叫做恢复现场。 

PUSH 和 POP 是一种多存储和多加载指令,即可以一次操作多个寄存器数据,

指令 描述
PUSH 将寄存器列表存入栈中。
POP 从栈中恢复寄存器列表。

1、 压栈 PUSH

堆栈是向下增长的 PUSH { 
   R0~R3, R12} @将 R0~R3 和 R12 压栈 PUSH { 
   LR} @将 LR 进行压栈 

在这里插入图片描述

2、 出栈 POP

POP { 
   LR} @先恢复 LR POP { 
   R0~R3,R12} @在恢复 R0~R3,R12 

3、 PUSH 和 POP 的另外一种写法是“STMFD SP!”和“LDMFD SP!”

STMFD SP!,{ 
   R0~R3, R12} @R0~R3,R12 入栈 STMFD SP!,{ 
   LR} @LR 入栈 LDMFD SP!, { 
   LR} @先恢复 LR LDMFD SP!, { 
   R0~R3, R12} @再恢复 R0~R3, R12 

■ 跳转指令

指令 描述
B 跳转到 label,如果跳转范围超过了+/-2KB,可以指定 B.W

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

1、 B 指令

_start: ldr sp,=0X @设置栈指针 b main @跳转到 main 函数 

2、 BL 指令

■ 算术运算指令

在这里插入图片描述

■ 逻辑运算指令

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111793.html

(0)
上一篇 2026-01-22 17:20
下一篇 2026-01-22 17:34

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信