一直以来,关于ldr的命令的理解,总是很模糊,网上有很多讲解的文章,讲的不全面,有时互相矛盾。得到一个结论就是:看资料还是尽量看最权威、最源头的资料。
1.参考资料
ARM体系结构与编程(第二版) 杜春雷
- ldr汇编指令和ldr伪汇编指令的区别
ldr汇编指令没有 “=”
ldr伪汇编指令有 “=”
2.ldr汇编指令
-
2.2.2 字及无符号字节的Load/Store 指令的寻址方式:
主要内容:二进制指令编码的生成
内存地址计算方法
指令中寻址方式的语法格式
计算内存实际地址的伪代码
使用说明
示例
-
3.1.6 Load/Store内存访问指令:具体的例子
3.ldr伪指令
- 伪指令
- 4.2 ARM汇编语言伪指令:LDR伪指令:
4.实例
- 参考网址:
- 实验
- 汇编文件ldr_test.S
下图的LDR R0, test
书写不规范,既不是ldr汇编指令,也不是ldr伪汇编指令,具体生成的二进制指令编码需要看编译器(个人见解)
- Makfile文件部分截图
- ldr_test.dis反汇编文件
由上面的反汇编文件可以知道:LDR R0, test
语句被ldr r0, [pc, #8]
替代:结果是R0=0xe320f000
。它的指令编码为e59f0008
,二进制为1110_0101_1001_1111_0000_0000_0000_1000
。查看第23页条件码域和36页指令编码格式可知:1110(31-28位)
表示无条件执行、1111(19-16位)
表示基址寄存器Rn = R15(PC)
、0000(15-12位)
表示目标寄存器Rd = R0
,0000_0000_1000(11-0位)
表示基址偏移为8。pc + 8 + 8 = 0x30000000+8+8=0x30000010
,即ldr r0, [pc, #8]
转化为ldr r0, [0x30000010]
,最后得到R0=0xe320f000
LDR R0, =test
被ldr r0, [pc, #4]
替代,结果是R0=0x30000014
。
- 汇编文件ldr_test.S