2023.8.24
前へ
次へ
ホームページトップへ戻る


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第68回]



●HEXファイル比較データの検証

前回からの続きです。
PIC WRITER試作2号機でPIC18F13K50に書き込んだデータ(プログラム)を秋月のPICプログラマで読み出して作成したHEXファイルをもとのHEXファイルとWinMergeで比較したところ異なっているところがありました。
今回はその異なっているところの検証です。
下はその最初の部分です。

最初にこの部分を見たときは「なんじゃこりゃあ」と思ったのですが、落ち着いてよくよく見たところ左右のデータは同じであることがわかりました。
そのことについて説明する前にインテルヘキサファイルのレコードフォーマットについての説明が必要です。
各レコードは:(コロン)で始まります。
その次から数値が続きますがその数値は1バイトの16進数をASCII2文字で表したものです。
:に続く1バイトの数(ASCII2桁)はそのレコードのデータ数をバイト数で示しています。
その次の2バイト(ASCII4桁)はアドレスを示します(これはデータバイト数には含まれません)。
その次の1バイト(ASCII2桁)はそのレコードの属性を示します。
レコードの属性が00のときそのレコードは通常のアドレスとデータを含みます。
左側の2行目をそのルールに従って読んでみます。
04はバイト数です。
次の0000はアドレスが0000であることを示します。
次の00は通常のレコードであることを示しています。
その次からの4バイト(ASCII8桁)がデータです。
0CEF00F0です。
最後の11はこのレコードのチェックサムです。
このレコードはアドレス0000〜0003のデータが0CEF00F0であることを示しています。
今度は右側を見てみます。
最初の10はこのレコードに含まれるデータが16バイト(10H)であることを示しています。
次の0000はアドレスです。
その次の00は通常のレコードであることを示しています。
その次からがデータです。
0CEF00F0とここまで4バイトは左側と一致しています。
その次からのところは一旦置くことにして左側の3番目のレコードを見てみます。
アドレス0008〜000Bの4バイトのデータが10EF05F0であることを示しています。
左側ではアドレス0004〜0007がありません。
この間にはデータが無いことを示しています。
さてそこで右側に戻ります。
右側ではアドレス0004〜0007に相当するところの値はFFFFFFFFになっています。
フラッシュメモリで何も書き込まれていないところはFFです。
そしてその次には4バイトのデータ10EF05F0があってここは左側と同じです。
その次のアドレス000C〜000FはまたFFFFFFFFになっています。
右側の次の3レコード目もデータ数は16バイトになっていてアドレスは0010からになっています。
データはFFが8個続いていますからアドレス0010〜0017はデータがFFであることを示しています。
その次の7E6A7F6A8288EF0Eはアドレス0018〜001Fのデータです。
これは左側の4番目のレコードの内容と一致します。
左側ではアドレス000C〜0017が抜けてします。
その間はデータが無いことを示しています。
このように比較してみると2つのHEXファイルのこの部分はレコードの表示から見ると一見異なっているようですが実は同じであることがわかります。

同じ内容のはずなのになぜこのような違いが出てくるのでしょうか。
それは左側のHEXファイルがMPLABのPICアセンブラによってソースファイルをもとにして作成されたファイルであるのに対して右側のHEXファイルはPIC13K50に書き込まれた16進コードを読み出して作成されたHEXファイルだからです。
具体的に説明します。
こういうことです。
下はもとになったHEXファイルのアセンブルリストです。
                      00072 ;
000000                00073         org 00
000000 EF0C F000      00074         goto start
                      00075 ;
                      00076 ;
000008                00077         org 08
000008 EF10 F005      00078         goto int
                      00079 ;
000018                00080         org 18
000018                00081 start
000018 6A7E           00082         clrf ANSEL
00001A 6A7F           00083         clrf ANSELH
00001C 8882           00084         bsf PORTC,4;error off
00001E 0EEF           00085         movlw 0ef;rc4=out,ra4=out
000020 6E92           00086         movwf TRISA
                      00087         ;movlw 0e0;for test 2/7   *************************
000022 6E94           00088         movwf TRISC

左側にアドレスがあってその右側にマシン語コードがあります。
PICアセンブラのマシン語コードの表記はクセがあって16進数表記を1バイト単位ではなくて2バイトずつまとめて表記します。
たとえばアドレス0000〜0003の実際のメモリのデータは0C EF 00 F0なのですがそれがリストのように表記されます。
それはともかくとしてPICアセンブラはソースプログラムをもとにしてそれをマシン語コードに変換してHEXファイルを作成します。
ソースファイルに基いているために最初に4バイトのデータがあってそのあとのアドレス0004〜0007にはデータが無くてアドレス0008〜000Bに4バイトのデータがあってそしてその次のアドレス000C〜0017まではデータが無いというHEXファイルが作成されることになります。
一方そのプログラムを書き込んだPICからデータを読み出した場合確かにアドレス0004〜0007、000C〜0017はFFですが、それは「何も無い」のかそれとも「FFというデータ」なのか判断できません。
左側のファイルではその間は何も無いことは明白です。
しかし右側のファイルの場合ひょっとすると「その間はFFで埋める」という意味かも知れません。
ですから右側の場合にはFFを省略できませんからそれもデータに含めて扱うことになります。
2つのファイルの違いは多分ですがそういう違いがもとになっていると思います。
以上の考察によってこの部分については両者は同じ内容であるということが確認できました。

今回は時間がありませんのでここまでにします。
次回に続きます。

PICBASICコンパイラ[第68回]
2023.8.24upload

前へ
次へ
ホームページトップへ戻る