Skip to content

Instantly share code, notes, and snippets.

@solismb
Last active August 29, 2015 14:22
Show Gist options
  • Save solismb/17dfa73dd5b6280d1a13 to your computer and use it in GitHub Desktop.
Save solismb/17dfa73dd5b6280d1a13 to your computer and use it in GitHub Desktop.
* 0
C 1
T 10
R 11
L 11
T 12
L 12
S 10
Z 12
T 12
M 11
T 11
J 5
W 11
H 0
/ 0
#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;
}

##モデルコンピュータ的な 定義したアセンブリ言語で書かれたプログラムをファイルで渡すと実行するようなモデルコンピュータをC言語で実装したやつです.

  • modelComp.c
    asmファイルをコマンドライン引数で渡すとそれを実行します。

  • sum.asm
    0が入力されるまで入力データを加算し, データの総和を求めます.

  • fact.asm
    入力された数字の階乗を計算します.

###アセンブリ言語の定義

命令コード
*n n番地からプログラムを格納する
L n LOAD n n番地の内容ををaccに取り出す
C m LOAD CONSTANT m 定数mをaccに入れる
T n STORE n accの内容をn番地に格納する
A n ADD n accの内容とn番地の内容を足す(結果はacc)
S n SUBTRACT n accの内容からn番地の内容を引く(結果はacc)
M n MULTIPLY n accの内容からn番地の内容をかける(結果はacc)
D n DEVIDE n accの内容をn番地の内容で割った商を求める(結果はacc)
J n JUMP n n番地へ飛ぶ
Z n JUMP ZERO n accの内容が0ならばn番地へ飛ぶ
R n READ n n番地へデータを読み込む
W n WRITE n n番地のデータを書き出す
H n HALT n プログラムの実行を停止する(nは任意)
/ n プログラムの物理的な終わりを示し, n番地から実行する
* mは定数, nはプログラムエリア内の番地
* 0
C 0
T 10
R 11
A 11
T 10
L 11
Z 9
L 10
J 2
W 10
H 0
/ 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment