ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ARM汇编基础指令

2021-12-03 22:04:48  阅读:127  来源: 互联网

标签:汇编 R0 R1 R3 指令 LR 寄存器 ARM


Cortex-A7 常用汇编指令

一、处理器内部数据传输指令

1.mov

将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面

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

2.MRS

将特殊寄存器(如 CPSR 和 SPSR)中的数据传递给通用寄存器,要读取特殊寄存器的数据只能使用 MRS 指令

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

3.MSR

MSR 指令和 MRS 刚好相反,MSR指令用来将普通寄存器的数据传递给特殊寄存器,也就是写特殊寄存器,写特殊寄存器只能使用 MSR

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

二、存储器访问指令

1.LDR

直接读取CPU的寄存器的值

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

2.STR

将数据写入到存储器中

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

三、压栈与出栈指令

还记得学单片机的时候中断操作吗?当你中断的时候你当前执行程序的指令代码地址,会被压倒栈中暂时存储起来,当你执行完中断操作,回到主程序是,就需要把存储在栈中的指令地址重新取出来。

1.PUSh

初始SP指针指向0X80000000

PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈

执行完以上操作后,SP指向了0X7FFFFFEC

再次进行压栈,对LR

PUSH {LR} @将 LR 进行压栈

2.POP

出栈操作,后进去的先出来,也就是从栈顶开始出来

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

3.对于压栈、出栈还有这样的写法

STMFD SP!,{R0~R3, R12} @R0~R3,R12 入栈
STMFD SP!,{LR} @LR 入栈 34 

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

是不是感觉有点熟悉,这里的STM 和 LDM就是前面说的LDR 和 STR,只不过不是一个量级的存储和读取操作,STM 和 LDM 就是多存储和多
加载,可以连续的读写存储器中的多个连续数据。

四、跳转指令

1.B

直接跳转到目标地址

1 _start: 
2
3 ldr sp,=0X80200000 @设置栈指针
4 b main @跳转到 main 函数

使用B指令,直接跳转到C文件的main函数中,但注意,跳过去你就会不来了!!
如果你想回来怎么办?那就要用到下面这个指令了。

2.BL

BL 指令相比 B 指令,在跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以通过将 LR寄存器中的值重新加载到PC中来继续从跳转之前的代码处运行,这是子程序调用一个基本但常用的手段。

1 push {r0, r1} @保存 r0,r1
2 cps #0x13 @进入 SVC 模式,允许其他中断再次进去
3
4
5 bl system_irqhandler @加载 C 语言中断处理函数到 r2 寄存器中
6
7 cps #0x12 @进入 IRQ 模式
8 pop {r0, r1} 
9 str r0, [r1, #0X10] @中断执行完成,写 EOIR

在第5行的时候上面这个程序就中断去执行了别的函数,但之后,还会回来继续之乡下面的程序。

五、算术运算指令

六、逻辑运算符

标签:汇编,R0,R1,R3,指令,LR,寄存器,ARM
来源: https://www.cnblogs.com/iron2222/p/15640269.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有