? ? 關(guān)注、星標(biāo)公眾號,直達(dá)精彩內(nèi)容
? ? ? ?如何實現(xiàn)單片機(jī)程序代碼的反匯編-要進(jìn)行目標(biāo)代碼的變換,首先必須根據(jù)硬件畫出實際的地址和數(shù)據(jù)的接線圖,然后借助于工具軟件進(jìn)行變換。在“51匯編集成開發(fā)環(huán)境”(其下載網(wǎng)址為www1.skycn.com/SOFt/15074/html)中,提供了一個變換工具,從軟件界面的[輔助工具]—[目標(biāo)代碼轉(zhuǎn)換]-[bin代碼還原]就可以啟動這個工具。
要正確獲取程序的方針代碼,首要要清晰程序代碼的寄存地址。51單片機(jī)的程序存儲器最大空間為64KB,在一個實踐的運用體系中,程序存儲器的散布狀況可能有以下幾種:
(1)只運用了片內(nèi)程序空間。而沒有運用片外的程序空間。
其硬件特征為:/EA引腳接VCC;/PSEN引腳為空腳。
這種狀況比較簡單,悉數(shù)運用程序都在單片機(jī)內(nèi)部的程序存儲器中,咱們只需運用編程器將程序代碼讀出來,保存為一個方針代碼文件就能夠了。要留意的是,有一些新式的單片機(jī)具有加密功用,假如進(jìn)行了加密,其間的程序代碼便是不能讀出。
(2)沒有運用片內(nèi)程序空間,片外程序空間由單個存儲芯片構(gòu)成。
其硬件特征為:/EA引腳接GND;/PSEN引腳接到一個存儲芯片上。
這種狀況下,悉數(shù)運用程序都在單片機(jī)外部的程序存儲器中, 原則上咱們只需運用編程器將程序代碼讀出來,保存為一個方針代碼文件就能夠了。但要留意的是,這樣得到的并不一定是真實的方針代碼,由于,為了避免程序代 碼被讀取、反匯編,許多規(guī)劃人員都采納跳接線的辦法,將某些地址線跳接或?qū)⒛承?shù)據(jù)線跳接或?qū)⒌刂肪€、數(shù)據(jù)線都進(jìn)行跳接,然后維護(hù)自己的程序不被反匯編 (參見圖1~圖4)。這樣一來,咱們從存儲器中讀取的就不是真實的程序方針代碼,有必要進(jìn)行某種改換,將其轉(zhuǎn)化為真實的程序方針代碼,才干進(jìn)行反匯編。
要進(jìn)行方針代碼的改換,首要有必要依據(jù)硬件畫出實踐的地址和數(shù)據(jù)的接線圖,然后借助于東西軟件進(jìn)行改換。在“51匯編集成開發(fā)環(huán)境”(其下載網(wǎng)址為www1.skycn.com/SOFt/15074/html)中,供給了一個改換東西,從軟件界面的[輔助東西]—[方針代碼轉(zhuǎn)化]-[bin代碼復(fù)原]就能夠發(fā)動這個東西。
單擊[閱讀]能夠挑選要轉(zhuǎn)化的代碼文件,留意:這兒的代碼文件只能是二進(jìn)制代碼文件,即bin文件,假如你經(jīng)過編程器讀取后保存的文件不是bin文件,就 需求先將其轉(zhuǎn)化為bin文件,在“51匯編集成開發(fā)環(huán)境”的[輔助東西]-[方針代碼轉(zhuǎn)化]菜單下,有相應(yīng)的轉(zhuǎn)化東西。
單擊[另存為]能夠挑選轉(zhuǎn)化成果的寄存地址和文件名,轉(zhuǎn)化成果也一定是bin文件。
再依據(jù)實踐的地址、數(shù)據(jù)的接線圖,來挑選地址線跳接、數(shù)據(jù)線跳接,設(shè)置其接線表,然后單擊[復(fù)原]即完結(jié)了代碼的改換。
(3)沒有運用片內(nèi)程序空間,片外程序空間由多個存儲芯片構(gòu)成 其硬件特征為:/EA引腳接GND;/PSEN引腳接到了幾個存儲芯片上。
這種狀況下,悉數(shù)運用程序在單片機(jī)外部的多個存儲芯片中,咱們首要需求運用編程器將每一個存儲芯片上的程序代碼讀出來,別離保存為一個方針代碼文件,然后將它們兼并為一個文件。
在讀取存儲芯片上的程序代碼時,要留意檢查硬件接線有無跳接線,假如有跳接線,有必要進(jìn)行代碼的改換。
在兼并程序代碼時,要留意每一個存儲芯片的地址規(guī)模,有必要按地址銜接,才干得到真實的方針代碼文件。在“51匯編集成開發(fā)環(huán)境”中,從[輔助東西][方針代碼轉(zhuǎn)化]-[bin代碼兼并]能夠發(fā)動兼并東西。單擊[閱讀]能夠挑選要兼并的兩個代碼文件,留意:第一個代碼文件有必要是從0地址開端的文件,單擊
[另存為]能夠挑選兼并后的文件寄存地址和文件名,然后單擊[開端]即完結(jié)了代碼的兼并。
若挑選直接銜接,則第二個代碼文件將緊接著第一個文件后銜接;若挑選按地址銜接,則第二個代碼文件將從指定的地址開端銜接。假如兩個代碼文件之間有空字 節(jié),則將填充為“00H”或“FFH”;假如兩個代碼文件在空間上有堆疊,則將得到提示:“地址空間存在重合現(xiàn)象,不能正常兼并!”。
(4)既運用了片內(nèi)程序空間,也運用片外的程序空間,其硬件特征為:/EA引腳接VCC;/PSEN引腳接到一個存儲芯片或幾個存儲芯片上。
在這種狀況下,悉數(shù)運用程序散布在單片機(jī)內(nèi)部的程序存儲器和外部的多個存儲芯片中,獲取程序代碼的根本辦法同(3)。
這兒要留意的是,片外程序存儲器的 地址規(guī)模應(yīng)該在1000H~FFFFH之間,假如某一片程序存儲器的地址是從0000H開端的,那么其0000H~0FFFH之間的代碼是無效的,有必要將 其去除。借助于“51匯編集成開發(fā)環(huán)境”的[輔助東西]-[方針代碼轉(zhuǎn)化]菜單下的[bin代碼拆分],能夠完結(jié)這一 作業(yè)。
單擊[閱讀]能夠挑選要轉(zhuǎn)化的代碼文件,再挑選片內(nèi)ROM空間為4KB,然后單擊[開端]即可。
要想成功進(jìn)行反匯編,還有必要有一個好的反匯編東西。在“51匯編集成開發(fā)環(huán)境”中集成有一個反匯編東西。該東西現(xiàn)在不支持對非0地址開端的部分代碼 進(jìn)行反匯編,由于非O地址開端的部分代碼無法區(qū)別程序和數(shù)據(jù),可是關(guān)于從O地址開端的悉數(shù)或部分代碼的反匯編作用較好,能夠智能分段、自動地別離出程序和 數(shù)據(jù),使取得的源程序具有較好的可讀性。
從軟件界面的[編譯]-[反匯編]-[MCS-51反匯編]能夠發(fā)動這個東西
處理。要進(jìn)行反匯編有必要按以下過程進(jìn)行:
(1)借助于編程器別離從單片機(jī)和28C64中讀取代碼,保存為兩個
文件。其間,從單片機(jī)中讀取的文件名為CODE0.bin;從28C64中
讀取的文件名為CODE1.bin。
(2)用“51匯編集成開發(fā)環(huán)境”中的[bin代碼復(fù)原],將從28C64中讀取的文件CODE1.bin轉(zhuǎn)化為真實的程 序代碼,保存為文件CODE2.bin。
(3)用“51匯編集成開發(fā)環(huán)境”中的[bin代碼兼并],將CODE0.bin和CODE2.bin兼并為一個文件CODE3.bin.
(4)用“51匯編集成開發(fā)環(huán)境”中的[MCS51反匯編],對CODE3.bin進(jìn)行反匯編,得到的源程序文件保存為CODE.ASM。
至此,反匯編成功。
版權(quán)聲明:本文來源網(wǎng)絡(luò),免費傳達(dá)知識,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進(jìn)行刪除。
???????????????? ?END ????????????????
關(guān)注我的微信公眾號,回復(fù)“星球”加入知識星球,有問必答。
點擊“閱讀原文”查看知識星球詳情,歡迎點分享、收藏、點贊、在看。