用于解释简单指令集的程序

时间:2014-05-07 19:09:22

标签: c binary instruction-set

我有一个问题我需要解决,我不知道如何做到这一点。如果有人愿意帮助我会非常感激。我知道我要求很多,但我确实需要它。

创建一个程序,用于解释由指令组成的简单指令集: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;
}

1 个答案:

答案 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