<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > C51軟復位分析

C51軟復位分析

作者: 時(shí)間:2012-07-04 來(lái)源:網(wǎng)絡(luò ) 收藏
復位功能函數:一個(gè)大三學(xué)生,讓人又愛(ài)又怕

現單列復位部分如下:

main()

{

unsignedcharcoderst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};//復位代碼

(*((void(*)())(rst)))();//執行上一行代碼,將rst數組當函數調用

}

本來(lái)我告訴他嵌入如下代碼:

clra

pushacc

pushacc

reti

結果他卻玩了前面哪一段,而數組rst[]中的內容恰恰是上面的匯編機器碼,他的做法是將
rst數組的數據當作代碼保存,然后采用絕對地址方式指向該數組,將該數組中的代碼當作
函數來(lái)運行。居然通過(guò)了!

我覺(jué)得有問(wèn)題,我說(shuō)即使如此,那絕對地址調用也應該寫(xiě)成(*((void(*)())(rst)))()
才對呀,結果他反駁說(shuō),那樣的話(huà),rst的地址就會(huì )當成參數傳遞給這個(gè)絕對地址函數,而
實(shí)際LJMP調用的地址并非rst的地址,而是一個(gè)不確定的地址。于是我按照自己的說(shuō)法嘗試
了一下,看看匯編結果,還真的是將rst的地址傳遞給了R1R2,而絕對函數最終LJMP到了
一個(gè)莫名其妙的地址上去了,死翹!

看來(lái)C真是一匹不容易駕馭的野馬,這個(gè)大三學(xué)生理解力在我之上,我30多歲的人了,干了
這么多年還沒(méi)他的境界呢,唉,人家才學(xué)了幾天啊,翻了幾天書(shū)就這么厲害了,服了!

首先分析帖子的C語(yǔ)言代碼

第一句定義一個(gè)數組rst[],數組內數據就是完成復位功能的匯編機器碼,具體對應關(guān)系
為:clra==0xe4、pushacc==0xc0,0xe0、reti==0x32

第二句是一個(gè)函數指針的用法,函數指針用法稍微有點(diǎn)復雜,可參看本人著(zhù)的書(shū),:),以
下為快速入門(mén)講解。

定義一個(gè)返回值是空函數指針的定義形式如下:

void(*p)()

當把函數指針賦值后,就能通過(guò)函數指針調用函數,調用形式如下,

(*p)();

或等價(jià)的簡(jiǎn)化形式:

p();

假設rst就是函數指針,則如下調用形式就可以令單片機復位再起。

(*rst)();

但可惜,rst不是函數指針,而是數組名,雖然兩者都是地址,但不可直接調用數組名。

如同把char型變量a賦值給int型變量b,(int)表示強制類(lèi)型轉換:

b=(int)a

函數指針的強制類(lèi)型轉換公式如下(C語(yǔ)言的哲學(xué)是定義形式和使用一致):

((void(*)())rst

這樣經(jīng)過(guò)轉換后的rst就可以當作函數指針使用了,簡(jiǎn)單的調用形式如下:

#defineK((void(*)())rst

(*K)()

或:

(*(void(*)())rst)();

上一頁(yè) 1 2 3 4 下一頁(yè)

關(guān)鍵詞: C51 軟復位分析

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>