|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#define N 100 |
|
#define M 100 |
|
|
|
typedef struct instruction { |
|
char func; // 命令 |
|
int addr; // アドレス |
|
} IR; |
|
|
|
/* asmファイルを読み込みプログラム領域に格納する関数 */ |
|
int readAsm(FILE *fp, IR code[], IR ir) |
|
{ |
|
int temp, i; |
|
char c; |
|
|
|
fscanf(fp, "%c %d\n", &c, &temp); |
|
if (c != '*') { // asmファイルが*で始まっていない場合エラー |
|
printf("このファイルは正しくありません\n"); |
|
exit(EXIT_FAILURE); |
|
} else { |
|
i = temp; // プログラムを格納する番地 |
|
} |
|
|
|
// プログラム領域codeに格納 |
|
fscanf(fp, "%c %d\n", &ir.func, &ir.addr); |
|
while (ir.func != '/') { |
|
code[i] = ir; |
|
fscanf(fp, "%c %d\n", &ir.func, &ir.addr); |
|
printf("[%d] %c %d\n", i, code[i].func, code[i].addr); |
|
i++; |
|
} |
|
|
|
// while終了時, irにはファイル最後の行が格納されている |
|
|
|
return ir.addr; |
|
} |
|
|
|
int main(int argc, char *argv[]) |
|
{ |
|
FILE *fp; |
|
IR code[M], ir; |
|
int pc = 0, acc, data[N]; |
|
|
|
// コマンドライン引数にasmファイルが指定されていないとき |
|
if (argc == 1) { |
|
printf("ファイルが指定されていません\n"); |
|
return 0; |
|
} |
|
|
|
// ファイルオープン |
|
if ((fp = fopen(argv[1], "r")) == NULL) { |
|
printf("File : %s can not open.\n", argv[1]); |
|
exit(EXIT_FAILURE); |
|
} |
|
|
|
printf("load source\n"); |
|
pc = readAsm(fp, code, ir); |
|
printf("end\n\n"); |
|
|
|
printf("program start\n"); |
|
|
|
while (code[pc].func != 'H') { |
|
ir = code[pc]; |
|
//printf("%c %d\n", ir.func, ir.addr); |
|
switch(ir.func) { |
|
case 'L': |
|
acc = data[ir.addr]; |
|
pc++; |
|
break; |
|
case 'C': |
|
acc = ir.addr; |
|
pc++; |
|
break; |
|
case 'T': |
|
data[ir.addr] = acc; |
|
pc++; |
|
break; |
|
case 'A': |
|
acc = acc + data[ir.addr]; |
|
pc++; |
|
break; |
|
case 'S': |
|
acc = acc - data[ir.addr]; |
|
pc++; |
|
break; |
|
case 'M': |
|
acc = acc * data[ir.addr]; |
|
pc++; |
|
break; |
|
case 'D': |
|
acc = acc / data[ir.addr]; |
|
pc++; |
|
break; |
|
case 'J': |
|
pc = ir.addr; |
|
break; |
|
case 'Z': |
|
if (acc == 0) |
|
pc = ir.addr; |
|
else |
|
pc++; |
|
break; |
|
case 'R': |
|
scanf("%d", &data[ir.addr]); |
|
pc++; |
|
break; |
|
case 'W': |
|
printf("%d\n", data[ir.addr]); |
|
pc++; |
|
break; |
|
case 'H': |
|
return 0; |
|
//break; |
|
default: |
|
printf("定義されていない命令\n"); |
|
break; |
|
} |
|
} |
|
|
|
fclose(fp); |
|
printf("exit\n"); |
|
|
|
return 0; |
|
} |