• Domingo 22 de Diciembre de 2024, 15:48

Autor Tema:  Error Al Escribir En Archivo Desde Asm  (Leído 3914 veces)

blend

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Error Al Escribir En Archivo Desde Asm
« en: Jueves 29 de Noviembre de 2007, 00:16 »
0
que tal banda, si alguien puede ayudarme se los agradeceria infinitamente.

El problema es que estoy haciendo un program que guarde datos en un archivo externo, y si lo hago, pero el problema es que me imprime la cadena que yo escribo, pero enseguida imprime mas caracteres, por ejemplo, en mi seccion de datos tengo esto:

Código: Text
  1. ARCHIVO     DB  'datos.txt',0   &#59;NOMBRE DEL ARCHIVO
  2. HANDLED     DW  ?               &#59;PARA EL HANDLED DEL ARCHIVO
  3. VARMENU     DB  0AH,0DH,'1.- CONSULTA'
  4.             DB  0AH,0DH,'2.- ALTA'
  5.             DB  0AH,0DH,'3.- BUSQUEDA'
  6.             DB  0AH,0DH,''
  7.             DB  0AH,0DH,'TECLEA OPCION ','$'
  8.  
  9. DATOS       LABEL   BYTE
  10. LONGMAX     DB  20
  11. NOMLONG      DB  ?
  12. BUFFER      DB  21 DUP (32)
  13. MSGNOM      DB  'Nombre: ','$'
  14.  
  15. MSGFERROR1  DB  'ERROR AL ABRIR ARCHIVO !!!','$'
  16. MSGFERROR2  DB  'ERROR AL ESCRIBIR EN ARCHIVO !!!','$'
  17. MSGFERROR3  DB  'ERROR AL CERRAR EL ARCHIVO !!!','$'
  18.  

y al ejecutar mi archivo ASM en el archivo txt me guarda esto:

Citar
LOQUEYOTECLEO
               Nombre: $ERROR AL ABRIR ARCHIVO !!!$ERROR AL ESC

Espero que me puedan hechar una mano, si alguien se interesa, aqui coloco todo mi codigo

