Autor
|
Tema: modos de direccionamiento indexado de 5/9/16 bits (Leído 2,690 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos tengo el siguiente código en el que tengo una cadena de nombre operando como la siguiente: 2983,X y tengo que averiguar que modo de direccionamiento indexado es, las reglas son: Modo indizado de 5 bits. en el operando se representan números decimales con un rango de -16 a 15, despues del valor debe de haber siempre una coma, y después el nombre de registro que puede ser X,Y,SP o PC Modo indizado de 9 bits. Es lo mismo que en el de arriba solo que los numeros decimales de rango desde -256 a -17 y de 16 a 255. Modo indizado de 16 bits. Es lo mismo solo que tiene rango de 256 a 65535. para estos tres modos de direccionamiento ya tengo el código que funciona bien, pero tengo que agregarle otro modo de direccionamiento un poco diferente y no se bien cómo hacerlo: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define CERO 0 #define MAX_DIRECTO 255 #define MAX_IDX_INDIRECTO 65535 #define MIN_IDX_9BITS 16 #define MAX_IDX_9BITS 255 #define MIN_EXT_IDX16BITS 256 #define MAX_EXT_IDX16BITS 65535 #define MIN_IDX_5BITS -16 #define MAX_IDX_5BITS 15 #define MIN_9BITS_NEG -256 #define MAX_9BITS_NEG -17 #define INMEDIATO '#' #define HEXADECIMAL '$' #define OCTAL '@' #define BINARIO '%' #define INDEXADO_INDIRECTO '[' int verificarRegistro(char *cadena); void verificarRangoIndexado_5_9_16bits(int num); void modoDireccionamiento(char *operando); void indexado_5bits_9bits_16bits(char *operando,int x); int convertir_a_numero(char *cadena); int main() { char *operando = "5,X"; modoDireccionamiento(operando); return 0; } void modoDireccionamiento(char *operando) { int car; car = operando[0]; switch(car) { case '-': x = 1; indexado_5bits_9bits_16bits(operando,x); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': x = 0; indexado_5bits_9bits_16bits(operando,x); break; default: } } void indexado_5bits_9bits_16bits(char *operando,int x) { int i,j,num; char *cadena = NULL,c[2],*cadena2 = NULL; cadena = calloc(6,sizeof(char)); cadena2 = calloc(2,sizeof(char)); for(i = x;operando[i] != ',';i++) { } for(j = i+1;operando[j] != '\0';j++) { } num = convertir_a_numero(cadena); if(x == 1) num = num*(-1); if(verificarRegistro(cadena2)) verificarRangoIndexado_5_9_16bits(num); else printf("\nRegistro invalido para modo de direccionamiento indexado Indirecto\n"); } int convertir_a_numero(char *cadena) { int i,j,entero,numero = 0,lon; int potencias[] = {1,10,100,1000,10000}; for(i = 0,j = lon-1;cadena[i] != '\0';i++,j--) { entero = cadena[i]-48; numero += entero*potencias[j]; } return numero; } void verificarRangoIndexado_5_9_16bits(int num) { if(num >= MIN_IDX_5BITS && num <= MAX_IDX_5BITS) printf("Indexado de 5 bits, (IDX)\n"); else if((num >= MIN_9BITS_NEG && num <= MAX_9BITS_NEG)||(num >= MIN_IDX_9BITS && num <= MAX_IDX_9BITS)) printf("Indexado de 9 bits, (IDX)\n"); else if(num >= MIN_EXT_IDX16BITS && num <= MAX_EXT_IDX16BITS) printf("Indexado de 16 bits, (IDX)\n"); else { printf("Error: El rango valido de un direccionamiento indexado de 5 bits es de -16 a 15\n"); printf("el de un direccionamiento indexado de 9 bits es de -256 a -17 y de 16 a 255\n"); printf("y el de un direccionamiento indexado de 16 bits es de 256 a 65535\n"); } } int verificarRegistro(char *cadena) { int i; char *registro[] = {"X","Y","SP","PC"}; for(i = 0;i < 4;i++) { if((strcmp(cadena ,registro [i ])) == 0) return 1; } return 0; }
y el direccionamiento que le tengo que agregar dice: Modo indexado de Pre/Post Incremento Decremento: sus valores númericos tienen rango de 1 a 8, después del valor debe de haber siempre una coma y después de la coma hay un signo positivo o negativo y despues el nombre de registro X,Y o SP, algo como: +X,-SP..O tambien puede tener primero el nombre del registro y despues el signo como: X+,SP- Pero no tengo una idea clara de como hacer las modificaciones al codigo que ya tengo para agregarle esto,el problema es que los registros despues de la coma son diferentes a los de los otros 3 direccionamientos, alguna idea?? gracias de antemano
|
|
« Última modificación: 5 Marzo 2014, 21:33 pm por m@o_614 »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
El código que usas para convertir a números es un poco raro... sobretodo porque arrastras el bit de negativo para hacer la conversión final en otro sitio diferente. Además, el offset en los 16 bits es siempre positivo... al menos según el enunciado que has copiado. He desacoplado los diferentes tipos de indexados para dotarlo de más flexibilidad y capacidad de crecimiento. #include <stdio.h> #include <stdlib.h> #include <string.h> #define _4BITS 0x0F #define MIN_IDX_5BITS -16 #define MAX_IDX_5BITS 15 #define MIN_IDX_9BITS -256 #define MAX_IDX_9BITS 255 #define MIN_IDX_16BITS 256 #define MAX_IDX_16BITS 65535 int verificarRegistro(char *cadena); void verificarRangoIndexado_5_9_16bits(int num); void modoDireccionamiento(char *operando); void indexado_5bits_9bits_16bits(char *operando,int x); int indexado_5bits( int offset, char* registro ); int indexado_9bits( int offset, char* registro ); int indexado_16bits( int offset, char* registro ); int indexado_indirecto( int offset, char* registro, int min, int max ); int indexado_preincremento( int offset, char* registro ); int indexado_postincremento( int offset, char* registro ); int convertir_a_numero(char *cadena); int main() { printf( "5 bits ----------\n"); char *operando = "15,X"; modoDireccionamiento(operando); operando = "-16,Y"; modoDireccionamiento(operando); printf( "9 bits ----------\n"); operando = "16,SP"; modoDireccionamiento(operando); operando = "-17,PC"; modoDireccionamiento(operando); operando = "255,X"; modoDireccionamiento(operando); operando = "-256,Y"; modoDireccionamiento(operando); printf( "16 bits ---------\n"); operando = "256,SP"; modoDireccionamiento(operando); operando = "65535,PC"; modoDireccionamiento(operando); printf( "preincremento ---\n"); operando = "8,+PC"; modoDireccionamiento(operando); operando = "4,-PC"; modoDireccionamiento(operando); printf( "postincremento --\n"); operando = "1,PC+"; modoDireccionamiento(operando); operando = "7,PC-"; modoDireccionamiento(operando); printf( "No validos -----\n" ); operando = "-6000,PC"; modoDireccionamiento(operando); operando = "200,A"; modoDireccionamiento(operando); operando = "24,+PC"; modoDireccionamiento(operando); return 0; } void modoDireccionamiento(char *operando) { char buffer[255]; int length = strlen( operando ); char* op1 = strtok( buffer , "," ); char* op2 = strtok( NULL , "," ); int continuar = 1; { int offset = convertir_a_numero( op1 ); continuar = !indexado_5bits( offset, op2 ); if ( continuar ) continuar = !indexado_9bits( offset, op2 ); if ( continuar ) continuar = !indexado_16bits( offset, op2 ); if ( continuar ) continuar = !indexado_postincremento( offset, op2 ); if ( continuar ) continuar = !indexado_preincremento( offset, op2 ); } if ( continuar ) printf( "Indexado no reconocido.\n" ); } int indexado_5bits( int offset, char* registro ) { int ok = indexado_indirecto( offset, registro, MIN_IDX_5BITS, MAX_IDX_5BITS ); if ( ok ) printf("Indexado de 5 bits, (IDX)\n"); return ok; } int indexado_9bits( int offset, char* registro ) { int ok = indexado_indirecto( offset, registro, MIN_IDX_9BITS, MAX_IDX_9BITS ); if ( ok ) printf("Indexado de 9 bits, (IDX)\n"); return ok; } int indexado_16bits( int offset, char* registro ) { int ok = indexado_indirecto( offset, registro, MIN_IDX_16BITS, MAX_IDX_16BITS ); if ( ok ) printf("Indexado de 16 bits, (IDX)\n"); return ok; } int indexado_indirecto( int offset, char* registro, int min, int max ) { int ok = ( offset >= min && offset <= max ); if ( ok ) ok = verificarRegistro( registro ); return ok; } int indexado_preincremento( int offset, char* registro ) { int ok = ( ( offset & _4BITS ) == offset ); if ( ok ) ok = (registro[0] == '-') || (registro[0] == '+'); if ( ok ) ok = verificarRegistro( registro + 1 ); if ( ok ) printf( "Indexado con preincremento, (IDX)\n" ); return ok; } int indexado_postincremento( int offset, char* registro ) { char buffer[10]; int ok = ( ( offset & _4BITS ) == offset ); if ( ok ) { int pos_inc = strlen( buffer ) - 1; ok = (buffer[pos_inc] == '-') || (buffer[pos_inc]=='+'); buffer[pos_inc] = 0; } if ( ok ) ok = verificarRegistro( buffer ); if ( ok ) printf( "Indexado con postincremento, (IDX)\n" ); return ok; } int convertir_a_numero(char *cadena) { int numero = 0; int index = 0; int neg = 0; if ( cadena[0] == '-' ) { neg = 1; index = 1; } for ( ; index < strlen(cadena ); index ++ ) { numero *= 10; numero += cadena[index] - '0'; } if ( neg ) numero *= -1; return numero; } int verificarRegistro(char *cadena) { int i; char *registro[] = {"X","Y","SP","PC"}; for(i = 0;i < 4;i++) { if((strcmp(cadena ,registro [i ])) == 0) return 1; } return 0; }
Salida: 5 bits ---------- Indexado de 5 bits, (IDX) Indexado de 5 bits, (IDX) 9 bits ---------- Indexado de 9 bits, (IDX) Indexado de 9 bits, (IDX) Indexado de 9 bits, (IDX) Indexado de 9 bits, (IDX) 16 bits --------- Indexado de 16 bits, (IDX) Indexado de 16 bits, (IDX) preincremento --- Indexado con preincremento, (IDX) Indexado con preincremento, (IDX) postincremento -- Indexado con postincremento, (IDX) Indexado con postincremento, (IDX) No validos ----- Indexado no reconocido. Indexado no reconocido. Indexado no reconocido. Dado que todas las funciones de comprobación de índices tienen la misma firma, se podría crear un puntero con todas las comprobaciones y ejecutarlas de forma iterativa en un bucle for... pero eso ya lo dejo de tu mano. Un saludo.
|
|
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
gracias eferion por tu respuesta, lo que yo estaba intentando hacer es como tengo una cadena por ejemplo "-64,SP" pues priimero el numero -64 lo tengo que convertir a int porque es una cadena, entonces agarro lo que se encuentra antes de la coma primero convierto el numero a entero y despues si veo que tiene el signo de menos lo multiplico por menos 1. como tengo diferentes rangos para los direccionamientos pero el registro( lo que va despues de la coma) es el mismo hago lo siguiente
primero verifico que el registro sea X,Y,SP o PC y despues veo en que rango se encuentra el numero para imprimir es de 5 bits, o es de 9 bits....
pero ahora tengo que hacer otro direccionamiento:
3,+SP-> imprime es de PreIncremento 3,SP+-> imprime es de PostIncremento 3,-SP-> imprime es de PreDecremento 3,SP- -> imprime es de PostDecremento
pero no se bien como hacerle, primero veo que tenga un signo al principio, y despues como le hago para que verifique los que tienen el signo al final?? alguna idea??
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
pero ahora tengo que hacer otro direccionamiento:
3,+SP-> imprime es de PreIncremento 3,SP+-> imprime es de PostIncremento 3,-SP-> imprime es de PreDecremento 3,SP- -> imprime es de PostDecremento
pero no se bien como hacerle, primero veo que tenga un signo al principio, y despues como le hago para que verifique los que tienen el signo al final?? alguna idea??
Si miras el código que te puesto verás que ya hace eso. Lo único que no discrimina entre incremento y decremento... pero es un cambio que lleva 2 minutos contados
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Direccionamiento indexado ASM
ASM
|
farresito
|
5
|
6,777
|
20 Agosto 2010, 08:43 am
por Eternal Idol
|
|
|
Tablas indexado de 8 bits.
Electrónica
|
Meta
|
4
|
4,204
|
29 Agosto 2010, 18:09 pm
por Tokes
|
|
|
robots.txt o indexado
Desarrollo Web
|
Mr.Blue
|
7
|
3,832
|
8 Noviembre 2010, 07:04 am
por WebMonster
|
|
|
modos de direccionamiento
Programación C/C++
|
m@o_614
|
7
|
3,869
|
24 Febrero 2014, 02:50 am
por m@o_614
|
|
|
Problema en archivo indexado
Programación C/C++
|
n-utz
|
0
|
1,654
|
22 Octubre 2016, 19:15 pm
por n-utz
|
|