intel hex檔案格式整理

2021-06-27 12:01:27 字數 1971 閱讀 2084

源於前幾天想擴充套件51微控制器的外部rom,網上能搜尋到的擴充套件方式都是將ea引腳接地,讓mcu上電後從外部rom開始執行。但檢視晶元手冊,明明說ea為高時,程式從片內rom執行,當執行到0x1000時(標準51微控制器),會跳轉到片外rom執行。按網上的做法,為了擴充套件個片外rom,片內的基本rom都不用了,有點浪費了,於是開始找資料如何從片內跳轉到片外,期間學習到intel hex檔案格式,因此在此記錄一下備忘。

接下來是我的整理:

keil c建立的工程,經過編譯連線生成乙個hex檔案,看名字總覺得是個16進製制檔案,憑感覺這個檔案裡至少包含指令啥的吧,那就用16進製制文字編輯器開啟看看是什麼:

假設原始碼是這樣的:

org  1000h

star:

mov  a,#0aah

mov  p1,a

mov a,#55h

mov  p1,a

sjmp star

end經過編譯後生成hex,參考了intel彙編指令的編碼,mov a,#0aah應該被編譯成74aa,檢視一下hex中有沒有這段內容

16進製制部分,完全沒找到74aa這段內容,再看下mov a,#55h對應的**7455,也沒找到!我擦,不能吧,沒這些內容,mcu怎麼執行?難道懷疑intel指令不對?人家大業大我們哪有資格懷疑,還是從自身檢查起吧。

第乙個連線的結尾部分(這麼重要的內容作者你居然放最後,夠了!)提到:

"hex檔案是用ascii來表示二進位制的數值,例如乙個8bit的二進位制數值0x3f,用ascii來表示就需要分別表示為字元『3』和字元『f』,每個字元需要乙個byte,所以hex檔案需要2倍的空間"

意思是,hex檔案本身存放的內容全是可見字元ascii,這些ascii碼中的0-9,a-f對應了16進製制中的各個數字;乙個位元組包含兩個16進製制數,因此,需要hex檔案中的兩個位元組的ascii碼表示乙個位元組機器碼。

回到上圖,來到偏移0x11-0x14處,37 34 35 35這四個ascii碼對應的字元是7455,好像就是mov a,#55h的編碼,再到偏移0x9-0x0c處37 34 41 41這四個ascii碼對應了74aa,正好是mov a,#0aah。好吧,好像有這麼回事了,再試試其他指令,p1口的位址是90h,偏移0x0d-0x11之間的46 35 39 30對應f590 正好是mov  p1,a的編碼。終於能解釋的通去哪找指令了----用winhex最右邊的可見字元部分檢視指令編碼。

解決乙個問題,新的問題又來了,keil生成的lst檔案包含了彙編指令的編碼,這些編碼共占用了10b,如圖:

1:        n      1000    org  1000h

2:      1000            star:

3:      1000    74 aa                mov  a,#0aah

4:      1002    f5 90            mov  p1,a

5:      1004    74 55            mov a,#55h

6:      1006    f5 90            mov  p1,a

7:      1008    80 f6                sjmp star

8:9:   

但是hex檔案中多了很多內容比如結尾部分的":00000001ff"以及開頭的":"這些又是哪來的?這時,可以查考連線2,3有比較詳細的解釋,他們闡述的檔案格式全是以可見字元為基礎展開,這裡我就不重複了。

連線中提到":llaaaatt[ddd...]cc",aaaa被解釋成位址域,位址域什麼作用呢?指明這段資料在rom中的位置,比如原始碼開頭 org 1000h指定**從rom位址0x1000h載入,經過編譯1000h被填入到aaaa的位置,也就說,aaaa是資料或者指令載入位置。在另一篇文章<51微控制器資源擴充套件:從片內rom跳轉到片外rom>中,我會修改hex檔案中的位址域,讓程式載入到指定位置。

Intel HEX 檔案格式

hex檔案作為微控制器常用的燒錄檔案形式,有必要進行進一步了解,特別是製作相應的bootloader時需要對其進行處理。intel hex 檔案是遵循 intel hex 檔案格式的 ascii 文字檔案。在 intel hex 檔案的每一行都包含了乙個 hex 記錄。這些記錄是由一些代表機器語言 ...

深究 INTEL HEX 檔案格式

什麼是intel hex 檔案格式 intel hex 檔案是遵循intel hex 檔案格式的ascii文字檔案。在intel hex 檔案的每一行都包含了乙個hex記錄。這些記錄是由一些代表機器語言 和常量的16進製制資料組成的。intel hex 檔案常用來傳輸要儲存在rom或者eprom中的...

Oracle 控制檔案格式ctl檔案格式

options skip 1,errors 10 load data characterset zhs16gbk infile into table table name truncate fields terminated by optionally enclosed by trailing nu...