2012-01-07 100 views
1

我想为一个非常简单的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; 
+2

你的意思是说'i ++,i ++'? – 2012-01-07 00:39:06

+4

您是否确实打算使用&(位智和)而不是&& – 2012-01-07 00:40:40

+3

此代码完全混淆。你为什么要用'reg_name' *和* reg_number'来比较相同的“名称”参数? – 2012-01-07 00:41:52

回答

3

谈话负离子功能很可能被简化和纠正,以这样的:

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如果没有这样的条目可以被发现。

+0

当你明确地将'strcasecmp()'的结果与零进行比较时,你不需要'!',是吗?你将返回第一个不匹配的寄存器 - 并且没有字符串会匹配数字和名称。 – 2012-01-07 01:09:13

+0

@JonathanLeffler:当然 - 谢谢! – 2012-01-07 01:13:11

0

您似乎正在使用&运算符而不是&&
&确实按位,而不是逻辑和。例如:
0x01 & 0x02 == 0 - 因为
0x01 && 0x02 == 1上没有设置位 - 因为0x01和0x02的值均为true。