【问题标题】:Seemingly random return values看似随机的返回值
【发布时间】:2012-01-07 00:35:44
【问题描述】:

我正在尝试为一个非常简单的 MIPS 处理器制作一个简单的汇编程序。不幸的是,C 给我带来了很多麻烦,具体来说,strcasecmp 没有返回有效/正确的结果。结果有时是正确的..但通常不是,我无法理解为什么会出现这种情况。除了任何修复建议之外,有人可以解释为什么会发生这些错误吗?

注意我不认为错误是由于传递了注册表。在转换寄存器函数中声明寄存器表时也会出现同样的错误

谢谢!!!

应该返回与寄存器名称对应的值的函数。请注意RegisterTablemain 中声明。我这样做是为了从main

中遍历并测试表中的每个寄存器名称
int ConvertRegisterName(char * rname,REG_NAME_PAIR RegisterTable[32])
{
    int i;
    int j=0;
    for (i=1; i<32; i++,i++)
    {
        if (!(strcasecmp(RegisterTable[i].reg_number,rname) & strcasecmp(RegisterTable[i].reg_name,rname)))
        {
            j=i;
            return j;
            break;
        }
    }

    if(!j)
    {
        printf("Error with register name \n");
        return j;
    }
}

main 函数

int main(int argc,char *argv[])
{
    REG_NAME_PAIR RegisterTable[32];
    RegisterTable[1].reg_name    = "at";
    RegisterTable[1].reg_number  = "$1";
    RegisterTable[2].reg_name    = "v0";
    RegisterTable[2].reg_number  = "$2";
    RegisterTable[3].reg_name    = "v1";
    RegisterTable[3].reg_number  = "$3";
    RegisterTable[4].reg_name    = "a0";
    RegisterTable[4].reg_number  = "$4";
    RegisterTable[5].reg_name    = "a1";
    RegisterTable[5].reg_number  = "$5";
    RegisterTable[6].reg_name    = "a2";
    RegisterTable[6].reg_number  = "$6";
    RegisterTable[7].reg_name    = "a3";
    RegisterTable[7].reg_number  = "$7";
    RegisterTable[8].reg_name    = "t0";
    RegisterTable[8].reg_number  = "$8";
    RegisterTable[9].reg_name    = "t1";
    RegisterTable[9].reg_number  = "$9";
    RegisterTable[10].reg_name   = "t2";
    RegisterTable[10].reg_number = "$10";
    RegisterTable[11].reg_name   = "t3";
    RegisterTable[11].reg_number = "$11";
    RegisterTable[12].reg_name   = "t4";
    RegisterTable[12].reg_number = "$12";
    RegisterTable[13].reg_name   = "t5";
    RegisterTable[13].reg_number = "$13";
    RegisterTable[14].reg_name   = "t6";
    RegisterTable[14].reg_number = "$14";
    RegisterTable[15].reg_name   = "t7";
    RegisterTable[15].reg_number = "$15";
    RegisterTable[16].reg_name   = "s0";
    RegisterTable[16].reg_number = "$16";
    RegisterTable[17].reg_name   = "s1";
    RegisterTable[17].reg_number = "$17";
    RegisterTable[18].reg_name   = "s2";
    RegisterTable[18].reg_number = "$18";
    RegisterTable[19].reg_name   = "s3";
    RegisterTable[19].reg_number = "$19";
    RegisterTable[20].reg_name   = "s4";
    RegisterTable[20].reg_number = "$20";
    RegisterTable[21].reg_name   = "s5";
    RegisterTable[21].reg_number = "$21";
    RegisterTable[22].reg_name   = "s6";
    RegisterTable[22].reg_number = "$22";
    RegisterTable[23].reg_name   = "s7";
    RegisterTable[23].reg_number = "$23";
    RegisterTable[24].reg_name   = "t8";
    RegisterTable[24].reg_number = "$24";
    RegisterTable[25].reg_name   = "t9";
    RegisterTable[25].reg_number = "$25";
    RegisterTable[26].reg_name   = "k0";
    RegisterTable[26].reg_number = "$26";
    RegisterTable[27].reg_name   = "k1";
    RegisterTable[27].reg_number = "$27";
    RegisterTable[28].reg_name   = "gp";
    RegisterTable[28].reg_number = "$28";
    RegisterTable[29].reg_name   = "sp";
    RegisterTable[29].reg_number = "$29";
    RegisterTable[30].reg_name   = "fp";
    RegisterTable[30].reg_number = "$30";
    RegisterTable[31].reg_name   = "ra";
    RegisterTable[31].reg_number = "$31";


    int i;
    for (i=1; i<32; i++)
    {
        printf("i is %d\n",i);
        printf("Register Name is %s \n" ,RegisterTable[i].reg_name);
        printf("this is the return value %d",ConvertRegisterName(RegisterTable[i].reg_name,RegisterTable));
        printf("\n");
        printf("Register Number %s\n",RegisterTable[i].reg_number);
        printf("this is the return value %d",ConvertRegisterName(RegisterTable[i].reg_number,RegisterTable));
        printf("\n");
        printf("\n");
    }
}

REG_NAME_PAIR 结构

typedef struct
{
    char *reg_name;
    char *reg_number;
} REG_NAME_PAIR;

【问题讨论】:

  • 你的意思是i++, i++
  • 你真的是要使用 & (按位与)而不是 &&
  • 这段代码完全混乱。为什么要将相同的“名称”参数与reg_name 也与reg_number 进行比较?
  • 代码是为人类设计的(特别是因为你在这里发布了)。请相应地格式化

标签: c


【解决方案1】:

转换函数可能可以简化并更正为这样的:

int ConvertRegisterDesc(const char * token, REG_NAME_PAIR RegisterTable[])
{
    for (int i = 1; i != 32; ++i)
    {
        if (strcasecmp(RegisterTable[i].reg_number, token) == 0 ||
            strcasecmp(RegisterTable[i].reg_name,   token) == 0   )
        {
            return i;
        }
    }

   printf("Error with register name \n");
   return 0;
}

现在ConvertRegisterDesc("foo", RegisterTable) 返回名称值为"foo"(大小写变体)的条目的索引,如果找不到此类条目,则返回0

【讨论】:

  • 当您明确地将strcasecmp() 的结果与零进行比较时,您不需要!,对吗?您将返回第一个不匹配的寄存器 - 并且没有字符串会同时匹配数字和名称。
【解决方案2】:

您似乎使用的是 &amp; 运算符而不是 &amp;&amp;
&amp; 按位与,而不是逻辑与。例如:
0x01 &amp; 0x02 == 0 - 因为两者都没有设置位
0x01 &amp;&amp; 0x02 == 1 - 因为 0x01 和 0x02 都评估为真。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2014-12-10
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多