【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 使用 32 位版本的跳转指令, 这样可以得到较大范围的跳转。
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