1

我在尝试用 C 语言创建汇编仿真程序时遇到问题。有 5 个寄存器:REGA、REGB、REGC、REGX AND INSP,以及 10 条指令:NOP、SET、AND(按位 &)、OR(按位 |)、 ADD、SUB、SHL(<< 左)、SHR(>>)、JMP。

程序从文件中读取指令;包含指令和 2 个参数的行。在大多数情况下,第一个参数是寄存器名称(例如 REGA),第二个参数可以是寄存器名称或整数。

我正在使用 sscanf 从文件中获取说明。

我在使用 ADD、SUB、SHL 和 SHR 功能时遇到问题。我的添加功能是:

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;

但它没有用。

4

2 回答 2

1

您没有说什么不起作用 - 但是,您构建内部循环和if. 每当内部循环看到与第二个操作数不匹配的寄存器时,该else块将被执行 - 因此将添加第二个操作数指定的寄存器之前的所有寄存器(如果第二个操作数是 int,则所有寄存器都将添加到)。块的内容else必须在循环之后移动,并且只有在内循环没有找到寄存器时才能执行。

于 2012-06-04T14:54:05.043 回答
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);
于 2012-06-04T15:10:15.033 回答