<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 11958|回復: 9
    打印 上一主題 下一主題

    [提問] arm-linux-gcc編譯的結果,反匯編出來的入口為什么不正確?

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2009-6-19 01:56:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    關鍵詞: 編譯 , 匯編 , 結果 , 入口
    .extern    main
    .text
    .global    _start
    @ 0x00: 系統入口,此處放置一條跳轉語句,跳過中斷向量表,至于中斷向量表,實際是最后被copy到SDRAM的高端地址,通過MMU來處理進入
    _start:  @-------->這里定義的入口處
        b    real_start  @-------->這里是跳過reset,但是reset實際是存在的,但不是程序真正的開始

    @ 0x04: 中斷向量表并非從0地址開始放置,因為我們使用的直接SDRAM調試時,中斷入口是需要通過MMU來映射的
    Reset:
        b    Reset            @直接在SDRAM中調試的話,實際是不使用Reset的,因此一Reset,硬件系統將從nand flash中讀取uboot來執行,所以此處實際是個空語句處理


    @ 0x08: Undefined instruction exception
    HandleUndef:
        b    HandleUndef

    @ 0x0c: Software interrupt exception  
    HandleSWI:
        b    HandleSWI

    @ 0x10: Prefetch Abort (Instruction Fetch Memory Abort)
    HandlePrefetchAbort:
        b    HandlePrefetchAbort

    @ 0x14: Data Access Memory Abort
    HandleDataAbort:
        b    HandleDataAbort

    @ 0x18: Not used
    HandleNotUsed:
        b    HandleNotUsed

    @ 0x1c: IRQ(Interrupt Request) exception
        ldr    pc,HandleIRQAddr

    @ 0x20: FIQ(Fast Interrupt Request) exception
    HandleFIQ:
        b    HandleFIQ
    HandleIRQAddr:   
        .long    HandleIRQ

    real_start:   
    @here,跳過系統上電后從0地址出的中斷向量表開始執行,這是為了不用燒寫FLASH來進行調試
    @here,此處應該先將系統設置為上電時系統的默認模式,因為此時系統尚運行于uboot的環境

        ldr    sp,    =0x30100000    @設置運行于SDRAM時的堆棧
        bl    disable_watch_dog    @關閉看門狗
        bl    clock_init        @初始化時鐘,啟動PLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
        bl    memsetup_2        @設置SDRAM
    @    bl    init_nand        @SDARM調試,不使用nand flash,所以不用初始化nand 控制器
        bl    copy_vectors_to_high    @此處使用lelee自己的代碼,將0x3000 0004地址開始的中斷向量表copy到SDRAM的高端去
       


    -----------------------------------------------------------
    以上為head.s的開頭處

    00000000 <.data>:
       0:    e1a0c00d     mov    ip, sp
       4:    e92dd800     stmdb    sp!, {fp, ip, lr, pc}
       8:    e24cb004     sub    fp, ip, #4    ; 0x4
       c:    e3a02313     mov    r2, #1275068416    ; 0x4c000000
      10:    e3e034ff     mvn    r3, #-16777216    ; 0xff000000
      14:    e5823000     str    r3, [r2]
      18:    e3a03313     mov    r3, #1275068416    ; 0x4c000000
      1c:    e2833014     add    r3, r3, #20    ; 0x14
      20:    e3a02003     mov    r2, #3    ; 0x3
      24:    e5832000     str    r2, [r3]
      28:    ee111f10     mrc    15, 0, r1, cr1, cr0, {0}
      2c:    e3811103     orr    r1, r1, #-1073741824    ; 0xc0000000
      30:    ee011f10     mcr    15, 0, r1, cr1, cr0, {0}
      34:    e3a02313     mov    r2, #1275068416    ; 0x4c000000
      38:    e2822004     add    r2, r2, #4    ; 0x4
      3c:    e3a03917     mov    r3, #376832    ; 0x5c000
      40:    e2833040     add    r3, r3, #64    ; 0x40
      44:    e5823000     str    r3, [r2]
      48:    e89da800     ldmia    sp, {fp, sp, pc}
      4c:    43434700     cmpmi    r3, #0    ; 0x0
      50:    4728203a     undefined
      54:    2029554e     eorcs    r5, r9, lr, asr #10
      58:    2e342e33     mrccs    14, 1, r2, cr4, cr3, {1}
      5c:    00000031     andeq    r0, r0, r1, lsr r0
      60:    eafffffe     b    0x60  @---->這里是中斷入口了
      64:    eafffffe     b    0x64
      68:    eafffffe     b    0x68
      6c:    eafffffe     b    0x6c
      70:    eafffffe     b    0x70
      74:    eafffffe     b    0x74
      78:    e59ff000     ldr    pc, [pc, #0]    ; 0x80
      7c:    eafffffe     b    0x7c
      80:    300040c4     andcc    r4, r0, r4, asr #1
      84:    e59fd04c     ldr    sp, [pc, #76]    ; 0xd8

    -----------------------------------------------

    很納悶,不知道為什么突然邊成這樣了,之前都還是好好的,反匯編的開始處是中斷入口

    誰給個答案?小弟謝謝了

    沙發
    發表于 2009-6-19 13:22:09 | 只看該作者
    呵呵,沒怎么理解清楚樓主的問題

    0x18應該為IRQ的入口吧怎么會是:

    @ 0x18: Not used
    HandleNotUsed:
        b    HandleNotUsed
    板凳
    發表于 2009-6-19 13:30:05 | 只看該作者
    傳說中的一式三招,ls...
    地板
    發表于 2009-6-19 13:30:18 | 只看該作者
    傳說中的一式三招,ls...
    地下室
     樓主| 發表于 2009-6-19 18:39:29 | 只看該作者
    南哥,我在連接的時候,直接把程序全放在0x30004000處了,直接通過uboot下載到SDRAM中去跑,而不是每次都燒寫nand,所以在程序的最開始處,相當于中斷向量表中的Reset的位置放置了一條跳轉指令b    real_start 來跳過reset,而真正的中斷向量表是往后推了4個字節來,所以那個保留的未使用的存放地址就到了0x18了,我的程序里邊用了段代碼將b    real_start后邊的7個word空間的向量表copy到SDRAM的高地址去了(這樣應該是可以進中斷的吧?中斷的進入只與pc的值和存放位置有關,與編譯連接應該沒什么關系吧?)

    我的問題是,為什么編譯的結果,0地址的b    real_start和緊接著的中斷向量表不在最開始處,而是跑到了“60:    eafffffe     b    0x60  @---->這里是中斷入口了”這里來了?

    昨天改程序,改來改去,編譯結果還是這樣,反匯編出來的代碼就是一樓里貼的,而且下載到SDRAM里了,根本不跑
    6
     樓主| 發表于 2009-6-19 18:45:49 | 只看該作者
    本來弄了個簡單的,不開中斷的 程序,在main()里邊的while(1)中用led的交替亮滅來測試,是正常的(就是連接直接指明程序從30004000處開始運行,編譯結果用uboot下載到30004000處,然后go 30004000,是可以正常跑的。MMU也開了,64M的SDRAM的地址空間,除了33f0 0000映射到ffff 0000處(33f0 0000開始存放中斷向量表),其他地址都是映射為本身,寄存器也一頁映射為本身地址)
    但是加了timer0后,編譯的結果就成這樣了,莫名其妙
    7
    發表于 2009-6-22 09:05:09 | 只看該作者
    其實問題沒有考慮太多.但是有一點必需清楚的認識到,CPU復位之后PC指向0x0地址,產生IRQ時PC指向0x18,這是三星ARM處理器的鐵的實事.就是俺是中國人一樣永遠是改變不了的事實!
    8
    發表于 2009-6-22 09:06:10 | 只看該作者
    其實問題沒有考慮太多.但是有一點必需清楚的認識到,CPU復位之后PC指向0x0地址,產生IRQ時PC指向0x18,這是三星ARM處理器的鐵的實事.就是俺是中國人一樣永遠是改變不了的事實!
    9
     樓主| 發表于 2009-6-24 22:53:53 | 只看該作者
    2410中斷入口有兩中擺放方式嘛,低端和高端
    如果放高端的話,復位后PC指向FFFF0000吧
    IRQ來的時候就指向FFFF0018了吧
    10
    發表于 2011-1-14 10:12:08 | 只看該作者
    居然有人這種問題都沒有搞懂
    11
    發表于 2011-1-14 10:12:28 | 只看該作者
    0x18就是未用嘛
    12
     樓主| 發表于 2011-1-14 12:04:06 | 只看該作者
    LS弄明白到底時什么問題了么?!:-)

    討論的是反匯編的結果不正確,正常反匯編出來的結果不是這樣

    至于0X18用沒用,壓根沒提到過,并且是把程序入口重新映射了,并且用鏈接腳本處理過

    弄明白了再跟貼
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