原创 指令LDR与伪指令LDR

2011-10-17 00:41 2171 7 7 分类: MCU/ 嵌入式

1         指令LDR

应用举例:

u       LDR R0, [R1, #4]     ;将内存单元R1+4中的字读取到R0寄存器

其中,R1为基址#4为偏移地址,R0为目标地址。注意,此时不更新R1

u       LDR R0, [R1, #-4]    ;将内存单元R1-4中的字读取到R0寄存器

u       LDR R0, [R1, #4]!    ;将内存单元R1+4中的字读取到R0寄存器。同时更新R1R1=R1+4

u       LDR R0, [R1], #4    ;将地址为R1内存单元数据读取到R0寄存器,然后R1=R1+4

2         伪指令LDR

ARM中的伪指令不是真正的ARM指令或者Thumb指令,这些伪指令在汇编编译器对源程序进行汇编处理时,被替换为相应的ARM或者Thumb指令(序列)。

LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中。

语法格式:

LDR{cond} register, =[expr | label-expr]

其中,register为目标寄存器

expr32位的常量。编译器将根据expr的取值情况,如下处理LDR伪指令:

u       expr所表示的地址值没有超过MOVMVN指令中的地址取值范围时,编译器用合适的MOV或者MVN指令代替LDR伪指令。

应用举例:

0xFF0读取到R1

LDR R1, =0xFF0

汇编后得到:

MOV R1, 0xFF0

 

u       expr表示的地址值超过了MOV或者MVN指令中的地址的取值范围(第二操作数的取值范围)时,编译器将该常数放在数据缓冲区中,同时用一条基于PCLDR指令读取该常数。

LDR R1=0xFFF

汇编后得到:

LDR R1, [PC, OFFSET_TO_LPOOL]

LPOOL DCD 0xFFF

关于label-expr的介绍我不是很理解。不理解其中关于“连接重定位伪操作”。P144

声明:本文为我在学习杜春雷编著的《ARM体系结构与编程》时做的总结笔记,文中摘录了书中的很多内容。

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条