インターネット&PC120%活用:PC編

DUMPプログラム(HEXDUMP)の作成 企画編

アセンブラで実用的なプログラムを作成してみたいと思います。
まず、実用的なものとしては一番簡単なダンププログラムを作成してみましょう。
Windows(DOS窓)では dump コマンドが使えない(dump.exeがない)ので、多少不便を
感じます。そこで、かつてのMS-DOSのdumpよりちょっとだけ機能拡張したものにしたいと
思います。名前はHexdumpとしましょう。

*Hexdumpのダウンロード(ソースファイルHexdump.asm+実行ファイルHexdump.com)
hexdump.lzh

1.  仕様について
Hexdumpの仕様は以下のようにします。

1) 起動
DOS(DOS窓、MS-DOS他)上で、以下のように指定したファイル(filename)をダンプします。
A> hexdump filename

2) コマンド
-D
16進数でダンプ表示します。
ダンプ中に以下のキーを押すことにより以下のサブコマンドが使えます。
1 ダンプ一時中断    2 再開       3 終了

-C
検索したいデータの指定。
例えば、5F(16進数)というデータを検索したい時は、-C5Fのように指定します。
指定されたデータは、赤字で表示されます。
ここが、MS-DOSのdumpよりほんのちょっとだけ拡張した機能です。

-Q
プログラムを終了します。


実行例を掲載しておきます。
&H1B(エスケープシーケンス機能コード)を検索して赤字で表示させてみました。


A:\>hexdump hexdump.com
HEXDUMP ver0.1 <
制作 河西 毅>
コマンド
D バイナリーダンプ 以下のサブコマンドがあります
1 中断 2 再開 3 終了
Q HEXDUMP終了
C バイナリデータ検索 指定したデータが赤色で表示。 指定例)C38, C7E
全て大文字で指定して下さい

-C1B
-D

   <<中間略>>

