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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Diseño de Ensamblador
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Diseño de Ensamblador  (Leído 3,160 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Diseño de Ensamblador
« en: 9 Diciembre 2013, 16:56 pm »

Saludos

tengo que crear un programa que identifique las partes de una línea en lenguaje ensamblador, y para esto me dicen que necesito tener un archivo de texto creado previamente y

Leer línea a línea el archivo, pudiendo:
a. Leer cada línea directamente del archivo, de una por una y procesar cada línea que se va leyendo.
b. Leer todo el archivo con un ciclo y conforme se lee el archivo almacenarlo en una estructura de datos temporal, posteriormente leer de esta estructura de datos

Me dice que en ambos casos hay ventajas y desventajas. Deberás elegir la que sea más conveniente, recuerda que el  programa debe de irse completando con las siguientes practicas.

¿cuales son estas ventajas y desventajas?,¿Cuál de estas opciones es la mejor y la más fácil de implementar?, No quiero que me hagan la tarea solo que me den una ligera idea de como seria

gracias


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Diseño de Ensamblador
« Respuesta #1 en: 9 Diciembre 2013, 17:59 pm »

La primera le llamo yo "streaming" y tiene la ventaja que te sirve para cualquier tamaño de archivo.

La segunda es más rápida, ya que vuelcas el archivo en la memoria y trabajas todo el tiempo desde allí. Claro que esto funciona si el archivo es de unos kb, no vas a volcar un archivo de 2gb en la memoria.

Las dos tienen la misma dificultad de implementación, yo me quedaría con la primera.


« Última modificación: 9 Diciembre 2013, 18:04 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Diseño de Ensamblador
« Respuesta #2 en: 10 Diciembre 2013, 02:03 am »

Muchas gracias amchacon por tu respuesta, otra duda:

en la segunda opción me dice que lea todo el archivo en un solo ciclo, y que lo guarde  en una estructura, ¿con esto se refiere a que ya no voy a leer el archivo línea por línea?, o sea voy a tener que almacenar el archivo completo en la estructura y en la primera opción trabajo línea con línea sin almacenar nada?

Es que yo pensé que la mejor opción sería ir guardando línea por línea en un arreglo, y después hacer las validaciones de las palabras que están en los arreglos.

de antemano gracias
« Última modificación: 10 Diciembre 2013, 02:53 am por m@o_614 » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Diseño de Ensamblador
« Respuesta #3 en: 10 Diciembre 2013, 12:21 pm »

Es que yo pensé que la mejor opción sería ir guardando línea por línea en un arreglo, y después hacer las validaciones de las palabras que están en los arreglos.
Pero entonces pierdes la ventaja de la velocidad al leerlo línea a línea, para eso usas el primer método y te ahorras el gasto de memoria.

Hay muchas formas de volcar un archivo, te lo pongo como lo haría yo (volcandolo en un stringstream y listo):

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    ifstream archivo("main.cpp");
  9.    stringstream archivo2;
  10.  
  11.    archivo2<<archivo.rdbuf(); // volcar contenido en stream
  12.  
  13.    cout<<archivo2.str(); // .str() devuelve el string que se encuentra almacenado
  14.    return 0;
  15. }

http://imageshack.us/photo/my-images/801/f04f.png/

Como veras en la imagen, he volcado el archivo del código en el stringstream.

