djgppはgccをMSDOS上に移植したコンパイラで、フリーで使用できます。
いままでdjgppでDOS窓上で動作するプログラムは作ったことがありますが
はたしてスタンドアロンのCPUボードのプログラムを作れるでしょうか
いままでdjgppでDOS窓上で動作するプログラムは作ったことがありますが
はたしてスタンドアロンのCPUボードのプログラムを作れるでしょうか
まずスタートアップルーチンの差し替えです。
CPUボード上ではDOSのサービスが受けられませんから、
ここら辺を処理しているらしいcrt0.oをただ単にmain関数を呼ぶだけの次のようなstart.oに交換します
CPUボード上ではDOSのサービスが受けられませんから、
ここら辺を処理しているらしいcrt0.oをただ単にmain関数を呼ぶだけの次のようなstart.oに交換します
.globl _start .globl _end .text _start: call _main hlt _end: .end
次に例えばこんなテストプログラムを書いて
#include<stdio.h> #include"386lib.h" void main(void) { while(1){ putstr("Hello, C world.\n\r"); } }
Cのソースをコンパイル(TEST.c→TEST.S)
データを0x10000番地に配置(TEST.o→TEST.obj)
gcc -S -c -v -O TEST.cアセンブル(TEST.S→TEST.o)
as -R -oTEST.o TEST.sリンカでスタートアップ、本体プログラム、ライブラリを結合しコードを0x2000、
データを0x10000番地に配置(TEST.o→TEST.obj)
ld -N -M -Ttext 2000 -Tbss 10000 -e_start -oTEST.obj start.o TEST.o 386lib.o出力されたCOFFファイルをCPUボードにDLLできるバイナリ形式に変換(TEST.obj→TEST.bin)
objcopy -O binary TEST.obj TEST.bin
あっさりコンパイルは通り、バイナリが生成されたのですがボードにDLLすると全く動きません