elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Switch ignora caso existente y salta a default, ignorando casos predefinidos.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Switch ignora caso existente y salta a default, ignorando casos predefinidos.  (Leído 2,207 veces)
harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Switch ignora caso existente y salta a default, ignorando casos predefinidos.
« en: 26 Septiembre 2014, 21:07 pm »

Hola amigos, tengo un problema. Primero que nada describiré lo que intento hacer: Estoy desarrollando un desensamblador, especificamente este trozo de codigo trata sobre identificar los prefijos que poseen las instrucciones, y guardar en un archivo el prefijo encontrado. Este es un trozo resumido del codigo, y es donde está el problema.

Por ejemplo: Si yo llamo a la funcion show_prefixe(output_file, prefix_cs_override), la funcion trabaja bien, y imprime dentro del fichero la palabra "CS" tal como corresponde según mi tabla.

La funcion trabaja bien con todos los prefijos, excepto con los tres primeros: LOCK, REP y REPNE. No sé porque cuando llamo la funcion con los valores respectivos de cada uno, imprime "UNDEF" (caso por default si no consigue ningun case para ese valor). No entiendo porque toma el caso por default, si existen casos respectivos para cada prefijo (LOCK, REP, y REPNE)

He estado dando vueltas, pero aún no consigo ayuda. Espero que ustedes me ayuden a descifrar este misterioso problema. Aqui va el codigo.

Código
  1. #include <stdio.h>
  2.  
  3. ///Prefixes lock and repeat (group one)
  4.  
  5. #define prefix_lock 0xF0
  6. #define prefix_repne 0xF2
  7. #define prefix_rep 0xF3
  8.  
  9. ///Prefixes segmet override (group two)
  10. #define prefix_cs_override 0x2E
  11. #define prefix_ss_override 0x36
  12. #define prefix_ds_override 0x3E
  13. #define prefix_es_override 0x26
  14. #define prefix_fs_override 0x64
  15. #define prefix_gs_override 0x65
  16.  
  17. ///Branch hints goes here.
  18.  
  19. ///Operand-size override (group three)
  20. #define prefix_operand_size_override 0x66
  21.  
  22. ///Address-size override (group four)
  23. #define prefix_address_size_override 0x67
  24.  
  25.  
  26.  
  27. int show_prefixe(FILE *my_output, char prefix){
  28.    switch(prefix){
  29.        case prefix_lock:
  30.            fprintf(my_output, "LOCK ");
  31.            break;
  32.        case prefix_repne:
  33.            fprintf(my_output, "REPNE ");
  34.            break;
  35.        case prefix_rep:
  36.            fprintf(my_output, "REP ");
  37.            break;
  38.        case prefix_ss_override:
  39.            fprintf(my_output, "SS ");
  40.            break;
  41.        case prefix_cs_override:
  42.            fprintf(my_output, "CS ");
  43.            break;
  44.        case prefix_ds_override:
  45.            fprintf(my_output, "DS ");
  46.            break;
  47.        case prefix_es_override:
  48.            fprintf(my_output, "ES ");
  49.            break;
  50.        case prefix_fs_override:
  51.            fprintf(my_output, "FS ");
  52.            break;
  53.        case prefix_gs_override:
  54.            fprintf(my_output, "GS ");
  55.            break;
  56.        case prefix_operand_size_override:
  57.            fprintf(my_output, "OP ");
  58.            break;
  59.        case prefix_address_size_override:
  60.            fprintf(my_output, "ADDR ");
  61.            break;
  62.        default:
  63.            fprintf(my_output, "UNDEF ");
  64.            break;
  65.    }
  66. }
  67.  
  68. int main()
  69. {
  70.    FILE *output;
  71.    output = fopen("C:\\prefix.asm", "wb");
  72.    show_prefixe(output, prefix_rep);
  73.    fclose(output);
  74.    return 0;
  75. }
  76.  
  77.  

¿Será que el compilador tiene bugs? No sé, lo pregunto porque no estoy usando la ultima version, solo estoy usando la previa a la ultima. No sé realmente que ocurre.

Gracias de antemano por su ayuda.


En línea

Vista mi blog es enriquemesa.blogspot.com
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Switch ignora caso existente y salta a default, ignorando casos predefinidos.
« Respuesta #1 en: 27 Septiembre 2014, 02:41 am »

Lo primero: cuando tengas una duda o problema con un programa en C o C++ utiliza el foro apropiado: Programación C/C++.

----

El problema que mencionas se genera con la llamada:
Código
  1. ///Prefixes lock and repeat (group one)
  2.  
  3. #define prefix_lock 0xF0
  4. #define prefix_repne 0xF2
  5. #define prefix_rep 0xF3
  6.  
  7. /* ... */
  8.  
  9. show_prefixe(output, prefix_rep); /* prefix_rep == 0xF3 == 243 */
La función "show_prefixe" la defines como una cuyo segundo parámetro es de tipo char y este es, usualmente, equivalente al tipo signed char con (de nuevo usualmente) ocho bits, complemento a dos para representar los negativos y un rango valido de -128 a 127.

¿Que pasa cuando un valor de tipo signed int como 0xF3 (decimal 243) se convierte al tipo signed char y esta fuera de su rango valido? Buena pregunta.

Para solucionar el problema en tu programa base solo tienes que cambiar el tipo del mentado parámetro a unsigned char, por supuesto en el programa original la lectura también debe realizarse de la misma forma (leyendo todos los caracteres como caracteres sin signo).

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Re: Switch ignora caso existente y salta a default, ignorando casos predefinidos.
« Respuesta #2 en: 27 Septiembre 2014, 04:51 am »

Gracias rir3760!! No sabía que había mucha diferencia entre un char con signo o sin signo!! Entonces, ¿Será que si hago el mismo switch pero enteros con signo y otros con signo, puede que algunos valores los interprete mal?

Saludos. Gracias por tu ayuda.
En línea

Vista mi blog es enriquemesa.blogspot.com
xv0


Desconectado Desconectado

Mensajes: 1.026



Ver Perfil
Re: Switch ignora caso existente y salta a default, ignorando casos predefinidos.
« Respuesta #3 en: 27 Septiembre 2014, 16:16 pm »

Gracias rir3760!! No sabía que había mucha diferencia entre un char con signo o sin signo!! Entonces, ¿Será que si hago el mismo switch pero enteros con signo y otros con signo, puede que algunos valores los interprete mal?

Saludos. Gracias por tu ayuda.

No hace falta que utilices variables int, ya que estas trabajando con enteros de 1 byte, y char reserva 1 byte en memoria asi que seria correcto. Un int seria para enteros con mas longitud.

Creo que no entendiste lo que explico el usuario @rir3760, voy a decirtelo con mis palabras.

Si tu declaras un char, puedes almacenar el int de 1 byte que quieras, pero si este pasa de 0x7f (127), se entendera de que este es negativo, se entiende? Vamos que si tienen el bit 7 en 1, representa que es negativo.

Con un unsigned char, representa que es de 0 a 255, eso significa que todos los numeros seran positivos, con un signed el mayor numero positivo que puedes tener es 127.

Como tu declaraste un char, y esos bytes tienen el bit 7 en 1, pues se reconoceran como numeros negativos, no como positivos.

Código
  1. 0xF0 >>> 240 >>> -16
  2. 0xF2  >>>>> 242 >>> -14
  3. 0xF3  >>>>> 243 >>> -13

Un saludo.
« Última modificación: 27 Septiembre 2014, 16:17 pm por cpu2 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines