Chinaunix首页 | 论坛 | 博客
  • 博客访问: 240343
  • 博文数量: 27
  • 博客积分: 358
  • 博客等级: 一等列兵
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 17:35
文章分类

全部博文(27)

文章存档

2015年(1)

2014年(4)

2013年(6)

2012年(4)

2011年(12)

分类: 嵌入式

2011-05-10 09:29:42

    首先把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) |
给主人留下些什么吧!~~