UTK 版には、printf、malloc などの OS 依存関数は付属していません。これらの関数を使用したい場合は、環境に合わせて自作する必要があります。
次のプログラムは、結果をディスプレイに表示する代わりに、メモリ上の buffer に書き込みます。
/**** サンプル プログラム : 素数の計算 ****/
/**** OS 依存関数を使用しないバージョン ****/
#include <stdio.h>
#include <string.h>
#define NUM 100 // 探す素数の数
char buffer[1000]; // 結果文字列出力先
int main()
{
int found = 0; // 発見した数
int trg = 2; // 調査対象の数値
buffer[0] = 0; // 出力先バッファの初期化
while ( found < NUM ) // NUM 個の素数を発見するまで続ける
{ int dvsr = 2;
while ( 1 )
{ if ( dvsr >= trg ) // 発見
{ sprintf( buffer + strlen( buffer ), " %4d", trg );
found++;
break;
}
if ( trg % dvsr == 0 ) // 割り切れたら素数ではない
break;
dvsr++;
}
trg++; // 調査対象の数値を進める
}
return( 0 );
}
UTK 版を使用するときは、スタートアップ ルーチンを自作する必要があります。次は prime() を呼び出す小さなスタートアップ ルーチン例です。
extrn _main:near
public _errno
cseg segment word public 'CODE'
mov ax, DGROUP
mov ds, ax ; DS ← DGROUP
mov ax, 0
mov ss, ax ; SS ← 0000
mov sp, 0 ; SP ← 0000
cld ; DF ← 0
call _main ; main() を呼び出す
fin: jmp fin ; 終了(無限ループ)
cseg ends
DGROUP group dseg
dseg segment word public 'DATA'
_errno dw 0
dseg ends
end
オンライン ヘルプ LightC.hlp の「スタートアップ ルーチン」も参照してください。
UTK 版には 186 用のライブラリしか付属していないため、-186 でコンパイルする必要があります。また、OS に依存するスタックチェックルーチン(_stack_chk)も付属していないので、-gs を指定してスタックチェックを抑止する必要があります。さらに、FPU(数値演算コプロセッサ)を使用しないように -emul を指定します。
上の2つのプログラムをコンパイル、アセンブル、およびリンクするには、コマンドラインから次のように入力します。
lch -c -186 -emul -gs prime.c
lasmh start.asm
lilh start.obj prime.obj /eprime
これで、開始アドレス 0000:0000 に実行イメージ prime.heb が生成されます。