ソフトな忘却力(47) FreeDOS、NASM、強力なアセンブラ、でもリンカはどこ?

Joseph Halfmoon

前回ラズパイ4機上のQEMUエミュレータで動作させているMS-DOS互換OS、FreeDOSを、ラズパイ4にSSH接続したWindows11のターミナルで動作するように設定できました。らくちん。今回は、そもそもの目的、x86の16ビットモードのオブジェクトを生成できるアセンブラをインストールして動作確認してみます。

※「 ソフトな忘却力」投稿順 Index はこちら

※実機動作確認には以下を使用しております。

    •  Raspberry Pi 4 model B、Cortex-A72コア(ARMv8-A)
    •  Raspberry Pi OS (64bit) bullseye
    •  QEMU 5.2.0
    •  FreeDOS 1.3
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 を起動するとこんな感じ。FreeDOSshell

黒い文字コンソールの中に、妙に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のインストールができました。簡単。インストールの頭のところが以下に。installNasm

 

インストール後、NASMを起動し、バージョンを確認したところが以下に。nasmVersion

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上で実行した様子が以下に。comruns

末尾に「Hello world.」と表示できとりますで。昔懐かしい8086のアセンブラじゃ。

ソフトな忘却力(46) FreeDOS、使い方のあれこれ、VNC or SSH へ戻る

ソフトな忘却力(48) FreeDOS、Open Watcom C/C++ コンパイラ へ進む