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