音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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
我來說說
這是個宏,我前不久看不懂,后來自己解決的,在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樓: >>參與討論
阿南
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
呵呵,深受鼓舞,又發(fā)現(xiàn)問題
第一天在ARM論壇發(fā)表看法,就被斑竹表揚了,那個高興阿
不過突然覺得,str        r0,[sp,#4]這句是不是有問題,應該是加8吧?
或者stmfd   sp!,{r0}  這句,SP后面不要嘆號

5樓: >>參與討論
icyacht
收回剛才的問題
收回剛才的問題!被滿遞減弄暈了~~,把代碼調(diào)試了一下才明白過來~~

6樓: >>參與討論
huai903
一下子清晰了,謝謝兩位。
 
7樓: >>參與討論
huai903
我自己的總結(jié)共享一下,應該是這個意思。


* - 本貼最后修改時間:2006-8-4 11:50:55 修改者:huai903

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
直接用MCU或ARM去對CF卡讀寫,最快速率是多少?哪位做過的說一下
想轉(zhuǎn)型使用arm用于工控!不知道哪個公司的arm易學,請指教!
緊急求助。£P(guān)于DM9000A
求問阿南斑竹一個問題。
請教高手4-20mA的輸出該怎么做,提供電思路
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號