设为首页 加入收藏

TOP

U-Boot bootloader 代码学习之关键
2014-11-24 11:17:55 来源: 作者: 【 】 浏览:0
Tags:U-Boot bootloader 代码 习之 关键

在阅读uboot(u-boot)代码的时候,很多人首先被.word搞晕了,为什么使用.word,其实与调用有关


大家首先好好理解汇编代码:


ldr pc, main_loop


// 换一下代码 ldr pc, =main_loop


main_loop:


.word test_code


b main_loop


test_code:


b test


在bootloader中使用的第一种,没有加=的代码。调用main_loop, 其实是让pc指向test_code的地址


调用ldr时,什么时候使用有=的代码


ldr pc, =main_loop


main_loop:


// 此注释代码千万不可以打开 .word test_code


b main_loop


此时如果取消注释,哈哈:),让程序飞吧!!



ldr, mov 命令之比较:


ldr地址相关,mov地址无关


我说一个关键点,可能大家不曾思考:


ldr r1, =0x50000000


ldr r1, =0x50000011


这两句编译生成的代码并不一样,通过arm-linux-objdump可以看到


第一句:


0: e3a00205 mov r0, #1342177280 ; 0x50000000


第二句:


0: e51f0004 ldr r0, [pc, #-4] ; 4 <.text+0x4>
4: 50000011 andpl r0, r0, r1, lsl r0
第一个值能用立即数表示,mov指令就行了


第二句不能用立即数表示,不能不使用ldr指令


其实Arm还是很聪明的嘛!第一句能节省一个指令空间,代码size减少了4字节啊!


如果非要看看第一句也使用ldr指令,大概是这样的汇编,当然不会是真的:


0: e51f0004 ldr r0, [pc, #-4] ; 4 <.text+0x4>
4: 50000000 。。。。。。


我也是新手,欢迎大家拍砖:)


共同进步!


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Ubuntu下编译openJdk 6 下一篇Android入门之RadioGroup

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何从内核协议栈到 (2025-12-27 03:19:09)
·什么是网络协议?有哪 (2025-12-27 03:19:06)
·TCP/ IP协议有哪些 (2025-12-27 03:19:03)
·怎样用 Python 写一 (2025-12-27 02:49:19)
·如何学习python数据 (2025-12-27 02:49:16)