CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

GCCプログラミング(6)

問題はプログラムの中でsprintf()を使うと山のようにリンク未解決エラーが出ることです
libc.a(malloc.o)(.text+0x1e):malloc.c: undefined reference to `__sbrk'
libc.a(malloc.o)(.text+0x43):malloc.c: undefined reference to `__sbrk'
libc.a(malloc.o)(.text+0x112):malloc.c: undefined reference to `__sbrk'
libc.a(crt1.o)(.text+0xc7):crt1.c: undefined reference to `_stubinfo'
libc.a(crt1.o)(.text+0x143):crt1.c: undefined reference to `_stubinfo'
libc.a(crt1.o)(.text+0x178):crt1.c: undefined reference to `_stubinfo'
libc.a(crt1.o)(.text+0x2f6):crt1.c: undefined reference to `_crt0_init_mcount'
libc.a(dpmiexcp.o)(.text+0x129):dpmiexcp.c: undefined reference to `__djgpp_selector_limit'
libc.a(dpmiexcp.o)(.text+0xab8):dpmiexcp.c: undefined reference to `__djgpp_base_address'
libc.a(dpmiexcp.o)(.text+0xc04):dpmiexcp.c: undefined reference to `__exit'
libc.a(c1args.o)(.text+0x59e):c1args.c: undefined reference to `_stubinfo'
libc.a(c1args.o)(.text+0x669):c1args.c: undefined reference to `_stubinfo'
libc.a(c1args.o)(.text+0x6ec):c1args.c: undefined reference to `_stubinfo'
どうもsprintfは内部処理の作業エリアとしてmalloc()でメモリ確保しているようです。
mallocは下請け関数としてsbrk()を呼び出し、これはDOSエクステンダのサービスを使って
メモリブロックを取得しようとします。
ところがsbrk()を含むcrt0.oをリンクしてないし、大体この386ボードにはOSがありません。

エラーが出るのは当然なんですが、できればシリアル出力の書式制御のためにprintf系関数は使いたい
ところです。
そこで前に68000ボードで使ったBDS-Cのsprintfのソースをビルドしてリンクしました。

これでint型の数値表示はできるようになりましたが、なんとlong型をサポートしていないので
「"%ld"」が使えません。
そういえばCP/M-80上のC処理系であるBDS-Cは、long型とfloat型は基本的に使えなかったなぁ・・・

まあこれはこういうふうに3桁ずつ表示すれば良しです。
 printf("%03d%03d\n\r",i/1000,i%1000);

これでやっとプログラムを実行。NUM=500000でsieve()関数自体は1秒以下で終了します。
けっこう高速です。
イメージ 1


500000を超えない最大の素数は499979。
合ってるかどうかはわかりません