CASE INDEXADO_INDIRECTO, donde tengo que validar una cadena esta cadena que inicia con [, debe de tener o bien una D despues del corchete o un numero en base DECIMAL (tiene un rango especifico de valores para que sea valido)seguido por una , despues un registro que puede ser x,y,sp,pc y por ultimo un corchete de cierre ]
por ejemplo si tengo:
[5,Sp -> error: le falta el ultimo corchete
[,x] -> no puede haber una instruccion vacia antes de la coma
[100,] ->no puede haber una instruccion vacia despues de la coma
[ ->despues del primer [ debe haber dos registros separados por una , y despues ]
[AD,sp]-> el primer registro tiene que ser la letra D
PERO cuando le pongo algo como:
[5A9,x] -> aqui me aparece que es un numero valido, pero para este caso en especial solo puede aceptar numeros decimales, y no se como corregir esto
Código
case INDEXADO_INDIRECTO: i = 1; car = operando[i++]; if(car == '\0') else { if(operando[tam-1] != ']') else { switch(car) { case ']': break; case ',': registro = obtenerRegistro(operando); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': else { base = 10; x = 1; k = 0; esIndexadoIndirecto16bits = 1; instruccion = obtenerInstruccion(operando,x); numero = obtenerNumero(instruccion,k,base); registro = obtenerRegistro(operando); registro = convertirMayusculas(registro); else { if(!verificarRegistro(registro)) { esIndexadoIndirecto16bits = 0; printf("Los registros validos de un direccionamiento Indexado indirecto de 16 bits son X,Y,SP,PC\n"); } if(!verificarRangoIndexadoIndirecto(numero)) { esIndexadoIndirecto16bits = 0; } if(esIndexadoIndirecto16bits) { if((indice = buscarDireccionamiento(encontrado,direccionamiento[7]))!= -1) else printf("el codop %s no acepta el direccionamiento indexado indirecto de 16 bits\n",encontrado->instruccion); } } } break; case '-': else { base = 10; x = 0; k = 1; esIndexadoIndirecto16bits = 1; instruccion = obtenerInstruccion(operando,x); numero = obtenerNumero(instruccion,k,base); registro = obtenerRegistro(operando); registro = convertirMayusculas(registro); else { if(!verificarRegistro(registro)) { esIndexadoIndirecto16bits = 0; printf("Los registros validos de un direccionamiento Indexado indirecto de 16 bits son X,Y,SP,PC\n"); } if(!verificarRangoIndexadoIndirecto(numero)) { esIndexadoIndirecto16bits = 0; } if(esIndexadoIndirecto16bits) { if((indice = buscarDireccionamiento(encontrado,direccionamiento[7]))!= -1) else printf("el codop %s no acepta el direccionamiento indexado indirecto de 16 bits\n",encontrado->instruccion); } } } break; default: x = 1; esIndexadoIndirecto_Acumulador = 1; instruccion = obtenerInstruccion(operando,x); registro = obtenerRegistro(operando); registro = convertirMayusculas(registro); if(!indirectoAcumulador_D(instruccion)) { esIndexadoIndirecto_Acumulador = 0; } if(!verificarRegistro(registro)) { esIndexadoIndirecto_Acumulador = 0; } if(esIndexadoIndirecto_Acumulador) { if((indice = buscarDireccionamiento(encontrado,direccionamiento[6]))!= -1) printf("Indexado Indirecto de Acumulador D,([D,IDX]), de %s bytes\n",encontrado->total_bytes[indice]); else printf("el codop %s no acepta el direccionamiento indexado indirecto de acumulador D\n",encontrado->instruccion); } } } } break;
y las demas funciones son estas, no puse todo el codigo porque son como 1700 lineas de codigo,se que tengo algunas malas practicas de programacion pero ahora lo importante es corregir ese bug.
Código
char *obtenerRegistro(char *operando) { int j,i = 0; char *cadena = NULL,c[2]; while(operando[i] != ',') i++; for(j = i+1;operando[j] != ']';j++) { } return cadena; } char *obtenerInstruccion(char *operando,int x) { int i; char *cadena = NULL,c[2],signo[] = {'\0',','}; for(i = x;operando[i] != ',';i++) { } return cadena; } int obtenerNumero(char *operando,int x,int base) { int i,potencia,num_decimal = 0,lon,entero = 0; for(i = lon-1,potencia = 1;i >= x;i--,potencia*=base) { if(esLetraBase16(operando[i])) entero = hexadecimal(operando[i]); else entero = operando[i]-'0'; num_decimal+= potencia*entero; } if(operando[CERO] == '-') num_decimal*= -1; return num_decimal; } int hexadecimal(char caracter) { int decimal; switch(caracter) { case 'A':case 'a': decimal = 10; break; case 'B':case 'b': decimal = 11; break; case 'C':case 'c': decimal = 12; break; case 'D':case 'd': decimal = 13; break; case 'E':case 'e': decimal = 14; break; case 'F':case 'f': decimal = 15; break; default: } return decimal; } char *convertirMayusculas(char *cadena) { int i; for(i = 0;cadena[i];i++) return cadena; } int verificarRegistro(char *cadena) { int i; char *registro[] = {"X","Y","SP","PC"}; for(i = 0;i < 4;i++) { return 1; } return 0; } int verificarRangoIndexadoIndirecto(int numero) { if(numero >= CERO && numero <= MAX_IDX_INDIRECTO) return 1; else return 0; }
de antemano gracias