|
|||||||||||
| 技術(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 |
查過很多,還是不能理解透徹。 |
| 作者:huai903 欄目:ARM技術(shù) |
$HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address) stmfd sp!,{r0} ;PUSH the work register to stack(lr does't PUSH because it return to original address) ldr r0,=$HandleLabel;load the address of HandleXXX to r0 ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) MEND 最讓我無法理解的是 sub sp,sp,#4 ;decrement sp(to store jump address) 為什么能實現(xiàn)store jump address? 為什么非要這么一步? str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack ;將對應的中斷函數(shù)首地址入棧 ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) ;將中斷函數(shù)首地址出棧 放入程序指針中 系統(tǒng)將跳轉(zhuǎn)到對應中斷處理函數(shù) 為什么不直接跳到中斷處理函數(shù),而先入棧然后又出棧的去實現(xiàn)? 這樣有什么好處? * - 本貼最后修改時間:2006-8-3 19:35:44 修改者:huai903 |
| 2樓: | >>參與討論 |
| 作者: icyacht 于 2006/8/4 9:48:00 發(fā)布:
我來說說 這是個宏,我前不久看不懂,后來自己解決的,在ADS幫助文檔里有宏定義的詳細介紹,不過十英文的,但是也不難. 1.為什么能實現(xiàn)store jump address? 可以看出是滿遞減堆棧,sub sp,sp,#4 是將堆棧指針后移動,你對注釋理解有問題,不時實現(xiàn)store jump address,而是為了store jump address.堆棧指針后移,空出了4個字節(jié)的堆?臻g,目的是為后面存儲中斷服務程序地址(str r0,[sp,#4])預留堆棧空間 .這樣,最后出棧前,堆棧里保存的內(nèi)容是R0,和中斷服務程序地址,注意,順序是R0在最頂上. 2.為什么非要這么一步? 恐怕就是為了保證這個存儲順序。 3.為什么不直接跳到中斷處理函數(shù),而先入棧然后又出棧的去實現(xiàn)? 原因之一應該是:要通過標號得到中斷服務程序地址,需要寄存器,這里用的R0 ,而這時在中斷中,所以當然要先保護現(xiàn)場,把R0保存到堆棧里。 也許還有其他原因。。。得聯(lián)系一下其他程序吧。 另外,為什么不直接用跳轉(zhuǎn)指令:(我猜猜,僅供參考) 如果用B指令,后面應該是標號,實際上是個偏移量,但是這里的HandleLabel好像不是中斷服務程序的地址,而是中斷服務程序地址的地址,也就是,中斷服務程序的地址沒有用標號的形式給出,沒法直接用B指令實現(xiàn)。 4.有什么好處? 肯定是有好處的。。。呵呵,還是要多聯(lián)系一下周圍的代碼,多調(diào)試一下,實踐中去體會吧,我也是初學 ,不好說 |
|
| 3樓: | >>參與討論 |
| 作者: 阿南 于 2006/8/4 9:54:00 發(fā)布:
icyacht說的對 (to store jump address)為指保存由HandleLabel參數(shù)傳遞的最終跳轉(zhuǎn)的地址,即最后一條指令把它傳給PC實現(xiàn)跳轉(zhuǎn)。 為什么要有“sub sp,sp,#4”是保證執(zhí)行該段程序的前后SP值保持不變,和不破壞堆棧原有的數(shù)據(jù)(因為是遞減堆!獜母叩刂吠偷刂)。 假設(shè)進入該段程序前sp = 0x33ff57e8,當指行 “sub sp,sp,#4”后 sp = 0x33ff57e4,當執(zhí)行“ stmfd sp!,{r0}”后將r0的內(nèi)容保存到0x33ff57e0中,同時sp = 0x33ff57e0,以后的三條指令將要跳轉(zhuǎn)的地址(通過$HandleLabel參數(shù))寫入到0x33ff57e4,但sp仍為0x33ff57e0,最后執(zhí)行“ ldmfd sp!,{r0,pc}”將0x33ff57e0的內(nèi)容重新覆給r0,而將0x33ff57e4的內(nèi)容覆給PC實現(xiàn)跳轉(zhuǎn),同時刷新sp=0x33ff57e8 |
|
| 4樓: | >>參與討論 |
| 作者: icyacht 于 2006/8/4 10:14:00 發(fā)布:
呵呵,深受鼓舞,又發(fā)現(xiàn)問題 第一天在ARM論壇發(fā)表看法,就被斑竹表揚了,那個高興阿 不過突然覺得,str r0,[sp,#4]這句是不是有問題,應該是加8吧? 或者stmfd sp!,{r0} 這句,SP后面不要嘆號 |
|
| 5樓: | >>參與討論 |
| 作者: icyacht 于 2006/8/4 10:25:00 發(fā)布:
收回剛才的問題 收回剛才的問題!被滿遞減弄暈了~~,把代碼調(diào)試了一下才明白過來~~ |
|
| 6樓: | >>參與討論 |
| 作者: huai903 于 2006/8/4 10:51:00 發(fā)布:
一下子清晰了,謝謝兩位。 |
|
| 7樓: | >>參與討論 |
| 作者: huai903 于 2006/8/4 11:50:00 發(fā)布:
我自己的總結(jié)共享一下,應該是這個意思。 ![]() * - 本貼最后修改時間:2006-8-4 11:50:55 修改者:huai903 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |