#include #include #include "asm.h" #include "tree.h" #define MAX_CODES 4096 /* コードバッファのサイズ */ #define STRING_TABLE_SIZE 1024 /* 文字列テーブルのサイズ */ /* stringf.c で定義 */ char *Stringf(char *fmt, ...); /* 文字列を生成して返す (malloc 使用) */ /********************************/ /* コードバッファ関係 */ /********************************/ /* コードバッファ */ Code CodeBuf[MAX_CODES]; int CBp=0; /* 新しいラベルの生成 */ int labelNo=0; char *newLabel(char prefix) { return Stringf("_%c%04d", prefix, labelNo++); } /* ラベルを追加する */ void L(char *label) { CodeBuf[CBp].label = label; CodeBuf[CBp].op = CodeBuf[CBp].arg1 = CodeBuf[CBp].arg2 = CodeBuf[CBp].comment = NUL; CBp++; } /* 命令を追加する */ void I(char *op, char *arg1, char *arg2) { CodeBuf[CBp].op = op; CodeBuf[CBp].arg1 = arg1; CodeBuf[CBp].arg2 = arg2; CodeBuf[CBp].label = CodeBuf[CBp].comment = NUL; CBp++; } /* ラベルつき命令を追加する */ void LI(char *label, char *op, char *arg1, char *arg2) { CodeBuf[CBp].label = label; CodeBuf[CBp].op = op; CodeBuf[CBp].arg1 = arg1; CodeBuf[CBp].arg2 = arg2; CodeBuf[CBp].comment = NUL; CBp++; } /* 直前の命令にコメントをつける */ void C(char *comment) { CodeBuf[CBp-1].comment = comment; } /* コードの出力 */ void putCode() { int i; for (i=0; i