2012-01-07 4 views
1

Я пытаюсь сделать простой ассемблер для очень простого процессинга MIPS. К сожалению, C дал мне много неприятностей, в частности, strcasecmp не вернул правильные/правильные результаты. Результаты верны иногда .. но обычно нет, и я не могу понять, почему в мире это будет так. Может ли кто-нибудь объяснить, почему возникают эти ошибки?Видимо случайные возвращаемые значения

ПРИМЕЧАНИЕ Я не думаю, что ошибка связана с передачей таблицы регистров. Те же ошибки возникают, когда таблица регистров объявлена ​​внутри функции регистра преобразования.

Спасибо !!!

функция, которая должна возвращать значение, соответствующее регистровому имени. Обратите внимание, что RegisterTable объявлен в main. Я сделал это, чтобы я мог перебирать и протестировать каждое имя регистра в таблице из 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 ++'? –

+4

Вы действительно хотели использовать & (бит мудрый и), а не && –

+3

Этот код полностью смущен. Почему вы сравниваете один и тот же аргумент «имя» с 'reg_name' * и * также с' reg_number'? –

ответ

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()' с нолем, не так ли? Вы вернете первый регистр, который не соответствует чему-либо, и никакая строка не будет соответствовать как числу, так и имени. –

+0

@ JonathanLeffler: конечно - спасибо! –

0

Вы, кажется, используете оператор & вместо &&.
& побитовое и, не логическое и. Так, например:
0x01 & 0x02 == 0 - потому что на обоих
0x01 && 0x02 == 1 - потому что оба значения 0x01 и 0x02 равны true.

Смежные вопросы