https://m.toutiao.com/is/etkYYex/
圖1
圖2
(1)每行都是以冒號(hào)開(kāi)始,這只是一個(gè)規(guī)范格式。
(2)第1行:02表示這一行有兩個(gè)字節(jié)的數(shù)據(jù),0800是真正的數(shù)據(jù),0000表示本行數(shù)據(jù)的起始地址,04相當(dāng)于一個(gè)功能碼,表示設(shè)定偏移地址,就是0x0800左移16位變成0x08000000,表示存儲(chǔ)代碼的起始地址,F(xiàn)2是校驗(yàn)位,校驗(yàn)位=0x100-(這一行校驗(yàn)位之前所有數(shù)之和),就是一個(gè)公式,所有行的校驗(yàn)方式是一樣的。
(3)第2行:10表示這一行有16個(gè)字節(jié)的數(shù)據(jù),0000表示存儲(chǔ)的其實(shí)地址,實(shí)際上是0x08000000,后面的00也是一個(gè)功能碼,表示這一行是存數(shù)據(jù)的,就是程序代碼的一部分,緊跟著16個(gè)字節(jié)的數(shù)據(jù),然后是校驗(yàn)位。
(4)倒數(shù)第3行,跟第2行其實(shí)是一樣的,只不過(guò)數(shù)據(jù)到了最后,沒(méi)有16字節(jié)了,只有12個(gè)字節(jié)。
(5)倒數(shù)第2行,04表示有4個(gè)字節(jié)的數(shù)據(jù),0000表示本行數(shù)據(jù)的起始地址,05是一個(gè)功能碼,表示程序開(kāi)始運(yùn)行的地址,就是main函數(shù)的入口,本例中入口地址在:0x080000ED,最后是校驗(yàn)位。
(6)倒數(shù)第1行,00表示這一行無(wú)實(shí)際數(shù)據(jù),0000表示本行數(shù)據(jù)的起始地址,01是一個(gè)功能碼,表示hex文件結(jié)束,即最后一行,F(xiàn)F是校驗(yàn)位。
總結(jié)hex文件每一行的結(jié)構(gòu)就是:【數(shù)據(jù)字節(jié)數(shù)】【本行起始地址】【功能碼】【數(shù)據(jù)】【校驗(yàn)位】,其實(shí)也并不復(fù)雜。本文是按照一個(gè)實(shí)際的hex文件來(lái)分析的,不同程序編譯出來(lái)的hex文件會(huì)略有不同,功能碼還有02和03兩種,這里沒(méi)有涉及,不做描述。從以上分析可以看出,hex文件中不僅僅包含程序代碼的數(shù)據(jù),還包含其他的一些標(biāo)示信息,因此,hex文件的大小不等同于程序代碼的實(shí)際大小。
Hex文件的神秘面紗是不是已經(jīng)被我們揭開(kāi)了?
單片機(jī)、ARM、現(xiàn)場(chǎng)總線(xiàn)、PLC、嵌入式軟硬件的設(shè)計(jì)經(jīng)驗(yàn)分享,秉承“點(diǎn)點(diǎn)滴滴皆智慧”的理念,以實(shí)際項(xiàng)目為單元闡述知識(shí)點(diǎn),一起分享,共同交流。
聯(lián)系客服