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的地址

心相关阅读:U-Boot源代码下载地址

调用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       。。。。。。

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

共同进步!

相关内容