在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            C51軟復(fù)位分析

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

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

            main()

            {

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

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

            }

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

            clra

            pushacc

            pushacc

            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)該寫(xiě)成(*((void(*)())(rst)))()
            才對(duì)呀,結(jié)果他反駁說(shuō),那樣的話,rst的地址就會(huì)當(dāng)成參數(shù)傳遞給這個(gè)絕對(duì)地址函數(shù),而
            實(shí)際LJMP調(diào)用的地址并非rst的地址,而是一個(gè)不確定的地址。于是我按照自己的說(shuō)法嘗試
            了一下,看看匯編結(jié)果,還真的是將rst的地址傳遞給了R1R2,而絕對(duì)函數(shù)最終LJMP到了
            一個(gè)莫名其妙的地址上去了,死翹!

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

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

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

            第二句是一個(gè)函數(shù)指針的用法,函數(shù)指針用法稍微有點(diǎn)復(fù)雜,可參看本人著的書(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)用形式如下:

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

            (*K)()

            或:

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

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

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

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