どうですか?面白そうじゃないですか?ということでやってみましょう。
→ 最初から以下の #define ECX 1 までは、TJ-03と同じなので省略
#define ECX 1
#define EDX 2
#define REGVAR 'i' // レジスタ変数の変数名(固定).
int isNumber(unsigned char c) → TL-02と同じなので省略.
void getNumberSub()
{
unsigned char *p = &txt[pc], *q;
put32(strtol(p, (char **) &q, 0));
pc += q - p;
}
void getNumber(int reg) // 定数は2桁以上でもOK. レジスタに値をセットするための命令群を出力する.
{
unsigned char c = txt[pc], *p, *q;
if (isNumber(c) != 0) { // 数字.
code[qc++] = 0xb8 + reg; // MOV reg,const.
getNumberSub();
return;
}
pc++; // 1文字の変数.
if (c == REGVAR) {
if (reg != EDX) {
code[qc++] = 0x89; // MOV reg,EDX.
code[qc++] = reg + EDX * 8 + 0xc0;
}
} else {
code[qc++] = 0x8b; // MOV reg,[const].
code[qc++] = reg * 8 + 0x05;
put32((int) &var[c]);
}
}
void sub_print(int i) → TJ-03と同じなので省略
void sub_time() → TJ-03と同じなので省略
int main(int argc, const char **argv)
{
→ ここの部分はTJ-03と同じなので省略.
for (;;) {
pc0 = pc;
if (txt[pc] == 0) // ファイル終端.
break;
if (txt[pc] == REGVAR && txt[pc + 1] == '=') { // レジスタ変数への代入.
pc += 2;
getNumber(EDX);
if (txt[pc] == ';') {
} else if (txt[pc] == '+') { // 加算.
pc++;
if (isNumber(txt[pc]) != 0) {
code[qc++] = 0x81;
code[qc++] = 0xc0 + EDX;
getNumberSub();
} else
goto err; // 変数の加算はまだ作ってない.
} else
goto err; // 加算以外はまだ作ってない.
continue;
}
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc] == '\t' || txt[pc] == ';') { // 空行など.
pc++;
} else if (txt[pc + 1] == '=') { // 2文字目が"=".
→ ここ以降はTJ-03と同じなので省略.