Open Watcom IDE -- Cからとアセンブラールーチンを呼び出す
2018-03-02


禺画像]

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で記述されています。 現代のコーディングスタイルと比較して、古い書き方をしてあり、私の好みに合わない書き方です。 今回は、現代風のスタイルに合わせて書いていきます。主な変更点は、以下の通りです。

  1. 関数の宣言で、"int"型の変数を明示的に宣言していないのを 全て宣言するようにした。
  2. "unsinged int"型の宣言を "unsinged"としてあるのを、"unsinged int"と記述するようにした。
  3. register変数は、とりあえず使わない。
  4. ユーティリティーライブラリーは複数のソースファイルに分かれているが、共通の インクルードファイルにまとめてプロトタイプ宣言をしている。デバックしづらいので、一つの Cソースファイルに対応して一つのヘッダーファイルを作成しプロトタイプ宣言をするようにした。
  5. 標準関数のプロトタイプ宣言を 直接コーディングしてあるのを ヘッダファイルをインクルード するようにした。
  6. Static属性の付いた関数は、そのままではデバッグしづらいので、コンパイル時に"DEBUG"を定義してないときは、 static属性をつけてコンパイルをするように"#ifndef DEBUG"を関数の宣言に追加した。
  7. 制作にはOpen Watcom C/C++コンパイラーとWASMを使用する。
  8. 開発はOS/2で行い、デバッグはOS/2のPC-DOS窓で行う。

開発は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_"となるようです。



続きを読む

[コンピューター]
[OS/2]
[DOS Shell]

コメント(全9件)
コメントをする


記事を書く
powered by ASAHIネット