我有一个问题我需要解决,我不知道如何做到这一点。如果有人愿意帮助我会非常感激。我知道我要求很多,但我确实需要它。
创建一个程序,用于解释由指令组成的简单指令集:MVI,MOV,AND,OR,NOT,LESS,LEQ,GRE,GEQ,JMP,PRN,SUM,SUB,PRB,SL和SR,在本文档中描述。您的任务是创建一个程序,将一个指令列表的二进制表示作为输入,并作为输出打印相应的结果(执行指令后)。输入可以包含除了您不必实现的SUB和PRB之外的所有指令。不应该从二进制系统转换到任何其他数字系统,除非您需要在条件满足时找到应该执行的行(GRE,GEQ,LESS,LEQ,JMP),但比较条件中的数字应该基于二进制表示/ pn。所有数据均以SM二进制系统表示。从0到7枚举了8个16位寄存器。
#include<stdio.h>
#define MAX 1000
char registers[8][16];
void MVI(int reg, char *value) {
// code here
}
void MOV(int reg1, int reg2) {
// code here
}
void AND(int reg1, int reg2, int reg3) {
// code here
}
void OR(int reg1, int reg2, int reg3) {
// code here
}
void NOT(int reg1, int reg2) {
// code here
}
void PRN(int reg) {
// code here
}
void SUM(int reg1, int reg2, int reg3) {
// code here
}
void SL(int reg) {
// code here
}
void SR(int reg) {
// code here
}
int main() {
int i,j,k;
int N = 0; // number of lines in the input
char c;
char lines[MAX][16];
while (1) {
scanf("%c", &c);
if (c == '\n') {
break;
}
lines[N][0] = c;
for (i=1;i<16;i++) {
scanf("%c", &lines[N][i]);
}
N++;
scanf("%c", &c);
}
for (i = 0; i < 8; i++) {
for (j = 0; j < 16; j++) {
registers[i][j] = '0';
}
}
// code here
return 0;
}
答案 0 :(得分:1)
我认为你需要的大部分是根据源代码行调度函数。有很多方法可以做到这一点,但是对于所有这些方法来说,一个有用的部分是strstr(a,b)==a
,它将检查字符串 a 是否以字符串 b的内容开头
你可以做一系列if-else块。
if (strstr(line[i], "SUM")==line[i]){
SUM(...);
} else if (strstr(line[i], "AND")==line[i]) {
AND(...);
}
或者,当您读取源代码并将其存储为单字节小代码时,您可以通过扫描操作码来预编译用户程序。您希望大写标识符为枚举值,并使用小写版本作为函数名称。然后链更简单。
if (line[i][0] == SUM) {
SUM(...);
} else if (line[i][0] == AND) {
AND(...);
}
但是,对于小整数代码,还有更好的方法。一个开关。
switch(line[i][0]){
case SUM: sum(...); break;
case AND: and(...); break;
}
功能表。但这是你聪明的地方。必须始终使用正确类型的参数调用函数,但函数指针允许您绕过编译器的能力 检查是这样的。因此,对于此方法,所有函数都应该具有相同的参数 它们都是由一个函数调用行调用的。
void (*optab[])(...) = { sum, and, ... };
optab[ line[i][0] ](...); // calls sum() or and() by using the opcode in the array lookup