官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2552|回复: 2

LDR R1,= 0x12345678 和 LDR R1,0x12345678 区别???

[复制链接]

18

主题

20

帖子

29

积分

新手上路

Rank: 1

积分
29
发表于 2008-7-30 11:30:00 | 显示全部楼层 |阅读模式
请教:  
  LDR    R1,=  0x12345678      ;加载  32  位立即数  
  和   
  LDR    R1,0x12345678      
  有什么不相同啊?  
  一般在什么情况下用    LDR    R1,=  0x12345678  ?  
  在什么情况下用  LDR    R1,0x12345678  ?  
   
   
   
   
  LDR    R0,=LED_TAB              ;加载标号地址  
  和   
  LDR    R0,LED_TAB      
  有什么不相同啊?  
  一般在什么情况下用  LDR    R0,=LED_TAB  ?  
  在什么情况下用    LDR    R0,LED_TAB  ?  
   
   
  谢谢!
回复

使用道具 举报

56

主题

5186

帖子

7811

积分

超级版主

Rank: 8Rank: 8

积分
7811
QQ
发表于 2008-7-30 13:03:00 | 显示全部楼层

回复:LDR R1,= 0x12345678 和 LDR R1,0x12345678 ...

1. 没有“LDR R1,0x12345678 ”
2. 以下两条指令是一样的,都被称为“伪指令”,就是说编译器会把这条指令替换成其他合适的指令。
LDR    R1, =0x12345678
LDR    R0, =LED_TAB              
如果这些数值不太复杂,那么就会用mov指令代替,比如:
ldr r1, =0x00
在编译时就会变成:
mov r1, #0x00

如果这些数值很复杂,那么编译时,这个数值会被保存在某个地方,然后使用读内存的指令进行读取,比如:
LDR    R1, =0x12345678
在编译时变成:
ldr  r1, [pc, xxxxx]   // 这个xxx与pc相加,刚好就是some_locate的地址──编译器会帮你做好这一切
some_locate: .word 0x12345678

3. 你说“LDR    R0,=LED_TAB              ;加载标号地址  ”,没错,
LED_TAB是个地址标号,就是一个数值而已,编译器连接程序时会确定它的值,如果它很简单,就会使用mov指令赋值;如果很复杂,就存在某个地址,然后用读内存的指令读出。

4. LDR    R0,LED_TAB  
没有“=”号,它表示“读内存”.
比如:
LDR    R0,LED_TAB  
LDR    R1, =LED_TAB  
LED_TAB: .work 0x12345678

R0的值是0x12345678,R1的值是LED_TAB标号值,就是0x12345678在内存中存放的地址
回复 支持 1 反对 0

使用道具 举报

0

主题

4

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2012-6-9 12:49:00 | 显示全部楼层
回复 2楼thisway.diy的帖子

:-D:-D:-D
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-11-18 14:38 , Processed in 0.373426 second(s), 23 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表