02 C0 :EC 20 20 89 CD 90 BC 20 20 8B 42 3E 0D 0A 83 52 河西 毅>..
02 D0 :83 7D 83 93 83 68 0D 0A 44 20 20 83 6F 83 43 83 マンド..D バイナ
02 E0 :69 83 8A 81 5B 83 5F 83 93 83 76 20 20 88 C8 89 リーダンプ 以下
02 F0 :BA 82 CC 83 54 83 75 83 52 83 7D 83 93 83 68 82 のサブコマンドが
03 00 :AA 82 A0 82 E8 82 DC 82 B7 0D 0A 82 50 20 20 92 あります..1 中
03 10 :86 92 66 20 20 20 20 20 82 51 20 20 8D C4 8A 4A 断 2 再開
03 20 :20 20 20 20 20 82 52 20 20 8F 49 97 B9 0D 0A 51 3 終了..Q
03 30 :20 20 48 45 58 44 55 4D 50 8F 49 97 B9 0D 0A 43 HEXDUMP
終了..C
03 40 :20 20 83 6F 83 43 83 69 83 8A 83 66 81 5B 83 5E
バイナリデータ
03 50 :8C 9F 8D F5 20 20 8E 77 92 E8 82 B5 82 BD 83 66 検索 指定したデ
03 60 :81 5B 83 5E 82 AA 90 D4 90 46 82 C5 95 5C 8E A6 ータが赤色で表示
03 70 :81 42 20 8E 77 92 E8 97 E1 81 6A 43 33 38 2C 20 。 指定例)C38,
03 80 :43 37 45 0D 0A 91 53 82 C4 91 E5 95 B6 8E 9A 82 C7E..
全て大文字で
03 90 :C5 8E 77 92 E8 82 B5 82 C4 89 BA 82 B3 82 A2 0D 指定して下さい.
03 A0 :0A 24 83 74 83 40 83 43 83 8B 82 AA 8A 4A 82 AF ..
ファイルが開け
03 B0 :82 DC 82 B9 82 F1 81 42 83 52 83 7D 83 93 83 68 ません。コマンド
03 C0 :83 89 83 43 83 93 82 C9 90 B3 82 B5 82 A2 83 74 ラインに正しいフ
03 D0 :83 40 83 43 83 8B 96 BC 82 F0 8E 77 92 E8 82 B5 ァイル名を指定し
03 E0 :82 C4 89 BA 82 B3 82 A2 0D 0A 24 83 66 81 5B 83 て下さい...データ
03 F0 :5E 93 C7 82 DD 8D 9E 82 DD 83 47 83 89 81 5B 0D 読み込みエラー.
04 00 :0A 24
1B 5B 33 31 6D 24 1B 5B 6D 24 00 00 00 00 ...[31m..[m.....
04 10 :00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 ................
04 20 :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 ................
04 30 :................
-



2. フローチャート
(1) おおまかな流れ
仕様を決めたところで、実際のコーディングに移る前にフローチャートを作成してみましょう。
たかが、こんだけのプログラムでもアセンブラで組むと、それなりにやっかいなので、フローチャート
を作成したほうがいいでしょう。フローチャートはHEXDUMP.HTMを参照して下さい。
(実は、おじさんはHexdumpの作成にあたりフローチャートを作らずに、いきなりコーディングしてしま
いました。そのせいか、あまりわかりやすいコードになっていないと思います。言い訳・・・)

さて、大まかな流れは以下の通りとなります。

ファイルオープン
    |
データ読み込み<−−−−−−−−−−−
    |           |  | 
16進数で表示         |  |
    |           |  |
1行分(16バイト)処理したか |  |
 YES            NO−−    |
 |                 |
キャラクター表示−−−−−−−−−−−

(2) キャラクタ表示の処理
上記の大まかなフローチャートではさらっと流していますが、キャラクター表示の部分は多少複雑です。
その部分の流れについて解説します。
Hexdumpでは、Shift-Jisコードに基づいてキャラクタ表示の処理をしています。(MS-DOSはShift-Jisで
日本語を処理しています。)
ですので、まず簡単にShift-Jisコードについておさらいしてみます。
Shift-Jisコードは、1バイト文字と2バイト文字(主に漢字)が混在した文字コードになっています。
大まかにいうと以下の通りです。

Shift-Jis
  1バイト目 2バイト目
表示できない文字 &H00〜&H1F
&HFD〜&HFF
  −
1バイト文字 &H20〜&H7F
&HA0〜&HDF
  −
2バイト文字(漢字等) &H80〜&H9F
&HE0〜&HFC
&H40〜&HFC
(&H7F除く)

従って、キャラクタ表示の部分では、まず読み取ったデータ(1バイト目)が、(A)表示できない文字か、
(B)1バイト文字か、(C)2バイト文字の可能性がある(&H80〜&H9F、&HE0〜&HFC)かで、
3パターンに処理をわけます。
(A)表示できない文字の場合は、「・」を表示し、
(B)1バイト文字の場合は、そのキャラクターを表示します。
やっかいなのは、(C)2バイト文字の可能性のある場合です。
この場合は、次のデータ(2バイト目)を見て2バイト文字か、そうでないか更に判定します。
2バイト文字と判断されたら、その文字を表示し、2バイト目のデータは読み込み済みとして表示の処理は
スキップします。
2バイト文字でないと判断されたら、「・」を表示し2バイト目は未処理として、改めて1バイト目の
データとして処理するようにします。
次回のコードの説明の時にも触れますが、2バイト目のデータの判定には、KAN2というフラグを使用
しています。KAN2=0なら2バイト文字でない、KAN2=1なら2バイト文字という判定です。

さて、もうひとつ更にやっかいなのは、行末(16バイト目)のデータが2バイト文字の可能性がある場合です。
この場合は、ファイルから次の行の先頭のデータを先読みして、2バイト文字かどうかの判定をします。
(a)2バイト文字と判定された場合は、その文字を表示し、行末2バイト文字用フラグKANF=2に設定します。
  そして、次の行から先読みしたデータをKANBUFという変数に保存します。
(b)2バイト文字でないと判定された場合は、「・」を表示し、KANF=1に設定し、次の行から先読みしたデータ
  をKANBUFに保存します。(KANF,KANBUFの用途はあとで明らかになりますので、ここでは説明省略します)

それでは、フラグKANFについて説明します。これの意味は
(あ)KANF=0 行末は2バイト文字ではない。
(い)KANF=1 行末は2バイト文字の可能性があったが、2バイト文字ではなかった。上記(b)の場合
(う)KANF=2 行末は2バイト文字。上記(a)の場合
となっています。
このフラグKANFは、次の行の読み込みの時に参照され、それぞれ次のような処理が行われます。
(あ)KANF=0なら、通常どおりファイルから1バイトのデータが読み込まれます。
(い)KANF=1なら、最初のデータは、前の行末処理で既に先読みされているので、ファイルからは読み込まず、
   KANBUFに保存していたデータを渡して使います。
(う)KANF=2の場合も、最初のデータは、前の行末処理で既に先読みされているので、ファイルからは読み込
  まず、KANBUFに保存していたデータを渡して使います。ただし、キャラクター表示時には、行の先頭は
  「 」(空白)を表示します。なぜなら、このデータは2バイト文字の2バイト目で、キャラクター表示は前の
  行の行末でなされているからです。

いささか、複雑な処理となっているので、若干わかりにくいかもしれませんが、フローチャートを参照して
どういう処理のながれかつかんでみて下さい。

TopPage


inserted by FC2 system