ARM汇编总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
转载自:/xiwangsll123@126/blog/static/168698140201092242738669/今天的任务是研究嵌入式汇编程序,最重要的是明白如何让一个操作系统在ARM开发板运行起来,需要进行哪些底层操作:任务的第一步是,首先熟悉汇编程序的编写,同时明白操作系统底层操作实现原理。今天有一个心得就是,对一个大项目进行总结分析时,首先要针对各个难点各个击破,然后再系统的总结(有条理的总结)。首先,针对汇编语言中出现的重难点知识进行以下总结:
1.
LDR R1,=COUNT意思是将COUNT变量的地址放到R1中
LDR R1,COUNT意思是将COUNT变量地址里面的内容赋给R1
2.
Load-Store结构——这个应该是RISC设计中比较有特点的一部分。在RISC中,CPU并不会对内存中的数据进行操作,所有的计算都要求在寄存器中完成。而寄存器和内存的通信则由单独的指令来完成。而在CSIC中,CPU是可以直接对内存进行操作的,这也是一个比较特别的地方。所以,在ARM中,cpu只能通过寄存器来对内存的数据访问和更改。
LDR Rd,(地址)
STR Rd,(地址)
LDMIA Rn!,reglist
STMIA Rn!,reglist
注意上面LDR/STR和LDMIA/STMIA的区别,LDR/STR命令使用时,寄存器在前,地址在后。而在LDMIA/STMIA使用时,地址在前,寄存器在后。这就决定了LDR和LDM同为加载命令,但操作顺序是不同的,同理STR/STM。但有一点他们是相同的,即加载LDR/LDM
的意思是把内存的数据(即上面的地址)加载到寄存器;存储STR/STM的意思是把寄存器的内容存储到内存(即上面的地址)。这样比较之后也就全明白了,只需明白那部分是寄存器,那部分是地址(内存),然后区别是加载还是存储,就可以知道操作方向。
3.
LDM/STM
IA/IB,DA,DB数据块传输
FD/ED,EA/FA堆栈操作
LDMIA Rn!,reglist
STMIA Rn!,reglist
其中Rn加载/存储的起始地址寄存器,Rn必须为R0~R7
Reglist加载/存储的起始寄存器列表,寄存器必须为R0~R7
4.
在汇编程序中!的使用,意思是回写,比如:
ldr r1,[sp,#S_PSR]
ldr lr,[sp,#S_PC]!其中!用来控制基址变址寻址的的最终新地址是否进行回写操作
此条语句的意思是执行ldr之后sp被回写成sp+#S_PC基址变址寻址的新地址
5.
arm堆栈的组织结构是满栈降的形式,满栈即sp是要停留在最后一个进栈元素,降,就是堆栈的增长方向是从高地址向低地址发展。
arm对于堆栈的操作一般采用LDMFS(pop)和STMFD(push)两个命令。
困难之处在于STMFD命令对于操作数是按照什么顺序压栈的。
比如:STMFD sp!{R0-R5,LR}进栈顺序是:
高地址
LR
R5
R4
...........
R0<-SP
低地址
从图中可以看出lr先入栈,r4最后入栈。出栈顺序如右图所示。
ARM指令
多寄存器寻址:
LDMIA R0!,{R1-R4};R1<----[R0]
;R2<----[R0+4]
;R3<----[R0+8]
;R4<----[R0+12]
堆栈寻址:
STMFD入栈指令,相当于STMDB
STMFD SP!,{R2-R4};[SP-4]<---R4
;[SP-8]<---R3
;[SP-12]<---R2
LDMFD出栈指令,相当于LDMIA
LDMFD SP!,{R6-R8};R6<----[SP]
;R7<----[SP+4]
;R8<----[SP+8]
6.
还有个问题这个汇编语言LDMFD SP!,{R0-R12,LR,PC}^程序后面的这个小三角^,表示什么意思?
'^'是一个后缀标志,不能在User模式和Sys系统模式下使用该标志.该标志有两个存在目的:
1)对于LDM操作,程序会自动的将spsr的值拷贝到cpsr中
比如:在IRQ中断返回代码中
ldmfd sp!,{r4}//读取sp中保存的的spsr值到r4中
msr spsr_cxsf,r4//对spsr的所有控制为进行写操作,将r4的值全部注入spsr
ldmfd sp!{r0-r12,lr,pc}^//当指令执行完毕,pc跳转之前,将spsr的值自动拷贝到cpsr中
2)数据的送入,送出发生在User用户模式下的寄存器,而非当前模式寄存器如ldmdb sp,{r0-lr}^;表示sp栈中的数据回复到User分组寄存器r0-lr中,而不是恢复到当前模式寄存器r0-lr,当然对于User,System,IRQ,SVC,Abort,Undefined 这6种模式来说r0-r12是共用的,只是r13和r14为分别独有,对于FIQ模式,仅仅r0-r7是和前6中模式的r0-r7共用,r8-r14都是FIQ模式下专有。
7.关于ldr/str几条指令使用的区别
ldr ip,[sp],#4将sp中内容存入ip,之后sp=sp+4;
ldr ip,[sp,#4]将sp+4这个新地址下的内容存入ip,之后sp值保持不变
ldr ip,[sp,#4]!将sp+4这个新地址下的内容存入ip,之后sp=sp+4将新地址值赋给sp
str ip,[sp],#4将ip存入sp地址处,之后sp=sp+4
str ip,[sp,#4]将ip存入sp+4这个新地址,之后sp值保持不变
str ip,[sp,#4]!将ip存入sp+4这个新地址,之后sp=sp+4将新地址值赋给sp