• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

            Blog @ Blog

            當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

            常用鏈接

            統計

            積分與排名

            BBS

            Blog

            Web

            最新評論

            什么是Intel HEX格式?

            Intel HEX文件是記錄文本行的ASCII文本文件,在Intel HEX文件中,每一行是一個HEX記錄由十六進制數組成的機器碼或者數據常量,Intel HEX文件經常被用于將程序或數據傳輸存儲到ROM.EPROM,大多數編程器和模擬器使用Intel HEX文件.

            記錄格式

            一個Intel HEX文件可以包含任意多的十六進制記錄,每條記錄有五個域,下面是一個記錄的格式.

            :llaaaatt[dd...]cc

            每一組字母是獨立的一域,每一個字母是一個十六進制數字,每一域至少由兩個十六進制數字組成,下面是字節的描述.

            :冒號     是每一條Intel HEX記錄的開始

            ll 是這條記錄的長度域,他表示數據(dd)的字節數目.

            aaaa 是地址域,他表示數據的起始地址<如果是數據記錄,這表示將要燒錄的這條記錄中的數據在EPROM中的偏移地址,對于不支持擴展段地址和擴展線性地址的,如89C51,這就是此條記錄的起始地址>

            tt 這個域表示這條HEX記錄的類型,他有可能是下面這幾種類型
            00 ----數據記錄      
            01 ----文件結束記錄
            02 ----擴展段地址記錄
            04 ----擴展線性地址記錄

            dd   是數據域,表示一個字節的數據,一個記錄可能有多個數據字節,字節數目可以查看ll域的說明

            cc   是效驗和域,表示記錄的效驗和,計算方法是將本條記錄冒號開始的所有字母對<不包括本效驗字和冒號> 所表示的十六進制數字<一對字母表示一個十六進制數,這樣的一個十六進制數為一個字節>都加起來然后模除256得到的余數最后求出余數的補碼即是本效驗字節cc.
            <例如:
            :0300000002005E9D
            cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x9C=0x9D

            C語言描述:
            UCHAR cc;
            cc=(UCHAR)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5E);
            cc++;
            >
            數據記錄

            Intel HEX文件由若干個數據記錄組成,一個數據記錄以一個回車和一個換行結束
            <回車為0x0d換行為0x0a>

            比如下面的一條數據記錄
            :10246200464C5549442050524F46494C4500464C33

            10   是此行記錄數據的字節數目
            2462   是數據在內存<將要燒寫的eprom地址>中的起始地址
            00     是記錄類型00(是一個數據記錄)
            464C 到 464C 是數據
            33   是此行記錄的效驗和

            擴展線性地址記錄(HEX386)
            擴展線性地址記錄也可稱為 32位地址記錄   和   HEX386記錄,這個紀錄包含高16(16-31位)位數據地址,這種擴展的線性記錄總是有兩個字節數據,像下面這樣:

            :02000004FFFFFC
            02     是記錄的數據字節數目
            0000   是地址域這在擴展地址記錄中總是0000
            04     是記錄類型04(擴展地址記錄)
            FFFF   是高16位地址
            FC     是記錄效驗和,計算方法如下:
                    01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)

            當一個擴展線性地址記錄被讀到后,擴展線性地址記錄的數據區域將被保存并應用到后面從Intel HEX文件中讀出的記錄,這個擴展線性記錄一直有效,直到讀到下一個擴展線性記錄.


            絕對內存地址 = 數據記錄中的地址 + 移位后的擴展線性地址


            下面舉例說明這個過程

            從數據記錄的地址域得到地址           2462
            從擴展線性地址記錄的地址域得到地址   FFFF
            絕對內存地址                           FFFF2462

            擴展段地址記錄 (HEX86)

            擴展段地址記錄也被稱為 HEX86記錄,   包含 4-19位的數據地址段,
            這個擴展段地址記錄總是有兩字節數據,如下:

            :020000021200EA
            02 是     記錄中的數據字節數目
            0000           是地址域,在擴展段地址記錄中,這個域總是0000
            02           是記錄類型02(擴展段地址的標示)
            1200     是該段的地址
            EA     是效驗和
            計算如下:
            01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).

            當擴展段地址記錄被讀后,擴展段地址將被存儲并應用到以后從Intel HEX文件讀出的記錄,這個段地址一直有效直到讀到下一個擴展段地址記錄

            絕對內存地址 = 數據記錄中的地址 + 移位后的擴展段地址

            數據記錄中的地址域       移位后擴展段地址記錄中的地址域

            下面舉例說明這個過程

            從數據記錄的地址域得到地址                   2 4 6 2
            從擴展段地址記錄的地址域得到地址           1 2 0 0
            絕對內存地址                         0 0 0 1 4 4 6 2

            文件結束記錄(EOF)
            一個Intel HEX文件必須有一個文件結束記錄,這個記錄的類型域必須是01,
            一個EOF記錄總是這樣:
            :00000001FF
            00是記錄中數據字節的數目
            0000這個地址對于EOF記錄來說無任何意義
            01記錄類型是01(文件結束記錄標示)
            FF是效驗和計算如下
            01h + NOT(00h + 00h + 00h + 01h).
            ========================
            總結


            形如
            :BBAAAATTHHHH...HHHHCC

            BB: Byte
            AAAA:數據記錄的開始地址,高位在前,地位在后
                  因為這個格式只支持8bits,地址被倍乘
                  所以,為了得到實際的PIC的地址,需要將 地址除以2
            TT: Type
                    00 數據記錄
                    01 記錄結束
                    04 擴展地址記錄(表示32位地址的前綴,當然這種只能在 INHX32)
            HHHH:一個字(Word)的數據記錄,高Byte在前,低Byte在后
                  TT之后,總共有 BB/2 個字 的數據
            CC: 一個Byte的CheckSum


            因為PIC16F873A只有4K的程序空間

            所以,不會有 TT=04的 Linear Address Record

            posted on 2007-12-20 14:12 isabc 閱讀(1554) 評論(1)  編輯 收藏 引用

            評論

            # re: 什么是Intel HEX格式? 2007-12-21 17:04 Lee7

            HEX文件和BIN文件是我們經常碰到的2種文件格式。下面簡單介紹一下這2種文件格式的區別:


            1 - HEX文件是包括地址信息的,而BIN文件格式只包括了數據本身
            在燒寫或下載HEX文件的時候,一般都不需要用戶指定地址,因為HEX文件內部的信息已經包括了地址。而燒寫BIN
            文件的時候,用戶是一定需要指定地址信息的。


            3 - BIN文件格式
            對二進制文件而言,其實沒有”格式”。文件只是包括了純粹的二進制數據。


            4 - HEX文件格式
            HEX文件都是由記錄(RECORD)組成的。在HEX文件里面,每一行代表一個記錄。記錄的基本格式為:
            +---------------------------------------------------------------+
            | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM |
            | MARK ':' | | OFFSET | | | |
            +---------------------------------------------------------------+
            | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte |
            +---------------------------------------------------------------+

            記錄類型包括:
            '00' Data Rrecord:用來記錄數據,HEX文件的大部分記錄都是數據記錄
            '01' End of File Record: 用來標識文件結束,放在文件的最后,標識HEX文件的結尾
            '04' Extended Linear Address Record: 用來標識擴展線性地址的記錄
            '02' Extended Segment Address Record: 用來標識擴展段地址的記錄

            在上面的后2種記錄,都是用來提供地址信息的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個“基”地址。
            對于后面的數據記錄,計算地址的時候,都是以這些“基”地址為基礎的。

            數據記錄的具體格式:
            +---------------------------------------------------------------+
            | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM |
            | MARK ':' | | OFFSET | '00' | | |
            +---------------------------------------------------------------+
            | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte |
            +---------------------------------------------------------------+

            看個例子:
            :020000040000FA
            :10000400FF00A0E314209FE5001092E5011092E5A3
            :00000001FF

            對上面的HEX文件進行分析:
            第1條記錄的長度為02,LOAD OFFSET為0000,RECTYPE為04,說明該記錄為擴展段地址記錄。數據為0000,校驗和為
            FA。從這個記錄的長度和數據,我們可以計算出一個基地址,這個地址為0X0000。后面的數據記錄都以這個地址為基
            地址。
            第2條記錄的長度為10(16),LOAD OFFSET為0004,RECTYPE為00,說明該記錄為數據記錄。
            數據為FF00A0E314209FE5001092E5011092E5,共16個BYTE。這個記錄的校驗和為A3。此時的基地址為0X0000,加上OFFSET,
            這個記錄里的16BYTE的數據的起始地址就是0x0000 + 0x0004 = 0x0004.
            第3條記錄的長度為00,LOAD OFFSET為0000,TYPE = 01,校驗和為FF。說明這個是一個END OF FILE RECORD,標識
            文件的結尾。

            在上面這個例子里,實際的數據只有16個BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址為0x4


            4 - HEX文件和BIN文件大小有區別
            HEX文件是用ASCII來表示二進制的數值。例如一般8-BIT的二進制數值0x3F,用ASCII來表示就需要分別表示字符'3'
            和字符'F',每個字符需要一個BYTE,所以HEX文件需要 > 2倍的空間。
            對一個BIN文件而言,你查看文件的大小就可以知道文件包括的數據的實際大小。而對HEX文件而言,你看到的文件
            大小并不是實際的數據的大小。一是因為HEX文件是用ASCII來表示數據,二是因為HEX文件本身還包括別的附加信息。


            要想詳細了解HEX文件格式,請GOOGLE INTEL HEX,就能找到詳細的PDF文檔。
              回復  更多評論   

            廣告信息(免費廣告聯系)

            中文版MSDN:
            歡迎體驗

            思思久久99热只有频精品66| 久久精品国产一区二区电影| 久久成人国产精品二三区| 国产69精品久久久久久人妻精品| 婷婷久久综合九色综合九七| 久久精品无码一区二区app| 久久久久亚洲精品男人的天堂| 久久精品无码一区二区三区免费| 亚洲国产成人精品女人久久久| 狠狠色噜噜色狠狠狠综合久久 | 久久久久久久久久久| 亚洲国产精品无码久久久不卡 | 久久免费观看视频| 中文精品久久久久人妻不卡| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 久久精品www人人爽人人| 国产福利电影一区二区三区久久老子无码午夜伦不| 久久精品国产一区二区电影| 久久丝袜精品中文字幕| 久久久久久国产精品免费无码| 伊人久久大香线焦综合四虎| 精品无码久久久久久久久久| 久久中文精品无码中文字幕| 99久久这里只精品国产免费| 亚洲精品无码久久久影院相关影片 | 亚洲日韩欧美一区久久久久我| 波多野结衣AV无码久久一区| 国产精品美女久久久久网| 久久夜色精品国产www| 久久精品一本到99热免费| 久久精品国产精品亜洲毛片| 久久久久青草线蕉综合超碰| 国产精品久久久久久久久鸭 | 久久国产热这里只有精品| 青青草原精品99久久精品66| 青青青国产精品国产精品久久久久| 久久久久久久免费视频| 久久精品国产一区二区电影| 久久亚洲精品国产精品| 亚洲精品国精品久久99热一| 久久www免费人成精品香蕉|