HEX文件的每一行都是這樣的格式:
Intel hex 由一條或多條記錄組成,每條記錄都由一個冒號“:”打頭,其格式如下:
:CCAAAARR...ZZ
其中:
CC
本條記錄中的數據字節數
AAAA
本條記錄中的數據在存儲區中的起始地址
RR
記錄類型:
00 數據記錄 (data record)
01 結束記錄 (end record)
02 段記錄 (paragraph record)
03 轉移地址記錄 (transfer address record)
...
數據域
ZZ
數據域校驗和
Intel hex文件記錄中的數字都是16進制格式,兩個16進制數字代表一個字節。CC域是數據域中的實際字節數,地址、記錄類型和校驗和域沒有計算在內。校驗和是取記錄中從數據字節計數域(CC)到數據域(...)最後一個字節的所有字節總和的2的補碼。
而Bin文件是最純粹的二進制機器代碼,沒有格式,或者說是"順序格式"按assembly code順序翻譯成binary machine code.由於分析出來Hex文件中的數據域ASCII碼錶示的十六進制與二進制一一對應,而且我公司DSP又是16位的,以一個word爲最小單位,所以四個十六進制ASCII碼代表一條機器指令單位或者地址.借於上面分析,編寫了工具代碼.大體原理是用fscanf函數在每行的數據域讀入四個ASCII碼,以短整形(short
int 16bit)形式儲存,在把這個短整形變量順序fwrite到文件流中去即可.
舉一例說明:
表1
ORG 0000H
LJMP START
ORG 040H
START:
MOV SP,#5FH ;設堆棧
LOOP:
NOP
LJMP LOOP ;循環
END ;結束
表2
:03000000020040BB
:0700400075815F000200431F
表3
02 00 40 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF 75 81 5F 00 02 00 43
表1爲源程序,表2是彙編後得到的HEX文件,表3是由HEX文件轉換成的目標文件,也就是最終寫入EPROM的文件,它由編程器轉換得到,也可以由HEXBIN一類的程序轉換得到。學過手工彙編者應當不難找出表3與表1的一一對應關係,值得注意的是從02 00 40後開始的一長串‘FF’,直到75 81,這是由於僞指令:ORG
040H造成的結果。