La ventaja que tiene usar un stringstream, esque puedes seguir usando las funciones de getline() y el operador <<, lo que te hace el trabajo más comodo. Si lo volcases en un char*/string a secas tendrías que detectar los saltos de línea a mano.
« Última modificación: 10 Diciembre 2013, 12:23 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Diseño de Ensamblador
« Respuesta #4 en: 11 Diciembre 2013, 02:34 am »

 :o nunca se me hubiera ocurrido hacerlo de esa manera, de hecho no sabía ni que era un stringstream y tampoco había visto las funciones rdbuf()... yo pense que iba a ser más fácil la implementación de la segunda opción, ir leyendo el archivo linea por linea e ir guardando en un buffer el tamaño(num de caracteres) de cada línea del archivo, y despues volver a leer el archivo pero esta vez dando brincos del tamaño de cada línea con el fseek(),para guardalos en otro buffer,pero el problema es que en la segunda función se cicla y no me hace lo que le pido, no entiendo por qué??

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4.  
  5. void verificarLineas(FILE *fd,int buffer[],int renglon);
  6.  
  7. int main()
  8. {
  9.    FILE *fd;
  10.    int car,tam,renglon = 0,buffer[MAX];
  11.    if((fd = fopen("P1ASM.txt","r"))!= NULL)
  12.    {
  13.        while((car = fgetc(fd))!= EOF)
  14.        {
  15.            tam = 0;
  16.            fseek(fd,-1,SEEK_CUR);
  17.            while((car = fgetc(fd))!= '\n'&&(!feof(fd)))
  18.            {
  19.                tam++;
  20.                printf("%c",car);
  21.            }
  22.            printf("*%d\n",tam+1);
  23.            buffer[renglon++] = tam;
  24.        }
  25.        verificarLineas(fd,buffer,renglon);
  26.    }
  27.    else
  28.       printf("No se pudo abrir el archivo");
  29.    return 0;
  30. }
  31.  
  32. void verificarLineas(FILE *fd,int buffer[],int renglon)
  33. {
  34.    int i = 0;
  35.    char *linea;
  36.    fseek(fd,0,SEEK_SET);
  37.    while(!feof(fd))
  38.    {
  39.        linea = (char*)malloc(buffer[i]*sizeof(char));
  40.        fgets(linea,buffer[i]+1,fd);
  41.        printf("%s\n",linea);
  42.        fseek(fd,buffer[i]+1,SEEK_CUR);
  43.        free(linea);
  44.        i++;
  45.    }
  46. }
  47.  

gracias
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Diseño de Ensamblador
« Respuesta #5 en: 11 Diciembre 2013, 11:43 am »

Ah usas C, creía que usabas C++. Entonces no he hecho más que confudirte  :silbar:

En C lo haría tal que así:

Código
  1. FILE* archivo = fopen("PLASM.txt","r");
  2.  
  3. fseek(archivo,0,SEEK_END);
  4. long tamanyo = ftell(archivo);
  5. fseek(archivo,0,SEEK_SET);
  6.  
  7. char* cadena = malloc(tamanyo);
  8. fread (cadena,tamanyo,1,archivo);
  9. fclose(archivo);

El método que tú dices es rizar el rizo, y tampoco es eficiente ni nada. Quizás lo más cómodo para ti sea la primera opción:

Código
  1. FILE* archivo = fopen("PLASM.txt","r");
  2. char cadena[256];
  3.  
  4. while (!feof(archivo))
  5. {
  6.     fgets(cadena,255,archivo); // lee una línea del archivo, máximo a leer 255 caracteres
  7.  
  8.    // haz lo que quieras con esta linea
  9.  
  10. }
  11.  
  12. fclose(archivo);
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Diseño de Ensamblador
« Respuesta #6 en: 11 Diciembre 2013, 19:12 pm »

