大家首先好好理解汇编代码:
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 。。。。。。
我也是新手,欢迎大家拍砖:)
共同进步!