ARM汇编总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档