我试图将一个基本的C虚拟机放在一起,该虚拟机将从汇编程序中读取二进制文件,并使用该文件基于该文件中的二进制数据执行命令。我需要将值解码为十六进制格式,然后使用它们来确定操作码和执行操作。这是我对此如何解决感到困惑的部分?我已经定义了寄存器和指令,但是我想知道如何使用Fetch函数从内存中读取“指令字节”,然后进行解码以填充OP1和/或OP2,以便确定要执行的命令,执行的操作我感到困惑的是,像pop
push
和return
这样的命令,因为在此示例中,它们都具有7
的相同起始操作码,并且仅在{ {1}}为push
流行为40
,而80
为return
。如何将命令的所有4-8个字节传递给访存,并能够确定要执行的命令?
MAIN.C
00
INPUT.txt
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
unsigned char memory[1028];
typedef enum{
halt,add,and,divide,mult,sub,or,popushret,interrupt,addimmediate,branchifequal,branchifless,jump,call,load,store
} Instructions;
typedef enum{
R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,PC,OP1,OP2,Result,CIP,} Registers;
void decode( ) { // Read only from the array of bytes from fetch. Populate the OP1 and OP2 registers if appropriate. Fetch any additional memory needed to complete the instruction.
}
void fetch(int memory){ // Read instruction bytes from memory.
printf("%02x\n",memory);
}
int loads(char *filename){
FILE *file = fopen(filename,"rb");
ssize_t read;
if(file == NULL){
exit(-1);
}
while(fread(&memory,sizeof(unsigned char),1,file) == 1){
fetch(*memory);
}
fclose(file);
exit(0);
}
int main(int argc,char** argv){
if (argc <= 1){
printf("No file found\n");
return -1;
}
char *filename = argv[1];
loads(filename);
}
OUTPUT.TXT
74
40
77
40
11
23