日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
從單片機(jī)指針說到黑客程序
從單片機(jī)指針說到黑客程序
 更新時間:2008-8-17 19:43:35  點(diǎn)擊數(shù):12
【字體: 字體顏色
c51軟復(fù)位,經(jīng)典,分析透徹 

........注:轉(zhuǎn)貼...........

從單片機(jī)指針說到黑客程序


2004年7月的一天,在電子BBS討論區(qū)上溜達(dá),看到一個有趣的帖子,整個帖子內(nèi)容如下:

純C51復(fù)位功能函數(shù):一個大三學(xué)生,讓人又愛又怕

現(xiàn)單列復(fù)位部分如下:

main()

{

   unsigned char code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};  // 復(fù)位代碼

   (*((void (*)())(rst)))();  // 執(zhí)行上一行代碼,將rst數(shù)組當(dāng)函數(shù)調(diào)用

}

本來我告訴他嵌入如下代碼:

clr a

push acc

push acc

reti

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

我覺得有問題,我說即使如此,那絕對地址調(diào)用也應(yīng)該寫成(*((void (*)())(&rst)))() 
才對呀,結(jié)果他反駁說,那樣的話,rst的地址就會當(dāng)成參數(shù)傳遞給這個絕對地址函數(shù),而
實(shí)際LJMP調(diào)用的地址并非rst的地址,而是一個不確定的地址。于是我按照自己的說法嘗試
了一下,看看匯編結(jié)果,還真的是將rst的地址傳遞給了R1 R2,而絕對函數(shù)最終LJMP到了
一個莫名其妙的地址上去了,死翹!

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



l         首先分析帖子的C語言代碼

第一句定義一個數(shù)組rst[],數(shù)組內(nèi)數(shù)據(jù)就是完成復(fù)位功能的匯編機(jī)器碼,具體對應(yīng)關(guān)系
為:clr a == 0xe4、push acc == 0xc0,0xe0、reti ==0x32

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

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

void (*p) ( )

當(dāng)把函數(shù)指針賦值后,就能通過函數(shù)指針調(diào)用函數(shù),調(diào)用形式如下,

      (*p) ( );

或等價的簡化形式:

p ( );

假設(shè)rst就是函數(shù)指針,則如下調(diào)用形式就可以令單片機(jī)復(fù)位再起。

(*rst ) ( );  

但可惜,rst不是函數(shù)指針,而是數(shù)組名,雖然兩者都是地址,但不可直接調(diào)用數(shù)組名。

如同把char型變量a賦值給int型變量b,(int) 表示強(qiáng)制類型轉(zhuǎn)換:

b = (int) a

函數(shù)指針的強(qiáng)制類型轉(zhuǎn)換公式如下(C語言的哲學(xué)是定義形式和使用一致):

(  (void (*)()  ) rst 

這樣經(jīng)過轉(zhuǎn)換后的rst就可以當(dāng)作函數(shù)指針使用了,簡單的調(diào)用形式如下:

#define  K     (  (void (*)( )  ) rst

(*K) ( )

或:

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

這樣的語句就完成復(fù)位再啟功能了。類型轉(zhuǎn)換符()的優(yōu)先級跟指針運(yùn)算符*的優(yōu)先級相同,
二者的結(jié)合方向是自右至左,所以上述語句就能完成復(fù)位功能了。保險起見有些程序員常
常喜歡再加個括號:

#define  K     (   (  (void (*)( )  ) rst   )

(*K) ( )



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



由于沒有輸入?yún)?shù),上述復(fù)位代碼更嚴(yán)謹(jǐn)?shù)膶懛ㄊ牵?nbsp;

#define  K     (   (  (void (*)(void )  ) rst   )

(*K) ( )



(     *(   (  void (*)(void )  )rst   )    ) ( );
[1] [2] [3]  下一頁
  • 上一篇: [轉(zhuǎn)載]一種新型光電定向系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
  • 下一篇: 8051的匯編控制指令,占用字節(jié),執(zhí)行周期列表
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1