• Format S

機械語のプログラムを作るとき、短いものならハンドアセンブルでもいいが、少し長いものを本格的に作るなら開発ツールを揃える必要がある。こうしたときLinuxなら、パッケージマネージャーで簡単に環境整備ができる。

LinuxのCコンパイラであるgccを使うとアセンブラソーステキストを機械語に変換できる。これを使えば、ループや分岐など少し複雑な機械語プログラムの開発も簡単になる。ハンドアセンブラでは、相対アドレスの扱いが面倒。かといって、絶対アドレスも開始アドレスが決まらないと使えない。勢い、分岐やループを極力使わないプログラムになってしまう。しかし、本格的なプログラム開発では、ここは避けて通れない。

必要なツールは、gccとbinutilsパッケージだ。「sudo apt install gcc binutils -y」でインストールできる。

テキストファイルとしてアセンブラソース(ここでは、test.sとする)を作ったら、


gcc -c test.s

として、アセンブル(写真01)を行うと、test.oファイルができる。これは、機械語のオブジェクトファイルである。これは、単にソースコードをバイナリの機械語に変換し、リンク処理できる状態にしたものだ。ここでは、リンク作業は必要ないので、オブジェクトファイルからバイナリを生成し16進数ダンプを作る。

  • 写真01: アセンブラソースtest.sをgccでアセンブルして、オブジェクトファイルtest.oを作り、これを逆アセンブル(objdump)して、Sフォーマットで出力(objcopy)。Sフォーマットをawkで分解してコマンドライン用の文字列を作る

その前にアセンブルがどのように行われたかを確認しておく。それには、「objdump -d test.o」として、オブジェクトファイルを逆アセンブルしてみるといいだろう。

オブジェクトファイルをExecMLに入れるために16進数ダンプにする。いくつもやりかたはあるが、objcopyを使うとオブジェクトファイルから機械語の実行イメージを取り出すことができる。バイナリ形式で出力して、odコマンドで16進数ダンプという手もあるが、筆者の好みで、Sレコード(モトローラSフォーマット)を使った。これは、モトローラのマイクロプロセッサ6800のモニタープログラムMIKBUGで採用されていた紙テープからのメモリ読み込み形式だったもの。当時モトローラの6800用にMIKBUGを入れたM6830というマスクROMが販売されており、開発システムなどをまったく持たない個人ユーザーでも、自作システムを起動できた。その後もSフォーマットは残り、いまでも、組み込み用などで使われる形式の1つだ。


objcopy -O srec test.o test.hex

Sフォーマットは、行頭に"S"があり、次の数字1桁でレコードの意味を表す。ファイルはヘッダを表すS0レコードで始まり、データ部分はS1、S2、S3(アドレス空間により異なる)レコードなどが続きS9レコードで終了する。"S"と16進数(0~9、A~F)だけからなる。

それほど長くなければ、16 bitメモリ空間に収まるので、objcopyでは、S1レコードで16進数ダンプが出てくる。この場合、先頭の8文字を飛ばして、最後のチェックサム2文字を抜いた部分がプログラムコードになる。この程度であれば、awkなどでコード部分を抜き出して出力が可能だ。スペース区切りで出力すれば、以前紹介したExecML.exe(創世記機械語参照)の引数に貼り付けることができる。

今回のタイトルネタは、1969年の英国テレビドラマ“Department S”である。日本でも「秘密指令S」などのタイトルで放映された。1960年台には「プリズナーNo.6」(The Prisoner)や「セイント 天国野郎」(The Saint)、「幽霊探偵ポップカーク」(Randall and Hopkirk (Deceased))など、イギリスのテレビ番組も多かった。いまから50年以上前のテレビ番組だが、アバンタイトルを使うオープンニングの様式など、すでにこの頃に確立されていたことがわかる。