首先把u-boot应用于s3c2410的反汇编代码贴出来,其中第1列是行号,第2列是运行时地址。
1 u-boot: file format elf32-littlearm
2 Disassembly of section .text:
3 33f80000 <_start>:
4 33f80000: ea000012 b 33f80050
5 33f80004: e59ff014 ldr pc, [pc, #20] ; 33f80020 <_undefined_instruction>
6 33f80008: e59ff014 ldr pc, [pc, #20] ; 33f80024 <_software_interrupt>
7 33f8000c: e59ff014 ldr pc, [pc, #20] ; 33f80028 <_prefetch_abort>
8 33f80010: e59ff014 ldr pc, [pc, #20] ; 33f8002c <_data_abort>
9 33f80014: e59ff014 ldr pc, [pc, #20] ; 33f80030 <_not_used>
10 33f80018: e59ff014 ldr pc, [pc, #20] ; 33f80034 <_irq>
11 33f8001c: e59ff014 ldr pc, [pc, #20] ; 33f80038 <_fiq>
12 33f80020 <_undefined_instruction>:
13 33f80020: 33f80140 .word 0x33f80140
14 33f80024 <_software_interrupt>:
15 33f80024: 33f801a0 .word 0x33f801a0
16 33f80028 <_prefetch_abort>:
17 33f80028: 33f80200 .word 0x33f80200
18 33f8002c <_data_abort>:
19 33f8002c: 33f80260 .word 0x33f80260
20 33f80030 <_not_used>:
21 33f80030: 33f802c0 .word 0x33f802c0
22 33f80034 <_irq>:
23 33f80034: 33f80320 .word 0x33f80320
24 33f80038 <_fiq>:
25 33f80038: 33f80380 .word 0x33f80380
26 33f8003c: deadbeef .word 0xdeadbeef
27 33f80040 <_TEXT_BASE>:
28 33f80040: 33f80000 .word 0x33f80000
29 33f80044 <_armboot_start>:
30 33f80044: 33f80000 .word 0x33f80000
31 33f80048 <_bss_start>:
32 33f80048: 33f96c64 .word 0x33f96c64
33 33f8004c <_bss_end>:
34 33f8004c: 33f9b388 .word 0x33f9b388
35 33f80050 :
36 33f80050: e10f0000 mrs r0, CPSR
37 33f80054: e3c0001f bic r0, r0, #31 ; 0x1f
38 33f80058: e38000d3 orr r0, r0, #211 ; 0xd3
39 33f8005c: e129f000 msr CPSR_fc, r0
40 33f80060: e3a00453 mov r0, #1392508928 ; 0x53000000
41 33f80064: e3a01000 mov r1, #0 ; 0x0
42 33f80068: e5801000 str r1, [r0]
43 33f8006c: e3e01000 mvn r1, #0 ; 0x0
44 33f80070: e59f0360 ldr r0, [pc, #864] ; 33f803d8
45 33f80074: e5801000 str r1, [r0]
46 33f80078: e59f135c ldr r1, [pc, #860] ; 33f803dc
47 33f8007c: e59f035c ldr r0, [pc, #860] ; 33f803e0
48 33f80080: e5801000 str r1, [r0]
49 33f80084: e59f0358 ldr r0, [pc, #856] ; 33f803e4
50 33f80088: e3a01003 mov r1, #3 ; 0x3
51 33f8008c: e5801000 str r1, [r0]
52 33f80090: eb000018 bl 33f800f8
53 33f80094 :
54 33f80094: e24f009c sub r0, pc, #156 ; 0x9c
55 33f80098: e51f1060 ldr r1, [pc, #-96] ; 33f80040 <_TEXT_BASE>
56 33f8009c: e1500001 cmp r0, r1
57 33f800a0: 0a000007 beq 33f800c4
58 33f800a4: e51f2068 ldr r2, [pc, #-104] ; 33f80044 <_armboot_start>
59 33f800a8: e51f3068 ldr r3, [pc, #-104] ; 33f80048 <_bss_start>
60 33f800ac: e0432002 sub r2, r3, r2
61 33f800b0: e0802002 add r2, r0, r2
第4行"ea000012 b 33f80050 "使用了相对跳转指令b,是与位置无关的跳转指令,ea000012中的立即数0x12代表了相对于PC的指令个数:0x33f80000+2*4+0x12*4=0x33f80050
第5-11行,使用了ldr指令,这几行是与位置相关的。以第5行为例,"ldr pc, [pc, #20]"是取得地址pc+20处的内容到pc中,也就是把0x33f80140放到pc中,而0x33f80140处就是未定义指令异常的服务子程序。0x33f80140的值是在链接时确定的,因而是与位置相关的。这样做是有道理的:当出现未定义指令异常时,PC自动跳转到0x04处,在此又取得0x33f80140到PC中,从而到内存中去执行服务子程序(这时已经由以后的代码把flash中的代码拷到SDRAM中了),比在flash中执行加快了响应速度。
第28行的值是由config.mk里面的内容确定的(TEXT_BASE = 33f80000);31和33行是由连接脚本中的 __bss_start = .和 _end= .确定的。
阅读(2530) | 评论(0) | 转发(0) |