前回ラズパイ4機上のQEMUエミュレータで動作させているMS-DOS互換OS、FreeDOSを、ラズパイ4にSSH接続したWindows11のターミナルで動作するように設定できました。らくちん。今回は、そもそもの目的、x86の16ビットモードのオブジェクトを生成できるアセンブラをインストールして動作確認してみます。
※実機動作確認には以下を使用しております。
DOSSHELL互換、FDSHELLのインストール
FreeDOSは「末期の」MS-DOSの互換(かなり強力に拡張されている)ソフトウエアですが、ディレクトリ構成やソフトウエアパッケージのインストール方法などFreeDOSのポリシーで首尾一貫している部分があります。まず追加のパッケージ(ZIPファイルに圧縮されている)をインストールする場合のコマンドがあります。例えば、DドライブにLiveCDのイメージをCD-ROMとしてマウントしてある場合、以下のようなコマンドを発すると dosshell 互換の fdshellをインストールすることが可能です。
fdinst install d:\packages\apps\fdshell.zip
パッケージ名はfdshellですが、コマンド名自体は dosshell と「そのまま」です。Windowsのターミナル内からssh接続していて dosshell を起動するとこんな感じ。
黒い文字コンソールの中に、妙にGUIっぽいSHELLが浮かび上がります。左上に[C:]とあるところがドライブ指定部分です。矢印キーでCからDとかドライブを変更できます。赤色矢印を書き込みましたが、TABキーで下側のディレクトリ・ペイン?に移動できます。その中で矢印キーでディレクトリを移り、RETURNおして選択、階層をたどっていく感じです。右側のファイル・ペイン?へはやはりTABキーで移動できます。その中で矢印キーでファイルを選び、ALT+Fなどを押すと上部のメニューが開くので、実行するなり、ファイルの中身を表示するなりいろいろできます。DOSのコマンド忘れている忘却力の年寄にはありがたいツールです。1点残念なことを言えば、ファイル表示は32Kバイトまでです。長大なファイルの中身はのぞき見できません。なお、DOSSHELLの終了はCTRL+Qです。
NASMのインストール
LiveCDやボーナスCDの、DEVELディレクトリの中をみると開発ツール多数が存在しています。しかし、FreeDOSの御本家ページなどみると、以下がキホンになっているようです。
-
- Open Watcom C/C++ コンパイラ
- NASM アセンブラ
当方、16ビットの8086部分から、16ビットでもプロテクトモードを使う80286以降までこの環境でアセンブラをエクササイズしようとしています。上記のコンパイラもアセンブラも、8086の16ビットでも286のプロテクトモードでも、386の32ビットでもなんでもござれの強力なもののようです。お勧め通りで行きたいと思います。
まずは NASM のインストールから。DドライブにLiveCDがマウントされている場合、
fdinst install d:\packages\devel\nasm.zip
これでNASMのインストールができました。簡単。インストールの頭のところが以下に。
インストール後、NASMを起動し、バージョンを確認したところが以下に。
NASMのインストールには、285ページもある美麗なPDF形式(テキスト形式もあり)のマニュアルが付属しています。これを読めばバッチリだね。ホントか?
なお、NASM=The Netwide Assemblerだそうです。
早速 NASM でHello worldしてみる
マニュアルみるとNASMは以下の環境向けのオブジェクトコードを吐きだせるようです。
-
- 16ビットのDOS、16ビットのWindows3.x
- 32ビットのWindows、DOS上のDJGPP環境、Unix(Linux)系
- 64ビットのWindows、Unix(Linux)系
当然、COFF形式(.obj) や、一般的なELF形式のオブジェクトが生成できますが、直接 DOSで実行可能な .EXE ファイルは生成できないようです。.EXE作るにはリンカがいるのよ。
ところが、NASMのパッケージにはリンカは含まれてません。FreeDOS本体にも含まれてないです。調べてみたら、Open Watcom C/C++ コンパイラに含まれていることが分かりました。そういうことなのね。。。
まあコンパイラのパッケージは後でインストールしてみることにして、NASM本体だけで生成可能な .COM 形式のオブジェクトを作って FreeDOS上でHello worldしてみることにいたしました。.COM形式は、100番地スタートのベタなBIN形式なので、BIN形式でアセンブルしたオブジェクトに.COMという拡張子つけてやればアセンブラだけでOKっと。NASM形式で書いた8086命令範囲のHello worldのソースが以下に。
org 100h section .text start: mov sp, stacktop mov dx, hello mov ah, 9 int 0x21 mov ax, 0x4c00 int 0x21 section .data align=16 hello: db 'Hello, world.', 13, 10, '$' section .bss align=16 resb 64 stacktop:
昔懐かしいインテルASM86形式とも、マイクロソフトMASM形式とも微妙に異なるアセンブラ書式ですが、ATT形式に比べたらほぼほぼ一緒よな。
上記をNASMでアセンブルし、FreeDOS上で実行した様子が以下に。
末尾に「Hello world.」と表示できとりますで。昔懐かしい8086のアセンブラじゃ。