|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
ADS中文教程中例程的一點疑惑 |
| 作者:zbp_uestc 欄目:ARM技術(shù) |
看了ADS中文教程過后,里邊有一段例程我照著寫了一次,編譯,連接都通過了過后我用AXD軟件仿真,在反匯編跟蹤發(fā)現(xiàn)居然程序來就是從main開始執(zhí)行,匯編的一小段背忽略了??? 具體代碼如下: 文件Init.s IMPORT main; AREA Init,CODE,READONLY; ENTRY LDR R0,=0x3ff0000; LDR R1,=0xe7ffff80; STR R1,[R0]; LDR SP,=0x3fe1000; BL main; B . END 文件main.c #define IOPMOD (*(volatile unsigned *)0x03ff5000) #define IOPDATA (*(volatile unsigned *)0x03ff5008) void Delay(unsigned int); int main() { unsigned LONG LED; IOPMOD=0xffffffff; IOPDATA=0x01; for(;;) { LED=IOPDATA; LED=(LED<<1); IOPDATA=LED; Delay(10); if(!(IOPDATA&0x0f)) { IOPDATA=0x01; } } return 0; } void Delay(unsigned int x) { unsigned int i,j,k; for(i=0;i<=x;i++) for(j=0;j<0xff;j++) for(k=0;k<0xff;k++); } AXD調(diào)試的時候程序直接就從__main標(biāo)號的地方開始了!!!!????希望大人給與解釋一下,我再寫一個小程序測試看看其中的流程. 調(diào)試的反匯編代碼: ENTRY [0xe59f0010] ldr r0,0x00000018 ; = #0x03ff0000 00000004 [0xe59f1010] ldr r1,0x0000001c ; = #0xe7ffff80 00000008 [0xe5801000] str r1,[r0,#0] 0000000c [0xe59fd00c] ldr r13,0x00000020 ; = #0x03fe1000 00000010 [0xeb00003b] bl main 00000014 [0xeafffffe] b 0x14 ; (ENTRY + 0x14) 00000018 [0x03ff0000] dcd 0x03ff0000 .... 0000001c [0xe7ffff80] dcd 0xe7ffff80 .... 00000020 [0x03fe1000] dcd 0x03fe1000 .... __main [0xe28f8090] add r8,pc,#0x90 ; #0xbc 00000028 [0xe898000f] ldmia r8,{r0-r3} 0000002c [0xe0800008] add r0,r0,r8 00000030 [0xe0811008] add r1,r1,r8 00000034 [0xe0822008] add r2,r2,r8 00000038 [0xe0833008] add r3,r3,r8 0000003c [0xe240b001] sub r11,r0,#1 00000040 [0xe242c001] sub r12,r2,#1 . . . . . . |
| 2樓: | >>參與討論 |
| 作者: icyacht 于 2006/8/5 17:28:00 發(fā)布:
我來說 我試了,把主函數(shù)名main 改成 Main 或其他名字,當(dāng)然 INIT。S里也要改,就可以了,我也很奇怪。。。。 |
|
| 3樓: | >>參與討論 |
| 作者: zbp_uestc 于 2006/8/5 17:39:00 發(fā)布:
我去試試看,謝謝icyacht的方法 不過有沒有人能給出點具體的解釋,這個怎么回事啊?? |
|
| 4樓: | >>參與討論 |
| 作者: zbp_uestc 于 2006/8/5 17:48:00 發(fā)布:
我用icyacht的方法試了,有點問題 編譯完了有一個警告 warning:L6305W: image does not have an entry point |
|
| 5樓: | >>參與討論 |
| 作者: icyacht 于 2006/8/5 20:05:00 發(fā)布:
還有 ENTRY 應(yīng)該是空格寫,后面還要加上CODE32 ,然后把main改成其他的名字,就可以的。 估計main 被編譯器用作某種特殊的東西了吧?搞不清! 還有,我用的周立功的實驗板的例子程序里,啟動文件startup.s 里面 最后用的是 b __main (注意這里用main 就可以,奇怪),而C程序里的主函數(shù)名是main ,沒有前面的"__" . 不知是為什么. 還有其他程序里見過前面只帶一格"_"的,還請高手講講,是不時"__"和"_" 有什么特別含義? |
|
| 6樓: | >>參與討論 |
| 作者: icyacht 于 2006/8/5 20:18:00 發(fā)布:
對了還有 周立功例子里講的例程里還需要設(shè)置OPTION選項里的ARM Linker,再編譯連接.具體是: 1.output 頁里 RO Base 設(shè)成 0x40000000,RW Base 設(shè)成 0x40003000 2. options 頁里 image entry point 設(shè)成 0x40000000 3. layout 頁里 object /symbol 設(shè)成init.o ,section 設(shè)成init 這樣的話,也是可以的,不過要注意,還是不能用"main",選其他名字吧;注意觀察PC的值,這樣設(shè)置的話一開始PC的值就是0x40000000 |
|
| 7樓: | >>參與討論 |
| 作者: zbp_uestc 于 2006/8/5 22:50:00 發(fā)布:
我在編譯過程必須將ENTRY頂格書寫 我在編譯過程必須將ENTRY頂格書寫編譯猜不會有我上邊寫的那個警告.還有我發(fā)發(fā)現(xiàn)主要把聲明main改為聲明_main下邊跳到_main 也可以編譯通過不過全部都不是從最原來的入口ENTRY處開始執(zhí)行的,找不到原因, icyacht你可以不可以把你編譯好的這個工程文件發(fā)給我,我看看到底差錯在什么地方?? 我的郵箱是zbp_uestc@163.com 謝謝!! |
|
| 8樓: | >>參與討論 |
| 作者: zbp_uestc 于 2006/8/5 23:32:00 發(fā)布:
謝謝icyacht的回答,我已經(jīng)明白我為什么錯了 主要原因在于我把標(biāo)號ENTRY頂格書寫,這樣造成編譯器認為ENTRY是一個普通的標(biāo)號,不是關(guān)鍵字 造成! 謝謝1!1!1! |
|
| 9樓: | >>參與討論 |
| 作者: icyacht 于 2006/8/7 11:25:00 發(fā)布:
呵呵 知道原因了 ,那我就不用發(fā)了 |
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |