DPMI32でCコード
1907 ワード
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環境をサポートしていてそのライブラリはあるようなのですが、使い方がよくわかりません。
Author And Source
この問題について(DPMI32でCコード), 我々は、より多くの情報をここで見つけました https://qiita.com/yamori813/items/b0dd2f14668129d92450著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .