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