UTK 版でコンパイル・リンクできる prime.c

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 版向けの start.asm

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 版でのコンパイルとリンク

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 が生成されます。