その仮想コンピュータのC言語ソースファイルがこれ。
#include <stdio.h>
#include <windows.h>
#include <windows.h>
int main(void)
{
/*命令コードの構造*/
union c{
struct{
unsigned char operand : 8; //オペランド
unsigned char opecode : 8; //オペコード
}part;
unsigned short int code;
};
{
/*命令コードの構造*/
union c{
struct{
unsigned char operand : 8; //オペランド
unsigned char opecode : 8; //オペコード
}part;
unsigned short int code;
};
union c meirei[8]; //命令コードは8つ格納できるようにする
int i = 0;
int command = 0;
int command = 0;
unsigned char input_data = 0; //仮想入力装置の入力状態のデータ
system("cls");
while(1){
switch(command){
case 1: //命令コードのリストと入力中の数値を表示
for(i=0;i<8;i++) printf("%x:%x\n",i,meirei[i].code);
putchar('\n');
printf("入力されている数値:%x\n\n",input_data);
break;
case 2: //命令コードを変えれるようにする
printf("どのアドレスの命令コードを入力しますか?:");
scanf("%x",&i);
printf("%x:",i);
scanf("%x",&meirei[i].code);
putchar('\n');
break;
case 3:
printf("仮想入力装置から入力する数値を16進数で設定してください。入力できる数値は0からFFまでです。");
scanf("%x",&input_data);
putchar('\n');
break;
case 4: //プログラムの実行
for(program_counter=0;program_counter<8;program_counter++){
switch(meirei[program_counter].part.opecode){
case 0: //加算
accumulator += meirei[program_counter].part.operand;
break;
case 1: //減算
accumulator -= meirei[program_counter].part.operand;
break;
case 2: //出力
printf("%x\n",accumulator);
break;
case 3: //入力
accumulator = input_data;
break;
case 4: //仮想アキュムレータに数値を格納
accumulator = meirei[program_counter].part.operand;
break;
}
}
accumulator = 0;
putchar('\n');
break;
case 5: //仮想マシンの電源を切る
goto EXIT;
break;
default:
break;
}
while(1){
switch(command){
case 1: //命令コードのリストと入力中の数値を表示
for(i=0;i<8;i++) printf("%x:%x\n",i,meirei[i].code);
putchar('\n');
printf("入力されている数値:%x\n\n",input_data);
break;
case 2: //命令コードを変えれるようにする
printf("どのアドレスの命令コードを入力しますか?:");
scanf("%x",&i);
printf("%x:",i);
scanf("%x",&meirei[i].code);
putchar('\n');
break;
case 3:
printf("仮想入力装置から入力する数値を16進数で設定してください。入力できる数値は0からFFまでです。");
scanf("%x",&input_data);
putchar('\n');
break;
case 4: //プログラムの実行
for(program_counter=0;program_counter<8;program_counter++){
switch(meirei[program_counter].part.opecode){
case 0: //加算
accumulator += meirei[program_counter].part.operand;
break;
case 1: //減算
accumulator -= meirei[program_counter].part.operand;
break;
case 2: //出力
printf("%x\n",accumulator);
break;
case 3: //入力
accumulator = input_data;
break;
case 4: //仮想アキュムレータに数値を格納
accumulator = meirei[program_counter].part.operand;
break;
}
}
accumulator = 0;
putchar('\n');
break;
case 5: //仮想マシンの電源を切る
goto EXIT;
break;
default:
break;
}
printf("何をしますか?\n");
printf("1:命令コードのリストと入力中の数値を見る\n2:命令コードを変える\n3:入力装置の入力状態を変える\n4:プログラムを実行する\n5:仮想マシンの電源を切る\n");
scanf("%d",&command);
printf("1:命令コードのリストと入力中の数値を見る\n2:命令コードを変える\n3:入力装置の入力状態を変える\n4:プログラムを実行する\n5:仮想マシンの電源を切る\n");
scanf("%d",&command);
system("cls");
}
}
EXIT:
return 0;
}
return 0;
}
格納できる命令の数:8ワード(オペコード、オペランド共に1バイト)
命令の長さ:2バイト(16ビット)
アキュムレーターの大きさ:8ビット
入力データの大きさ:8ビット
オペコードとその性能
オペコードが0の場合:アキュムレータ内の数値をオペランドの数値の分増やす
オペコードが1の場合:アキュムレータ内の数値をオペランドの数値の分減らす
オペコードが2の場合:アキュムレータ内の数値を画面に16進数で出力
オペコードが3の場合:アキュムレータに、入力中の数値を格納
オペコードが4の場合:アキュムレータ内の数値を、オペランドと同じに