Código: Text
  1.  
  2. PAGE 60, 132
  3. TITLE   ALTAS, BAJAS Y CONSULTAS
  4.  
  5. ;-------------------------------------------------------------------
  6. ;VARIABLES DIRECTAS
  7. ;
  8. BIOS    EQU 10H    &#59;INTERRUPCION DEL BIOS
  9. DOS     EQU 21H    &#59;INTERRUPCION DEL DOS
  10.  
  11. TEC1    EQU 49     &#59;DEFINICION DE LA TECLA '1'
  12. TEC2    EQU 50     &#59;DEFINICION DE LA TECLA '2'
  13. TEC3    EQU 51     &#59;DEFINICION DE LA TECLA '3'
  14. ESKP    EQU 27     &#59;DEFINICION DE LA TECLA 'ESC'
  15.  
  16. .MODEL SMALL
  17. .STACK
  18. .DATA
  19.  
  20. ;-------------------------------------------------------------------
  21. ; MENSAJES DEL MENU (VARIABLES)
  22. ;
  23.  
  24.  
  25.  
  26. ARCHIVO     DB  'datos.txt',0   &#59;NOMBRE DEL ARCHIVO
  27. HANDLED     DW  ?               &#59;PARA EL HANDLED DEL ARCHIVO
  28. VARMENU     DB  0AH,0DH,'1.- CONSULTA'
  29.             DB  0AH,0DH,'2.- ALTA'
  30.             DB  0AH,0DH,'3.- BUSQUEDA'
  31.             DB  0AH,0DH,''
  32.             DB  0AH,0DH,'TECLEA OPCION ','$'
  33.  
  34. DATOS       LABEL   BYTE
  35. LONGMAX     DB  20
  36. NOMLONG      DB  ?
  37. BUFFER      DB  21 DUP (32)
  38. MSGNOM      DB  'Nombre: ','$'
  39.  
  40. MSGFERROR1  DB  'ERROR AL ABRIR ARCHIVO !!!','$'
  41. MSGFERROR2  DB  'ERROR AL ESCRIBIR EN ARCHIVO !!!','$'
  42. MSGFERROR3  DB  'ERROR AL CERRAR EL ARCHIVO !!!','$'
  43.  
  44.  
  45.  
  46. .CODE
  47.            
  48. ;*******************************************************************
  49. ;*                                                                 *
  50. ;* PROCEDIMIENTO PRINCIPAL                                         *
  51. ;*                                                                 *
  52. ;*******************************************************************
  53.  
  54. ;-------------------------------------------------------------------
  55. ;PROCEDIMIENTO PRINCIPAL (FAR)
  56. ;
  57. BEGIN   PROC    FAR
  58.         MOV     AX, @DATA
  59.         MOV     DS, AX
  60.         CALL    FOPENH
  61.     INI:
  62.         CALL    MENU
  63.         CALL    FPUT
  64.         CALL    FCLOSEH
  65.                                &#59;JMP     INI
  66.     FIN:
  67.         MOV     AH, 4CH
  68.         INT     DOS
  69. BEGIN   ENDP
  70.  
  71. ;*******************************************************************
  72. ;*                                                                 *
  73. ;* PROCEDIMIENTOS PARA EL MANEJO DEL ARCHIVO                       *
  74. ;*                                                                 *
  75. ;*******************************************************************
  76.  
  77. ;-------------------------------------------------------------------
  78. ;PROCEDIMIENTO PARA ABRIR UN ARCHIVO EMPLEANDO HANDLED
  79. ;
  80. FOPENH  PROC    NEAR
  81.         LEA     DX, ARCHIVO&#59;NOMBRE DEL ARCHIVO
  82.         MOV     AH, 3DH    &#59;SERVICIO PARA ABRIR ARCHIVO
  83.         MOV     AL, 01     &#59;TIPO DE PERMISO
  84.                            &#59;00 -> SOLO LECTURA
  85.                            &#59;01 -> SOLO ESCRITURA
  86.                            &#59;02 -> LECTURA YE ESCRITURA
  87.         INT     DOS
  88.         JB      FERROR1
  89.         MOV     [HANDLED], AX   &#59;GUARDAR HANDLE
  90.         RET
  91. FOPENH  ENDP
  92.  
  93. ;-------------------------------------------------------------------
  94. ;PROCEDIMIENTO PARA CERRAR UN ARCHIVO EMPLEADO HANDLED
  95. ;
  96. FCLOSEH PROC    NEAR
  97.         MOV     AH, 3EH
  98.         MOV     BX, [HANDLED]
  99.         INT     DOS
  100.         JB      FERROR3
  101.         RET
  102. FCLOSEH ENDP
  103.  
  104. ;-------------------------------------------------------------------
  105. ;PROCEDIMIENTO PARA ESCRIBIR EN EL ARCHIVO EMPLEADO HANDLED
  106. ;
  107. FPUT    PROC    NEAR
  108.         MOV     AH, 40H        &#59;SERVICIO PARA ESCRIBIR EN ARCHIVO
  109.         MOV     BX, [HANDLED]
  110.         LEA     CX, LONGMAX    &#59;NUMERO DE BYTES A ESCRIBIR
  111.         LEA     DX, BUFFER     &#59;DATO A ESCRIBIR
  112.         INT     DOS
  113.         JB      FERROR2
  114.         RET
  115. FPUT    ENDP
  116.  
  117. ;*******************************************************************
  118. ;*                                                                 *
  119. ;* PROCEDIMIENTOS PARA EL MENU                                     *
  120. ;*                                                                 *
  121. ;* 1.- CONSULTA                                                    *
  122. ;* 2.- ALTA                                                        *
  123. ;* 3.- BUSQUEDA                                                    *
  124. ;*                                                                 *
  125. ;* TECLEA OPCION                                                   *
  126. ;*******************************************************************
  127.  
  128. ;-------------------------------------------------------------------
  129. ;PROCEDIMIENTO PARA MOSTRAR MENU Y ESPERAR A QUE SELECCIONE
  130. ;EN CASO DE OPRIMIR 'ESC', SALDRA DEL PROGRAMA
  131. ;
  132. MENU    PROC    NEAR
  133.         CALL    CLR        &#59;LIMPIAR PANTALLA
  134.         LEA     DX, VARMENU&#59;CARGAR MENSAJE DE MENU
  135.         MOV     AH, 09H    &#59;IMPRIME LO QUE ESTE EN DX
  136.         INT     DOS
  137.         MOV     AH, 07H    &#59;LEER CARACTER SIN IMPRESION
  138.         INT     DOS        &#59;GUARDANDO EL CARACTER
  139.         CALL    LEERCRC    &#59;PROCEDIMIENTO PARA LEER CARACTER    
  140.         RET
  141. MENU    ENDP
  142.  
  143. ;-------------------------------------------------------------------
  144. ;PROCEDIMIENTO PARA LEER LA OPCION
  145. ;
  146. LEERCRC PROC    NEAR
  147.         CMP     AL, TEC2   &#59;Z SE ACTIVA SI EL RESULTADO ES CERO
  148.         JE      ALT        &#59;SI Z SE ACTIVA SE REALIZA EL SALTO
  149.         CMP     AL, ESKP
  150.         JE      FIN
  151.     ALT:
  152.         CALL    CLR
  153.         CALL    CUR
  154.         MOV     AH, 09H
  155.         LEA     DX, MSGNOM &#59;IMPRIMIR MENSAJE 'NOMBRE: '
  156.         INT     DOS
  157.         MOV     AH, 0AH    &#59;ENTRADA DESDE TECLADO
  158.         LEA     DX, DATOS
  159.         INT     DOS
  160.         RET    
  161. LEERCRC ENDP
  162.  
  163. ;*******************************************************************
  164. ;*                                                                 *
  165. ;* PROCEDIMIENTOS PARA MENSAJES DE ERROR O EXITO                   *
  166. ;*                                                                 *
  167. ;*******************************************************************
  168.  
  169. ;-------------------------------------------------------------------
  170. ;PROCEDIMIENTO PARA ERROR AL ABRIR ARCHIVO
  171. ;
  172. FERROR1 PROC    NEAR
  173.         CALL    CLR
  174.         LEA     DX, MSGFERROR1
  175.         MOV     AH, 09H
  176.         INT     DOS
  177.         RET
  178. FERROR1 ENDP
  179.  
  180. ;-------------------------------------------------------------------
  181. ;PROCEDIMIENTO PARA ERROR AL ABRIR ARCHIVO
  182. ;
  183. FERROR2 PROC    NEAR
  184.         CALL    CLR
  185.         LEA     DX, MSGFERROR2
  186.         MOV     AH, 09H
  187.         INT     DOS
  188.         RET
  189. FERROR2 ENDP
  190.  
  191. ;-------------------------------------------------------------------
  192. ;PROCEDIMIENTO PARA ERROR AL ABRIR ARCHIVO
  193. ;
  194. FERROR3 PROC    NEAR
  195.         CALL    CLR
  196.         LEA     DX, MSGFERROR3
  197.         MOV     AH, 09H
  198.         INT     DOS
  199.         RET
  200. FERROR3 ENDP
  201.  
  202. ;*******************************************************************
  203. ;*                                                                 *
  204. ;* PROCEDIMIENTOS VARIOS                                           *
  205. ;*                                                                 *
  206. ;*******************************************************************
  207.  
  208. ;-------------------------------------------------------------------
  209. ;PROCEDIMIENTO PARA LIMPIAR PANTALLA
  210. ;
  211.  
  212. CLR     PROC    NEAR
  213.         MOV     AH, 06H    &#59;SERVICIO PARA RECORRER PANTALLA
  214.         MOV     BH, 03H    &#59;COLOR
  215.         MOV     CX, 0000H  &#59;POSICION INICIAL (DE - )
  216.         MOV     DX, 184FH  &#59;POSICION FINAL ( - A)
  217.         INT     BIOS
  218.         RET
  219. CLR     ENDP
  220.  
  221. ;-------------------------------------------------------------------
  222. ;PROCEDIMIENTO PARA POSICIONAR CURSOR AL PRINCIPIO
  223. ;
  224.  
  225. CUR   PROC  NEAR
  226.     MOV    AH,  02H
  227.     MOV    BH,  00
  228.     MOV     DX, 0000
  229.     INT    BIOS
  230.     RET
  231. CUR   ENDP
  232.         END     BEGIN
  233.  
  234.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Escribir En Archivo Desde Asm
