对上面一章的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]运行指令