对上面一章的led.elf,使用下面命令生成反汇编代码:
arm-linux-objdump -D led.elf > led.dis
led.dis内容如下:
led.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>://汇编代码的标签,地址为0
0: e3a00207 mov r0, #1879048192 ; 0x70000000
4: e3800013 orr r0, r0, #19
8: ee0f0f92 mcr 15, 0, r0, cr15, cr2, {4}
c: e59f0020 ldr r0, [pc, #32] ; 34 <halt+0x4>
10: e3a01001 mov r1, #1
14: e5801000 str r1, [r0]
18: e59f0018 ldr r0, [pc, #24] ; 38 <halt+0x8>
1c: e3a01001 mov r1, #1
20: e5801000 str r1, [r0]
24: e59f0010 ldr r0, [pc, #16] ; 3c <halt+0xc>
28: e3a01000 mov r1, #0
2c: e5801000 str r1, [r0]
00000030 <halt>:
30: eafffffe b 30 <halt>
34: 7e004000 cdpvc 0, 0, cr4, cr0, cr0, {0}
38: 7f008820 svcvc 0x00008820
3c: 7f008824 svcvc 0x00008824
Disassembly of section .ARM.attributes:
00000000 <.ARM.attributes>:
0: 00001a41 andeq r1, r0, r1, asr #20
4: 61656100 cmnvs r5, r0, lsl #2
8: 01006962 tsteq r0, r2, ror #18
c: 00000010 andeq r0, r0, r0, lsl r0
10: 45543505 ldrbmi r3, [r4, #-1285] ; 0x505
14: 08040600 stmdaeq r4, {r9, sl}
18: Address 0x00000018 is out of bounds.
0地址的代码为:
ldr r0, =CONFIG_PERIPORT_BASE
反汇编为:mov r0, #1879048192 ; 0x70000000
c地址的代码为:
ldr r0, =WTCON
反汇编为:ldr r0, [pc, #32] ; 34 <halt+0x4>
问题:为什么使用相同的ldr指令,得出的反汇编代码为什么是不一样的?
在ARM中一条指令代码占据32bit的空间,这个空间中既有命令(比如:ldr),又有寄存器(比如:r0),同时还有地址或相关内容(比如:0x7E004000)当这个值比较复杂的时候导致整个指令代码超过了32bit的空间,编译器就会帮你将这个值存放在某个地址中,如果要使用这个值,就可以从这个地址中取出这个值。
ldr r0, [pc, #32] 就相当与在pc + 32的地址处取出内容放到r0中。
pc = 当前地址 + 8 = c + 8 = 20 (pc = 当前指令地址 + 8的原因是什么???)
则:
pc + 32 = 20 + 32 = 52 ====> [pc,#32] = [52] = [0x34] = 7e004000 ,这就是需要取的值。。
Makefile运行的规则:
1.目标不存在的时候,会重新编译
2.依赖更新了,也会重新编译
Makefile的形式:
目标:依赖1 依赖2 ...
[TAB]运行指令