DPMI32でCコード


DPMIで32ビットに移行した後にCのコードを引っ付けてみました。

16bitの処理は前と同じです。

32bitのアセンブラを以下のようにします。

;--- this is a 32bit DPMI application.

    .386
    .model small

    .dosseg    ;ensures that segments are ordered: code

    .code
    PUBLIC start
    PUBLIC printstring_
    EXTERN hello_:BYTE

start:
    call near ptr hello_
    mov ax, 4C00h   ;normal client exit
    int 21h

;--- print a string in protected-mode with simple
;--- DOS commands not using pointers.

printstring_:
    mov esi, eax
printstring:
    lodsb
    and al,al
    jz stringdone
    mov dl,al
    mov ah,2
    int 21h
    jmp printstring
stringdone:
    ret

    end

Cのコードはこうしました。

#pragma off (check_stack);

void printstring(char *);

hello()
{
        printstring("Hello World!!\n");
}

Open Watcomは標準でスタックチェックの__CHKの呼び出しが入るので、それをprogmaで止めてます。またstdioを使わないためにアセンブラで文字列出力ルーチンを用意してます。

DOS -> ASM -> C -> ASM -> C -> ASM -> DOSになっています。

Cからの呼び出し規約はwdisで確認しました。

これでアセンブリとコンパイルするとHello World!!できます。

リンクのときにsystemがdosなのに32bitコード入ってるよって警告でますが、ちゃんと動くexeが作られます。

Warning! W1080: file start.o is a 32-bit object file
Warning! W1080: file main.o is a 32-bit object file
Warning! W1080: file hello.o is a 32-bit object file

Open WatcomではDOS/4Gという仕組みでDOSの32Bit環境をサポートしていてそのライブラリはあるようなのですが、使い方がよくわかりません。