« Respuesta #1 en: Jueves 29 de Noviembre de 2007, 10:20 »
0
En FPUT usas la direccion de memoria de LONGMAX, deberias usar el tamaño de la cadena a escribir, ni siquiera el valor de LONGMAX seria correcto. Ademas no veo donde estas usando BUFFER excepto en FPUT, deberias primero asignarle sus caracteres ...

Depuralo para ver esto mejor (cosa que yo no hice).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

blend

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Error Al Escribir En Archivo Desde Asm
« Respuesta #2 en: Lunes 3 de Diciembre de 2007, 04:37 »
0
Primero una disculpa por responder hasta hoy.

Citar
En FPUT usas la direccion de memoria de LONGMAX, deberias usar el tamaño de la cadena a escribir

intente hacer eso y da el mismo resultado

Citar
Ademas no veo donde estas usando BUFFER excepto en FPUT, deberias primero asignarle sus caracteres ...

De hecho yo tambien pense lo mismo, por que el profe solo asi lo hizo y no nos explico bien, pero despues de indagar tengo una respuesta, cuando se define una variable de tipo LABEL, esta se comporta como una estructura en C. Cuando se llama al servicio 0AH del DOS para leer una cadena se tiene esto:

BX : LONGITUD MAXIMA A LEER
CX : SE GUARDA LA CANTIDAD DE BYTES ESCRITOS
DX : DIRECCION EN DONDE SE GUARDARA LO TECLEADO

