• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 0  文章 - 0  trackbacks - 0
            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿

            文章檔案(4)

            c 相關(guān)

            friends

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 782
            • 排名 - 2475

            最新隨筆

            最新評(píng)論

            c51軟復(fù)位,經(jīng)典,分析透徹

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

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


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

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

            現(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)用

            }

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

            clr a

            push acc

            push acc

            reti

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

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

            看來(lái)C真是一匹不容易駕馭的野馬,這個(gè)大三學(xué)生理解力在我之上,我30多歲的人了,干了
            這么多年還沒(méi)他的境界呢,唉,人家才學(xué)了幾天啊,翻了幾天書(shū)就這么厲害了,服了
            定義一個(gè)返回值是空函數(shù)指針的定義形式如下:

            void (*p) ( )

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

            ??????(*p) ( );

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

            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語(yǔ)言的哲學(xué)是定義形式和使用一致):

            (??(void (*)()??) rst

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

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

            (*K) ( )

            或:

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

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

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

            (*K) ( )



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

            posted on 2006-10-26 20:33 天性如此 閱讀(130) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            岛国搬运www久久| 国产精品久久久久久久久| 久久久久久毛片免费看| 久久久久国产一区二区三区| 久久天天躁狠狠躁夜夜2020老熟妇 | 欧美久久精品一级c片片| 狠狠久久综合伊人不卡| 久久只这里是精品66| 一本色道久久88综合日韩精品 | 日韩中文久久| 人妻久久久一区二区三区| 99久久中文字幕| 久久久久一本毛久久久| 国产精品禁18久久久夂久| 精品久久久久久无码人妻蜜桃| 久久久久高潮综合影院| 韩国三级中文字幕hd久久精品| 欧美激情一区二区久久久| 国产成人99久久亚洲综合精品| 久久精品国产免费观看 | 久久99久久无码毛片一区二区| 久久精品国产清自在天天线| 日韩乱码人妻无码中文字幕久久| 亚洲∧v久久久无码精品| 久久精品国产精品亜洲毛片| 久久人妻少妇嫩草AV无码专区| A级毛片无码久久精品免费| 午夜精品久久久久久| 精品久久久久久无码中文字幕一区 | 青青草原综合久久大伊人导航 | 国内精品久久久久久久97牛牛| 久久久久久曰本AV免费免费| www亚洲欲色成人久久精品| 丁香五月网久久综合| 无码人妻精品一区二区三区久久久 | 国产精品美女久久久免费| 77777亚洲午夜久久多喷| 亚洲午夜久久久影院| 久久精品成人欧美大片| 伊人色综合九久久天天蜜桃| 无码任你躁久久久久久久|