首页 / 操作系统 / Linux / U-Boot bootloader 代码学习之关键
在阅读uboot(u-boot)代码的时候,很多人首先被.word搞晕了,为什么使用.word,其实与调用有关大家首先好好理解汇编代码:ldr pc, main_loop// 换一下代码 ldr pc, =main_loopmain_loop: .word test_code b main_looptest_code: b test在bootloader中使用的第一种,没有加=的代码。调用main_loop, 其实是让pc指向test_code的地址心相关阅读:U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm调用ldr时,什么时候使用有=的代码ldr pc, =main_loopmain_loop: // 此注释代码千万不可以打开 .word test_code b main_loop此时如果取消注释,哈哈:),让程序飞吧!! ldr, mov 命令之比较:ldr地址相关,mov地址无关我说一个关键点,可能大家不曾思考:ldr r1, =0x50000000ldr 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 。。。。。。
我也是新手,欢迎大家拍砖:)共同进步!