Welcome 微信登录

首页 / 操作系统 / 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       。。。。。。
我也是新手,欢迎大家拍砖:)共同进步!