關於*((volatile unsigned *)i)=0xEA000000+0x1FFE;的理解

for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
    {
 *((volatile unsigned *)i)=0xEA000000+0x1FFE;
    }
--  作者:sparkle_ke
--  時間:2005-12-29 14:23:29
--  
 for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
    {
 *((volatile unsigned *)i)=0xEA000000+0x1FFE;
    }
這部分還是不懂啊?能不能詳細一點阿 ?
謝謝啦!
--  作者:hankuu
--  時間:2005-12-29 14:56:03
--  
跳轉指令的格式爲

31  282725 24 23                       0
 __________________________
|cond |101| L |Signed_immed_24|
|___  |___|_  |______________ |

其中cond爲該條指令執行的條件碼
    101 是25,26,27三位的固定值
    L   決定是非保存返回地址,以便返回使用
    signed_immed_24是跟跳轉目標地址有關的值,呆會講該值的計算方法


那麼
0xEA000000+0x1FFE
就是一條跳轉指令,它的條件碼爲1110,表示無條件跳轉;L爲0表示不保存返回值(因爲這裏修改的是異常處理入口,不用返回值);0x1FFE指定跳轉目的地址。

下面我們看看signed_immed_24的計算方法:
1.將PC寄存器作爲該條跳轉指令的基地址;
2.用目標地址減去基地址,生成跳轉偏移量(程序要保證該偏移量小於33554432);
3.將這個值的bit[25:2]填入signed_immed_24中。
因此0x1FFE的意義就是目標地址相對當前地址爲 0x1FFE*4+8=0x8000

現在我們就明白了這段代碼是將RAM開始的32個字節中填入了8個跳轉指令,跳轉的目標地址爲當前指令地址+0x8000
如果你把你的程序加載到_RAM_STARTADDRESS+0x8000(在這塊板子上就是0x0C008000),那麼這幾個異常中斷都會跳轉到你自己程序中的異常中斷處理處,執行你自己的處理過程。
 
發佈了26 篇原創文章 · 獲贊 1 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章