LSIC-86のコード生成はいまいちで、特に浮動小数点処理をするとき頻繁にサブルーチンコールする
ので効率が良くありません
ここではDOSアプリ時代に相当お世話になったMicrosoft-C Compiler Ver6.00を利用してやってみよう
と思います。
DOSアプリ用のコンパイラは、生成したバイナリも当然MS-DOS環境下で実行されることを想定している
のでOSが無い組込み用ファームやROM化は簡単ではありません
ので効率が良くありません
ここではDOSアプリ時代に相当お世話になったMicrosoft-C Compiler Ver6.00を利用してやってみよう
と思います。
DOSアプリ用のコンパイラは、生成したバイナリも当然MS-DOS環境下で実行されることを想定している
のでOSが無い組込み用ファームやROM化は簡単ではありません
問題は
・スタートアップルーチンの付加
・各セグメントの割付けを走行環境のROM/RAMに合わせて再配置
・OSのサービスを利用しない処理をしなければならない
といったところです。
・スタートアップルーチンの付加
・各セグメントの割付けを走行環境のROM/RAMに合わせて再配置
・OSのサービスを利用しない処理をしなければならない
といったところです。
unsigned char mandel_chk(double a,double b) { double x,y,x1,y1; int n; x=y=0; for(n=1;n<NMAX;n++){ x1=x*x-y*y+a; y1=2*x*y-b; if((x1*x1+y1*y1)>4) return (n % 256); x=x1; y=y1; } return 0; }
このソースを以下のコマンドラインでコンパイルしてみました
cl /c /G2 /Ox /FPi87 /Fatest test.c //プロセッサ=80286 最適化MAX、80x87インライン命令生成
出力されたアセンブルソースはこんな具合です
_mandel_chk PROC NEAR enter 18,0 push si fldz fldz fwait mov dx,1 fld QWORD PTR $T20004 fld QWORD PTR [bp+12] ;b $F303: fld ST(3) fmul ST(0),ST(3) fmul ST(0),ST(2) fsub ST(0),ST(1) fstp QWORD PTR [bp-10] ;y1 fld ST(2) fmul ST(0),ST(3) fld ST(4) fmul ST(0),ST(5) fsub fadd QWORD PTR [bp+4] ;a fst QWORD PTR [bp-18] ;x1 fmul QWORD PTR [bp-18] ;x1 fld QWORD PTR [bp-10] ;y1 fmul QWORD PTR [bp-10] ;y1 fadd fcom QWORD PTR $T20005 fstp ST(0) fstsw ax sahf ja $L20006 fld QWORD PTR [bp-18] ;x1 fstp ST(3) fld QWORD PTR [bp-10] ;y1 fstp ST(4) inc dx cmp dx,1024 jl $F303 fstp ST(0) fstp ST(0) fstp ST(0) fstp ST(0) jmp SHORT $FB305 nop $L20006: fstp ST(0) fstp ST(0) fstp ST(0) fstp ST(0) mov si,dx mov cx,256 mov ax,si cwd idiv cx mov ax,dx pop si leave ret nop $FB305: sub al,al pop si leave ret nop _mandel_chk ENDP