在指针值C上添加操作

时间:2012-06-04 14:49:10

标签: c pointers add

我在尝试用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;

但它不起作用。

2 个答案:

答案 0 :(得分:1)

您没有说 不起作用 - 但是,您构建内部循环和if的方式至少有一个错误。每当内部循环看到一个与第二个操作数不匹配的寄存器时,else块将被执行 - 所以所有寄存器在第二个操作数指定的寄存器将被添加到(和如果第二个操作数是int,则所有寄存器将被添加到)。 循环后移动,并且只有在内部循环找不到寄存器时才能执行它们。

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