entonces cuando yo hago

DATOS LABEL BYTE
MAX     DB      10
LONG   DB       ?
NOM     DB       ?


MOV   DX, DATOS
MOV   AH, 0AH
INT     21H

entonces a mi entender  :blink:  (y que asi es como sucede), se toma de MAX los caracteres a leer, en LONG se guardara el numero de caracteres escritos y por ultimo en NOM se guarda la cadena, y cuando quiera imprimir la cadena solamente mandare a imprimir la variable NOM (NOTA: antes de hacer esto se tiene que agregar a esa variable al final el caracter de salida $) y ya esta.

Eso es todo, pero te agradesco esa observacion por que ni siquiera me habia dado cuenta y me puse a investigarlo XD.

Y hacerca de mi problema inicial sobre el error al escribir en el archivo, ya lo he solucionado, no de la mejor manera que yo hubiera querido, pero almenos ya quedo, aunque no me doy por vencido y sigo practicando  :comp:

gracias...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Escribir En Archivo Desde Asm
« Respuesta #3 en: Lunes 3 de Diciembre de 2007, 09:29 »
0
Cita de: "blend"
intente hacer eso y da el mismo resultado

http://www.ctyme.com/intr/rb-2791.htm

No depure el programa, en realidad ni siquiera intente ensamblarlo, solo vi eso que era muy evidente.

Cita de: "blend"
De hecho yo tambien pense lo mismo, por que el profe solo asi lo hizo y no nos explico bien, pero despues de indagar tengo una respuesta, cuando se define una variable de tipo LABEL, esta se comporta como una estructura en C. Cuando se llama al servicio 0AH del DOS para leer una cadena se tiene esto:

Como dije no lo veia, aunque claro que ahora viendo la documentacion tambien se hace evidente:
http://www.ctyme.com/intr/rb-2563.htm#Table1344

Cita de: "blend"
Y hacerca de mi problema inicial sobre el error al escribir en el archivo, ya lo he solucionado, no de la mejor manera que yo hubiera querido, pero almenos ya quedo, aunque no me doy por vencido y sigo practicando

Si, lo solucionaste solo permitiendo 10 caracteres (pasando ese valor a la funcion de lectura) pero lo podrias solucionar facilmente introduciendo una variable que guardara el valor devuelto en AX en la lectura (cantidad de bytes leidos) y usando eso en lugar de LONGMAX en FPUT.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

blend

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Error Al Escribir En Archivo Desde Asm
« Respuesta #4 en: Lunes 3 de Diciembre de 2007, 23:08 »
0
De hecho no lo solucione de esa forma  :P

Como mi codigo tiene errores que son evidentes (para mi no tanto, si no ya lo hubiera solucionado  :D ), y al imprimir, me imprimia lo que estaba en la variable siguiente, lo que hice fue colocar una variable en ese lugar que contenia solamente espacios y asi no se veria ningun caracter.

Como dije, no es la mejor forma de haber solucionado el problema, pero en ocaciones se tiene que recurrir a metodos sucios.


Saludos  :hola:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error Al Escribir En Archivo Desde Asm
« Respuesta #5 en: Lunes 3 de Diciembre de 2007, 23:38 »
0
¿No es evidente que le tenes que pasar el tamaño leido a la funcion que escribe en disco en vez de el tamaño maximo? Si estas imprimiendo la cadena en pantalla con una funcion que toma como parametro solo una cadena (y no su tamaño) la diferencia esta clara.

Igual solucionalo como quieras.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.