Open Watcom IDEをいじるに当たり、ただ漠といじってもつまらないので、 PC-DOS用のシェルの作成を計画しました。もちろんネタ本があります。 CQ出版社から1989年7月20日に出版された「Allen Holib著 横山和由訳 MS-DOS用Shellの実現 (On Command: Writing a Unix-Like Shell for MS-DOS)」です。 本棚の肥やしになっていたのを引っ張り出してきました。この本を購入した頃は、 まだまだ、コンパイラーなどのツールが高価で、実際の制作には、踏み切れませんでした。
内容は、丁寧にシェルの実装について、ソースリストを交えて解説してあります。 特に難しい内容ではなく、容易に著者の開発手順をたどり、シェルを作成することができそうです。 原著が書かれたのは、1986年頃で、その当時書き方で、MS-C Ver.4とMASMで記述されています。 現代のコーディングスタイルと比較して、古い書き方をしてあり、私の好みに合わない書き方です。 今回は、現代風のスタイルに合わせて書いていきます。主な変更点は、以下の通りです。
開発はC:ドライブに"Shell"ディレクトリを作成し、その中にコードを書くこととしました。
前準備ができたので、まずは、手始めに、Cのmain()関数から、 アセンブラーで記述した関数foo()を呼び出す練習をしました。 ソースコードは、下記の通りです。
/* callasm.c */ #include #include "foo.h" int main() { int p; p = 7; printf("%d => %d\n",p,foo(p)); return 0; }
/* foo.h */ extern int foo(int);
; foo.asm _text SEGMENT BYTE PUBLIC 'CODE' _text ENDS _data SEGMENT WORD PUBLIC 'DATA' _data ENDS const SEGMENT WORD PUBLIC 'CONST' const ENDS _bss SEGMENT WORD PUBLIC 'BSS' _bss ENDS dgroup GROUP const,_bss,_DATA ASSUME CS:_text, DS:dgroup, SS:dgroup, ES:dgroup _text SEGMENT ; --------------------------------------------------------------------- ; foo(int val) ; val=bp+4 _foo PROC NEAR PUBLIC _foo push bp mov bp,sp mov ax,[bp+4] shl ax,1 mov sp,bp pop bp ret _foo ENDP _TEXT ENDS END
Wasmは、MASM互換といわれているので、一発でうまくいくと思っていたのですが、だめでした。 ビルドしてみると、下記のようにリンケージでエラーが出ます。callasm.cで呼び出している関数foo()は、 コンパイルされると、"foo_"となるようです。
セコメントをする