muchas gracias amchacon yo creo que si voy a intentar hacerlo de la primera manera, solo que como en las especificaciones del programa venia que tengo que verificar si la línea es comentario, ETIQUETA, CODIGO DE OPERACION Y OPERANDOS. y para cada uno son como 6 especificaciones pense que seria más fácil si lo guardaba en una estructura, de la segunda manera ya vi cual era mi problema y lo corregi solo que me queda una duda:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4.  
  5. void verificarLineas(FILE *fd,int buffer[],int renglon);
  6.  
  7. int main()
  8. {
  9.    FILE *fd;
  10.    int car,tam,renglon = 0,buffer[MAX];
  11.    if((fd = fopen("P1ASM.txt","r"))!= NULL)
  12.    {
  13.        while((car = fgetc(fd))!= EOF)
  14.        {
  15.            tam = 0;
  16.            fseek(fd,-1,SEEK_CUR);
  17.            while((car = fgetc(fd))!= '\n'&&(!feof(fd)))
  18.            {
  19.                tam++;
  20.                printf("%c",car);
  21.            }
  22.            printf("\n");
  23.            buffer[renglon++] = tam;
  24.        }
  25.        verificarLineas(fd,buffer,renglon);
  26.    }
  27.    else
  28.       printf("No se pudo abrir el archivo");
  29.    return 0;
  30. }
  31.  
  32. void verificarLineas(FILE *fd,int buffer[],int renglon)
  33. {
  34.    int i = 0,lon;
  35.    char *linea;
  36.    fseek(fd,0,SEEK_SET);
  37.    printf("\n");
  38.    while(!feof(fd))
  39.    {
  40.        lon = buffer[i]+1;//tamaño de buffer mas el salto de linea
  41.        linea = (char*)malloc((lon+1)*sizeof(char));//lon mas el caracter '\0'
  42.        fgets(linea,lon,fd);
  43.        printf("%s",linea);
  44.        free(linea);
  45.        i++;
  46.    }
  47. }

de esta manera me imprime algunas  lineas con basura pero si esta linea de codigo la cambio y le pongo lon+1, ya me imprime correctamente, por que es esto??

Código
  1. lon = buffer[i]+1;//tamaño de buffer mas el salto de linea
  2.        linea = (char*)malloc((lon+1)*sizeof(char));//lon mas el caracter '\0'
  3.        fgets(linea,lon+1,fd);
  4.        printf("%s",linea);
  5.        free(linea);
  6.        i++;
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Diseño de Ensamblador
« Respuesta #7 en: 12 Diciembre 2013, 00:30 am »

Pero si has puesto tú mismo la explicación:
Código
  1. linea = (char*)malloc((lon+1)*sizeof(char));//lon mas el caracter '\0'

¿?
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Diseño de Ensamblador
« Respuesta #8 en: 12 Diciembre 2013, 17:42 pm »

jaja cierto no me fije bien, ahora ya estoy empezando a hacer de nuevo el código como me dijiste con la primera opción, pero tengo una duda, por ejemplo si tengo una línea que es un comentario

;comentario numero1

y las instrucciones me dicen:
Las líneas de comentarios tienen las siguientes reglas:
a. empiezan con el caracter ;
b. ese caracter solo se puede encontrar en la primera posicion
c. Después del carácter ; puede seguir cualquier caracter, letras,digitos,etc..

pero si tengo la función de verificación asi:

Código
  1. int esComentario(FILE *fd)
  2. {
  3.    int car,continuar = 1;
  4.    while((car = fgetc(fd))!= '\n')
  5.    {
  6.        if(car == ';')
  7.           return 0;
  8.    }
  9.    return 1;
  10. }

el programa no me va a recorrer todo la línea de código en caso de que se encuentre un ; intermedio y me returne inmediatamente que no es comentario, pero como le puedo hacer para que me lea todaaa la línea y que no solo se regrese con el return en los casos en que no es línea de comentario?? esto lo quiero hacer para que me vaya leyendo línea por línea desde el principio y para esto el while tiene que hacer completo el ciclo hasta que se encuentre el '\n'

gracias de nuevo
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ensamblador
Electrónica
marcela 0 2,636 Último mensaje 30 Mayo 2005, 19:23 pm
por marcela
ensamblador
Ingeniería Inversa
CYPRESSKILL 2 3,106 Último mensaje 21 Noviembre 2005, 00:09 am
por CYPRESSKILL
Ensamblador en .NET
.NET (C#, VB.NET, ASP)
DragonFire 6 6,328 Último mensaje 19 Agosto 2006, 05:51 am
por JuanK_Solocodigo
Diseño de equipo para diseño tecnico.
Hardware
SuXoR 3 3,678 Último mensaje 20 Octubre 2010, 15:06 pm
por 4rm4ndo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines