Ensamblador - Leer archivo de texto x86

 
Vista:
sin imagen de perfil

Leer archivo de texto x86

Publicado por angel (4 intervenciones) el 11/04/2014 06:05:30
Hola gente! me encontré este código por ahí que lee archivos de texto, pero no lo hace muy bien lo que pasa es que cuando le pongo la cantidad de caracteres y son mas de 29 me imprime basura al final y cuando son mas de 80 se queda pegado, espero que me puedan ayudar, gracias de antemano.

Aquí dejo el codigo


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
SegPila Segment para Stack 'Stack'
     db 64 Dup ('SegStack ')
SegPila EndS
 
SDatos Segment para 'Data'
 
 
archivo db "archivo.txt", 0 ;ascii del nombre del archivo
leido db "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
handle dw ? ;identificador del arhivo
 
SDatos EndS
 
 
CSeg Segment para public 'Code'	;Define el segmento de código paragraph tasm.
 Begin:
      Assume CS:SDatos, SS:SegPila	;Asignación de los segmentos a los registro de segmentos del CPU.
 
                        ;Va a reservar la dirección del PSP en el ES.
 
       xor    ax,ax		;Pone en cero al reg ax.
       mov    ax,SDatos		;Mueve la posición de SData al reg ax.
       mov    DS,ax		;Mueve la posición de ax (SData) al reg DS.
 
 
 mov al, 0h ;modo de acceso para abrir arhivo, modo lectura/escritura
 mov dx, offset archivo ;offset lugar de memoria donde esta la variable
 mov ah, 3dh ;se intenta abrir el archivo
 int 21h ;llamada a la interrupcion DOS
 
 
 mov handle, ax ;si no paso mover a lo que le dio el SO
 
 
 mov bx, handle
 mov cx, 79h ;<---- cantidad de caracteres que lee del archivo
 mov dx, offset leido ;<--- pasa al dx lo que hay en el archhivo
 mov ah, 3fh
 int 21h
 
 ;cerramos archivo
 mov bx, handle
 mov ah, 3eh
 int 21h
 
 ;imprimir el contenido de leido
 mov dx, offset leido ;
  mov ah, 9
 int 21h
 
 
		xor ax,ax		;Limpia el al y prepara el ah para la salida.
       mov ax,4c00h 	;Servicio AH=4c int 21h para salir del programa.
       int 21h	   		;Llamada al DOS. Termine el programa.
CSeg EndS 			;Fin del segmento de código.
 
End Begin
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Leer archivo de texto x86

Publicado por Pico (50 intervenciones) el 11/04/2014 12:00:13
Todo el secreto está ahí

leido db "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"

ahí reservas la memoria donde ha de poner el dos los datos leídos. Si le pones más de 29, como no hay sitio más que para 29, te sales de la zona de memoria reservada y te pones a imprimir más de la cuenta. La basura son esos datos que están después de esa posición 29 del leido, y la función de imprimir del dos no para hasta que se encuentre un carácter '$'. Si pones 80 seguramente escribas encima de la pila, por lo que el programa se queda colgado.

Solución : leido db 81 dup (24h) ; para leer 80 caracteres como máximo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Leer archivo de texto x86

Publicado por angel (4 intervenciones) el 12/04/2014 01:11:27
Gracias!!!! me ayudaste un montón!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Leer archivo de texto x86

Publicado por Leonel (1 intervención) el 11/08/2014 03:20:15
hola, ese codiigo esta muy bien , me han puesto un problema en el cual debo leer un archivo y contar por ejemplo cuantas veces aparece una palabra que escriba , por ejemplo si pongo "sol" y el achivo dice el "el solitario sol solamente espera" debe mostrarme en pantalla el texto del archivo, la palabra que busque y la cantidad de veces que aparecio.


como hago eso ????????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar