C言語でパソコン内に仮想コンピュータを作ってみた
私が作った仮想コンピュータのスペックは以下の通り
・1つの命令コードの長さ
8ビット(1バイト)
・格納できる命令コードの数
8つ
・命令コードの法則
上位2ビット:オペコード
下位6ビット:オペランド
・2進数のオペコード
00:何もしない
01:加算命令(「アキュムレータ内の値」+「オペランドの値」をアキュムレータに格納する)
10:減算命令(「アキュムレータ内の値」-「オペランドの値」をアキュムレータに格納する)
11:アキュムレータ内の値の画面出力(10進数で)命令
即値データ
その仮想コンピュータのプログラムのC言語ソースファイルは以下の通り。
#include <stdio.h>
#include <windows.h>
#include <windows.h>
int main(void)
{
union c{
struct{
unsigned char operand : 6;
unsigned char opecode : 2;
}part;
unsigned char code;
};
{
union c{
struct{
unsigned char operand : 6;
unsigned char opecode : 2;
}part;
unsigned char code;
};
union c meirei[8];
int i = 0;
int command = 0;
unsigned char accumulator = 0;
int command = 0;
unsigned char accumulator = 0;
system("cls");
while(1){
switch(command){
case 1:
for(i=0;i<sizeof(meirei);i++) printf("%x:%x\n",i,meirei[i].code);
putchar('\n');
break;
case 2:
printf("どのアドレスの命令コードを入力しますか?:");
scanf("%x",&i);
printf("%x:",i);
scanf("%x",&meirei[i].code);
putchar('\n');
break;
case 3:
for(i=0;i<sizeof(meirei);i++){
switch(meirei[i].part.opecode){
case 0:
break;
case 1:
accumulator += meirei[i].part.operand;
break;
case 2:
accumulator -= meirei[i].part.operand;
break;
case 3:
printf("%d\n",accumulator);
break;
}
}
accumulator = 0;
putchar('\n');
break;
case 4:
goto EXIT;
break;
default:
break;
}
printf("何をしますか?\n");
printf("1:命令コードのリストを見る 2:命令コードを変える 3:プログラムを実行する 4:仮想マシンの電源を切る\n");
scanf("%d",&command);
printf("1:命令コードのリストを見る 2:命令コードを変える 3:プログラムを実行する 4:仮想マシンの電源を切る\n");
scanf("%d",&command);
system("cls");
}
}
EXIT:
return 0;
}
return 0;
}