從學習arm匯編開始就一直以為arm的指令b是一個絕對跳轉(zhuǎn)指令,最近在學習u-boot,看到一處使用b的例子,覺得這個指令并不是直接跳轉(zhuǎn)那么回事。 寫了個測試的例子: head.s ==================== .global _start .text _start: b reset b aa b bb b 0x30 reset: .space 8,0xab aa: .word 0xdeadbeef .space 8,0xab bb: .word 0xdeadbeef .word 0xdeadbeef .end ==================== 執(zhí)行命令:arm-none-eabi-gcc -mcpu=arm7tdmi -c head.s -o head.o&&arm-none-eabi-gcc -Ttext 0x0 -mcpu=arm7tdmi -nostartfiles head.o -o head.elf&&arm-none-eabi-objdump -d head.elf 后的輸出結(jié)果如下(反匯編): ================== Disassembly of section .text: 00000000 <_start>: 0: ea000002 b 10 <reset> 4: ea000003 b 18 <aa> 8: ea000005 b 24 <bb> c: ea000004 b 24 <bb> 00000010 <reset>: 10: abababab .word 0xabababab 14: abababab .word 0xabababab 00000018 <aa>: 18: deadbeef .word 0xdeadbeef 1c: abababab .word 0xabababab 20: abababab .word 0xabababab 00000024 <bb>: 24: deadbeef .word 0xdeadbeef 28: deadbeef .word 0xdeadbeef
================== 從上面的例子可以看到: b reset==>ea000002 b aa==>ea000003 b bb==>ea000005 b 0x30==>ea000004 從上面可以發(fā)現(xiàn)規(guī)律:指令所要跳轉(zhuǎn)到的標號地址=執(zhí)行這條指令時PC的值(這條指令的地址值+8,預(yù)取指的原因)+機器碼中的立即數(shù)*4 比如,<reset>=0+8+2*4=0x10 <aa>=4+8+3*4=0x18 也就是標號處是當前指令的地址向后數(shù)(機器碼中的立即數(shù)+2)個指令,也就是它跳轉(zhuǎn)時是相對PC當前值的。 至于直接跳轉(zhuǎn)到數(shù)字值(上面的b 0x30)怎么生成的地址,還沒搞清楚。。。 至少,從這個例子可以看出,b指令也是相對跳轉(zhuǎn)指令,它所要跳到的標號跟當前指令的地址有關(guān)。 (這個是自己的理解,歡迎大牛批評指正。 |