2012-01-07 2 views
1

나는 아주 간단한 MIPS 프로세서에 대한 간단한 어셈블러를 만들려고합니다. 불행히도 C는 나에게 많은 문제를 일으켰습니다. 특히 strcasecmp은 유효하거나 올바른 결과를 반환하지 않았습니다. 결과는 때로는 정확하지만 일반적으로 그렇지 않습니다. 그리고 나는 이것이 세상에서 왜 이런 경우가 될지 이해할 수 없습니다. 수정 제안 사항 외에 누군가가 이러한 오류가 발생하는 이유를 설명 할 수 있습니까?겉으로보기에는 무작위로 반환 값을

참고 나는이 오류가 레지스터 테이블을 전달할 것으로 생각하지 않는다고 생각합니다. 레지스터 테이블이 변환 레지스터 함수 내에서 선언 될 때 동일한 오류가 발생합니다.

감사합니다 !!!

레지스터 이름에 해당하는 값을 반환해야하는 함수. 은 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

이 코드는 완전히 혼란 스럽습니다. 같은 "name"인수를'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과 비교할 때'!'는 필요하지 않습니다. 당신은 무언가와 일치하지 않는 첫번째 레지스터를 반환 할 것이고, 문자열은 숫자와 이름 모두와 일치하지 않을 것입니다. –

+0

@JonathanLeffler : 물론 - 고마워요! –

0

&& 대신 & 연산자를 사용하는 것 같습니다.
&은 비트 단위이며 논리적이 아닙니다. 따라서 예 :
0x01 & 0x02 == 0 -
0x01 && 0x02 == 1의 비트가 설정되지 않았기 때문에 - 0x01과 0x02가 모두 참으로 평가되기 때문에.