胡瑞忠
(山西省電子工業(yè)科學(xué)研究所,山西 太原 030006)
為了適應(yīng)汽車級應(yīng)用環(huán)境,英飛凌單片機(jī)經(jīng)過了嚴(yán)格的、高于一般工業(yè)應(yīng)用的測試,確保了其在汽車電子設(shè)備中的可靠耐久的操作。特別是英飛凌功能強(qiáng)大和高度集成的XC2000 家族是英飛凌新一代16/32 位微控制器,特別為汽車嵌入式系統(tǒng)應(yīng)用精心設(shè)計[2]?;谏鲜鲈蛴w凌XC2000 系列單片機(jī)在汽車行業(yè)的應(yīng)用越來越廣泛。如何更好的學(xué)習(xí)和掌握英飛凌XC2000 單片機(jī)的編程技巧和方法,成為了許多項(xiàng)目工程師的首要任務(wù)。
從一個現(xiàn)有的英飛凌單片機(jī)應(yīng)用系統(tǒng)中讀出目標(biāo)代碼進(jìn)行反匯編,可以分析原程序的設(shè)計思想。同時,反匯編后,我們可以更快的學(xué)習(xí)和了解英飛凌單片機(jī)的編程原則和一些常規(guī)用法,也可更快捷的進(jìn)行逆向工程的設(shè)計和開發(fā)。本文將重點(diǎn)介紹一種針對XC2000 單片機(jī)的簡便快捷的反匯編方法。
XC2000 單片機(jī)的內(nèi)存空間是馮·諾以曼結(jié)構(gòu)[1],即數(shù)據(jù)和程序在同一個線性地址空間。該單片機(jī)的地址空間為16 MB。最大的外掛存儲空間為12 MB。該系列單片機(jī)多為Flash 結(jié)構(gòu)的內(nèi)部程序代碼存儲形式,F(xiàn)lash 存儲范圍從64 K~832 K。在一般的汽車電子產(chǎn)品的應(yīng)用中,片內(nèi)的Flash 已經(jīng)能夠滿足需求,不需要再外掛片外存儲器。
因此本文僅介紹片內(nèi)目標(biāo)代碼的獲取方式。XC2000 單片機(jī)的片上Flash 的起始地址為C00000H。
利用英飛凌XC2000 家族微控制器的免費(fèi)程序燒錄工具M(jìn)emtool 就可以完成目標(biāo)代碼的讀取。首先要把目標(biāo)單片機(jī)從產(chǎn)品的PCB 板焊下來,再將它重新焊接到英飛凌提供的XC2000 仿真調(diào)試板上(型號為Easy Kit XC2XXX)。隨后將調(diào)試板與計算機(jī)進(jìn)行正確連接。打開Memtool,按照XC2000 單片機(jī)的具體型號,按照正常燒錄程序的步驟設(shè)定該軟件。當(dāng)計算機(jī)與單片機(jī)建立通訊后,會出現(xiàn)界面如圖1所示。
圖1 Memtool 的界面
如果在“index”列有藍(lán)色的小鎖頭出現(xiàn),那該單片機(jī)已加密,無法讀取目標(biāo)代碼。如果沒有小鎖頭出現(xiàn),就點(diǎn)擊“Read”按鈕。然后根據(jù)單片機(jī)Flash 的容量和起始地址,設(shè)定讀取的地址范圍,開始讀取目標(biāo)代碼。讀取完后,點(diǎn)擊“Edit”,然后保存.H86 文件,目標(biāo)代碼讀取完成。
在獲得正確的目標(biāo)代碼后,進(jìn)行反匯編有2 種方式可供選擇。
1)如果代碼容量比較小,可以采用人工反匯編。XC2000 系列單片機(jī)的匯編指令在<<Instruction Set Manual—for the C166 Family of Infineon 16-Bit Single-Chip Microcontrollers >>一書中有詳細(xì)介紹。但在一般情況下,該方式僅用來訂正某一條有爭議的匯編指令,作為自動反匯編的一個補(bǔ)充。
2)一般的反匯編的步驟如下:
a)將英飛凌提供的XC2000 仿真調(diào)試板(型號為Easy Kit XC2XXX)與計算機(jī)進(jìn)行正確連接。仿真板上的單片機(jī)必須是與讀取目標(biāo)代碼時相同型號的單片機(jī),用Memtool 燒錄工具,將目標(biāo)代碼寫入。當(dāng)然如果不怕?lián)p壞,也可以直接用剛剛讀取代碼的單片機(jī)。
b)按照英飛凌XC2000 系列單片機(jī)的C 程序開發(fā)流程。先由數(shù)字應(yīng)用虛擬工程師DAvE 建立一個這種型號單片機(jī)的工程文件* .Dav[2]。再將DAvE 目標(biāo)工程文件* .dav 裝載到Keil 中,自動生成一個包含main{}函數(shù)和頭文件的C 工程文件* .prj。該工程可以是一個最簡工程,不必設(shè)置太多模塊。
c)如圖2 所示,設(shè)置好Keil 的Debug 調(diào)試器。并在“Flash Download Options”中正確添加該型號單片機(jī)的Flash地址范圍。將該工程正確編譯,但千萬不要“Load”編譯后的代碼。然后點(diǎn)擊“d”進(jìn)入Debug 調(diào)試界面。
圖2 debug 調(diào)試器的設(shè)置
d)在該debug 調(diào)試界面的“反匯編(Disassembly)”欄中,就顯示出了目標(biāo)代碼的匯編語言及Flash 單元地址和對應(yīng)的機(jī)器碼。匯編程序的起始地址為00C00000H,該存儲器為線性地址空間,結(jié)束地址可根據(jù)該單片機(jī)的Flash 容量計算得到。由于沒有給單片機(jī)“Load”本工程的文件,所以下方C 語言文件那一欄和反匯編欄的數(shù)據(jù)沒有關(guān)系。
圖3 debug 界面
e)將所有反匯編指令拷貝到EXCEL 文件中,仔細(xì)研讀。再將這些指令歸納為C 語言指令,重新寫回目標(biāo)工程中。這就實(shí)現(xiàn)了平常所說的逆向工程,同時還可以根據(jù)自己的控制思路,改善原有的程序,增加和改良一些系統(tǒng)功能。
綜上所訴,本文簡單介紹了汽車電子產(chǎn)品中一款主流單片機(jī)的反匯編過程。希望對研究和使用該款單片機(jī)的初級使用者,有一些幫助和提高。
[1]程軍.億恒(西門子)C166 系列——16 位單片機(jī)原理與開發(fā)[M].北京:北京航空航天大學(xué)出版社,2001.
[2]汽車嵌入式微控制器的工作原理與應(yīng)用——英飛凌XC2000 家族MCU[OL].www.infineon.com,2013-09.