Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在指针值C上添加操作_C_Pointers_Add - Fatal编程技术网

在指针值C上添加操作

在指针值C上添加操作,c,pointers,add,C,Pointers,Add,我在尝试用C创建汇编仿真程序时遇到问题。有5个寄存器:REGA、REGB、REGC、REGX和INSP,还有10条指令:NOP、SET和(按位&)、OR(按位|)、ADD、SUB、SHL(>)、JMP 程序从文件中读取指令;包含指令和2个参数的行。在大多数情况下,第一个参数是寄存器名(如REGA),第二个参数可以是寄存器名或整数 我正在使用sscanf从文件中获取说明 我在ADD、SUB、SHL和SHR函数方面遇到了问题。我的添加功能是: int opcode_add(char* opcode,

我在尝试用C创建汇编仿真程序时遇到问题。有5个寄存器:REGA、REGB、REGC、REGX和INSP,还有10条指令:NOP、SET和(按位&)、OR(按位|)、ADD、SUB、SHL(>)、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); 
}
但如果传递了寄存器和整数,则不会。例如:

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;
但是它不起作用。

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

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

问题如下:

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); 
    }       
}
问题在于:

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); 
    }       
}

您正在接收什么错误消息?这看起来可疑:
for(j=0;j)您正在接收什么错误消息?这看起来可疑:
for(j=0;j抱歉。我没有收到任何错误消息。问题是计算不正确。例如,如果I:SET REGA 1;然后ADD REGA 1-应该执行else语句(因为arg2不是寄存器,它是int)。确实如此,但是,计算的结果是错误的。在本例中,我收到的结果是错误的。@Maj:是的,因为我描述的错误将多次执行
else
。请确保您理解为什么会发生这种情况(通过调试或插入
cout
语句,显示执行
if
部分和
else
部分的时间)在您尝试修复它之前。谢谢您的帮助。我还没有使用调试器;我还没有尝试。我通过将else语句的内容移动到第一个if之后,成功地修复了它。@Maj:所以相同的
else
块现在位于
if(strcmp(register_str[I],arg1)==0)之后
?然后我认为您引入了另一个错误:例如,
ADD REGC 1
现在将在
C
之前的所有寄存器中添加1,
ADD REGC REGA
将崩溃或产生错误的结果。是的,我把它放在那里了。但是,我没有把它放在else块中;只放在if中,在第二个循环之前。看起来s开始工作。我刚刚设置了REGC 1,ADD REGC 2;结果确实是3。对不起,我没有收到任何错误消息。问题是计算不正确。例如,如果I:SET REGA 1;然后ADD REGA 1-应该执行else语句(因为arg2不是寄存器,它是int)。确实如此;但是,计算的结果是错误的。在本例中,我收到的结果是错误的。@Maj:是的,因为我描述的错误将多次执行
else
。请确保您理解发生这种情况的原因(通过调试或插入
cout
语句,显示执行
if
部分和
else
部分的时间)在您尝试修复它之前。谢谢您的帮助。我还没有使用调试器;我还没有尝试。我通过将else语句的内容移动到第一个if之后,成功地修复了它。@Maj:所以相同的
else
块现在位于
if(strcmp(register_str[I],arg1)==0)之后
?然后我认为您引入了另一个错误:例如,
ADD REGC 1
现在将在
C
之前的所有寄存器中添加1,
ADD REGC REGA
将崩溃或产生错误的结果。是的,我把它放在那里了。但是,我没有把它放在else块中;只放在if中,在第二个循环之前。看起来我刚刚设置了regc1,加上regc2,结果确实是3。