亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1214 | 回復: 0
打印 上一主題 下一主題

從u-boot的啟動代碼理解arm代碼位置的無關性 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-21 08:41 |只看該作者 |倒序瀏覽
    首先把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 <reset>
     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 <reset>:
    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 <fiq+0x58>
    45  33f80074:       e5801000        str     r1, [r0]
    46  33f80078:       e59f135c        ldr     r1, [pc, #860]  ; 33f803dc <fiq+0x5c>
    47  33f8007c:       e59f035c        ldr     r0, [pc, #860]  ; 33f803e0 <fiq+0x60>
    48  33f80080:       e5801000        str     r1, [r0]
    49  33f80084:       e59f0358        ldr     r0, [pc, #856]  ; 33f803e4 <fiq+0x64>
    50  33f80088:       e3a01003        mov     r1, #3  ; 0x3
    51  33f8008c:       e5801000        str     r1, [r0]
    52  33f80090:       eb000018        bl      33f800f8 <cpu_init_crit>

    53  33f80094 <relocate>:
    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 <stack_setup>
    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 <reset>"使用了相對跳轉指令b,是與位置無關的跳轉指令,ea000012中的立即數(shù)0x12代表了相對于PC的指令個數(shù):0x33f80000+2*4+0x12*4=0x33f80050<reset>
    第5-11行,使用了ldr指令,這幾行是與位置相關的。以第5行為例,"ldr     pc, [pc, #20]"是取得地址pc+20處的內(nèi)容到pc中,也就是把0x33f80140放到pc中,而0x33f80140處就是未定義指令異常<undefined_instruction>的服務子程序。0x33f80140的值是在鏈接時確定的,因而是與位置相關的。這樣做是有道理的:當出現(xiàn)未定義指令異常時,PC自動跳轉到0x04處,在此又取得0x33f80140到PC中,從而到內(nèi)存中去執(zhí)行服務子程序(這時已經(jīng)由<reset>以后的代碼把flash中的代碼拷到SDRAM中了),比在flash中執(zhí)行加快了響應速度。
    第28行的值是由config.mk里面的內(nèi)容確定的(TEXT_BASE = 33f80000);31和33行是由連接腳本中的 __bss_start = .和 _end= .確定的。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP