我在尝试用C创建汇编仿真器程序时遇到问题。有5个寄存器:REGA,REGB,REGC,REGX和INSP,以及10条指令:NOP,SET,AND(按位&),OR(按位|),ADD,SUB,SHL(<<左),SHR(>>),JMP。
程序从文件中读取指令;包含指令和2个参数的行。在大多数情况下,第一个参数是寄存器名称(例如REGA),第二个参数可以是寄存器名称或整数。
我正在使用sscanf从文件中获取说明。
我遇到ADD,SUB,SHL和SHR功能问题。我的ADD功能是:
int opcode_add(char* opcode, char *arg1, char *arg2){
int i, j;
for(i = 0; i < MAX_REGISTER; i++){
if (strcmp(register_str[i],arg1) == 0){
for(j = 0; j <=MAX_REGISTER; j++){
if(strcmp(register_str[j],arg2) == 0){
*register_ptr[i] = *register_ptr[i] + *register_ptr[j];
break;
}else {
*register_ptr[i] = *register_ptr[i] + atoi(arg2);
}
}
}
}
INSP++;
return (0);
}
如果传递了2个寄存器参数,则该函数有效。例如:
SET REGA 1
SET REGB 2
ADD REGA REGB
但是如果传递寄存器和整数则不行。例如:
SET REGA 2
ADD REGA 1
问题出在这一行:
*register_ptr[i] = *register_ptr[i] + atoi(arg2);
我试过这样做:
int y = *register_ptr[i];
int k = atoi(arg2);
int result = y+k;
*register_ptr[i] = result;
但它不起作用。
答案 0 :(得分:1)
您没有说 不起作用 - 但是,您构建内部循环和if
的方式至少有一个错误。每当内部循环看到一个与第二个操作数不匹配的寄存器时,else
块将被执行 - 所以所有寄存器在第二个操作数指定的寄存器将被添加到(和如果第二个操作数是int,则所有寄存器将被添加到)。 1}}块的内容必须在循环后移动,并且只有在内部循环找不到寄存器时才能执行它们。
答案 1 :(得分:0)
问题在于:
for(j = 0; j <=MAX_REGISTER; j++){
if(strcmp(register_str[j],arg2) == 0){
*register_ptr[i] = *register_ptr[i] + *register_ptr[j];
break;
}else {
*register_ptr[i] = *register_ptr[i] + atoi(arg2);
}
}
首先,您应检查j < MAX_REGISTER
,因为您的数组(显然)不包含MAX_REGISTER
本身。但更重要的是,只要一个注册名称不匹配就不应该atoi
。
您现在所做的是,如果第二个参数不是REGA
,您会立即转到else
并尝试atoi
。您应该做的是检查所有寄存器,如果arg2
不是,则尝试atoi
:
bool found = false;
for(j = 0; j < MAX_REGISTER; j++){
if(strcmp(register_str[j],arg2) == 0){
*register_ptr[i] = *register_ptr[i] + *register_ptr[j];
found = true
break;
}
}
if (!found)
*register_ptr[i] = *register_ptr[i] + atoi(arg2);