HEX文件格式分析 - 適用MPLAB

概要

.HEX文件是MPLAB生成的一種可執行文件的格式,它本身是由ASCII字符
組成的,但其包含16進制的可執行代碼的信息,也就是說,這類文件描述
在程序存儲器的哪個單元放入什麼指令。

.HEX文件的種類

MPLAB可以生成3種不同格式的可執行文件。其中兩種是.HEX文件,它們分別
稱爲INHX8M格式(Intel Hex Format)和INHX32格式(Intel Hex 32 Format);
另外一種稱爲INHX8S格式(Intel Split Hex Format),這種格式會同時
生成.HXL和.HXH文件,兩個文件分別存放指令數據的低字節和高字節。

這裏只討論兩種.HEX文件。MPLAB內嵌的連接器MPLINK在默認情況下生成INHX32
格式的.HEX文件,也可以使用/aINHX8M選項指定生成INHX8M格式的.HEX文件。

我們的燒寫器應該能支持這兩種格式的.HEX文件。

INHX32格式的.HEX文件

一個INHX32格式的.HEX文件是由若干個形式相同的行構成的。

行的種類

對於最多隻有8K字程序空間的PIC16F87X單片機而言,相應的.HEX文件只有3種
不同的行:線性地址定位行,代碼數據行,結尾標誌行。一個.HEX文件的第1行
是一個線性地址定位行,後面接着是若干個代碼數據行,最後一行是結尾標誌
行。
線性地址定位行僅僅對超過32K字代碼的程序有用。實際上,INHX32格式與
INHX8M格式的不同之處就在於它能表示超過32K字代碼的程序。線性地址
定位行中指定指令存放地址的高16位,而低16位由代碼數據行中的“AAAA”部分
指定。“AAAA”表示指令存放地址的2倍,所以最多能表示32K字的指令,而
PIC16F87X單片機最多隻有8K字程序空間,故不需要用到指令地址的高16位,
因此.HEX文件的線性地址定位行指定的指令地址的
高16位總爲“0000”。

代碼數據行指定一段連續存放的代碼的起始存放地址和代碼值。通常一行中
最多有16條語句的代碼。

結尾標誌行標誌整個文件的結束。
 

行的格式

一個INHX32格式的.HEX文件的每一行都是下面這種格式:
:BBAAAATTHHHH....HHHHCC
即開始是9個字符組成的前綴“:BBAAAATT”,加上若干個4字符的“HHHH”
數據,結尾是2個字符的校驗字“CC”。這裏所說的“字符”是指組成文件
的ASCII字符,而一個16進制“字節”必須用兩個“字符”表示。
各個部分的意義是:
: 一行的開始符。
BB 數據部分的字節數,即“HHHH”部分的字節數。
AAAA 代碼開始存放的地址的2倍。僅在代碼數據行中有意義,在其餘兩種類型的
行中這一部分爲“0000”。
TT 行的類型。
          00    代碼數據行
          01    結尾標誌行
          02    段地址定位行(PIC16F87X單片機的.HEX文件中沒有用到)   
          04    線性地址定位行
HHHH 在代碼數據行中,表示一條14-bit的指令代碼,其中低字節在前,高字節
在後,比如“movlw 0xaa”這條指令對應的代碼是30AA,相應的HHHH表示爲AA30;
在結尾標誌行中,沒有這一部分;在線性地址定位行中,這一部分爲指令存放地
址的高16位。
CC 校驗字。校驗規則是,本行中前面所有的字節(兩個字符)表示的16進制數
相加,再加上CC表示的16進制數,所得的和必須是256的整數倍,即用16進製表示
時末尾兩位都爲0。

示例

下面是一個簡單的程序的彙編語句及對應的可執行代碼。
地址     代碼   彙編解析        源程序
-------  -----  -----------     ---------------------
                                org   0x0000
000000   2810   GOTO  0x10      goto  main
                                org   0x0004
000004   2818   GOTO  0x18      goto  int_serv

                                org   0x0010
                                main
000010   1683   BSF   0x3,0x5   bsf   STATUS, RP0
000011   1303   BCF   0x3,0x6   bcf   STATUS, RP1
000012   0188   CLRF  0x8       clrf  TRISD
000013   1283   BCF   0x3,0x5   bcf   STATUS, RP0
000014   0188   CLRF  0x8       clrf  PORTD
000015   160b   BSF   0xb,0x4   bsf   INTCON, INTE
000016   178b   BSF   0xb,0x7   bsf   INTCON, GIE
                                stop
000017   2817   GOTO  0x17      goto  stop

                                int_serv
000018   30ff   MOVLW 0xff      movlw 0xff
000019   0088   MOVWF 0x8       movwf PORTD
00001a   0009   RETFIE          retfie
                                END
它對應的INHX32格式的.HEX文件如下:
:020000040000FA                                         (1)
:020000001028C6                                         (2)
:020008001828B6                                         (3)
:04000A00003400348A                                     (4)
:10002000831603138801831288010B168B17172878             (5)
:06003000FF30880009000A                                 (6)
:00000001FF                                             (7)
第(1)行是線性地址定位行。第(2)行至第(6)行是代碼數據行。
第(7)行是結尾標誌行。

INHX8M格式的.HEX文件

對PIC16F87X單片機而言,INHX8M格式的.HEX文件與INHX32格式的.HEX文件
只有一點不同,就是INHX8M格式的.HEX文件沒有線性地址定位行。以下是
上一節所示的源程序對應的INHX8M格式的.HEX文件。
:020000001028C6                                         (1)
:020008001828B6                                         (2)
:04000A00003400348A                                     (3)
:10002000831603138801831288010B168B17172878             (4)
:06003000FF30880009000A                                 (5)
:00000001FF                                             (6)
可見這個文件就是前面INHX32格式的.HEX文件的(2)至(7)行。本文件中的
(1)至(5)行是代碼數據行,第(6)行是結尾標誌行。
 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章