SoloCodigo

Programación General => ASM (Ensamblador) => Mensaje iniciado por: JuanK en Lunes 19 de Septiembre de 2005, 22:46

Título: Pasos Para Pasar De Com A Exe
Publicado por: JuanK en Lunes 19 de Septiembre de 2005, 22:46
codigo en FASM
Código: Text
  1. bits =16
  2. cad db "prueba",0
  3. org 100h
  4. start:
  5. cld
  6. mov si, cad
  7. call imprimir
  8. ret
  9. imprimir:
  10. mov ah,0eh
  11. caracter:
  12. lodsb
  13. cmp al,0
  14. jz finchar
  15. int 10h
  16. jmp caracter
  17. finchar:
  18. ret
  19.  
  20.  

Este codigo como se ve genera un archivo '.com', me gustaria que me ayudaran indicandome que pasos se deben tener en cuenta para convertirlo en ejecutable '.exe'?
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: Eternal Idol en Lunes 19 de Septiembre de 2005, 23:17
http://flatassembler.net/docs.php?article=manual#2.4.1 (http://flatassembler.net/docs.php?article=manual#2.4.1)

Ahi estan los segmentos, datos y codigo, el punto de entrada start, la inicializacion de ds y la salida a MS-DOS.

Código: Text
  1.  
  2. bits =16
  3. format MZ
  4.  
  5. segment datos
  6. cad db "prueba",0
  7.  
  8. segment codigo
  9.  
  10. entry codigo:start
  11.  
  12. start:
  13. cld
  14. mov ax, datos
  15. mov ds, ax
  16. mov si, cad
  17. call imprimir
  18. mov ah, 4ch
  19. int 21h
  20. ret
  21. imprimir:
  22. mov ah,0eh
  23. caracter:
  24. lodsb
  25. cmp al,0
  26. jz finchar
  27. int 10h
  28. jmp caracter
  29. finchar:
  30. ret
  31.  
  32.  
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: JuanK en Lunes 19 de Septiembre de 2005, 23:30
Mil gracias Eternal Idol me has sido de gran ayuda.  :smartass:
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: Eternal Idol en Martes 20 de Septiembre de 2005, 08:26
Cita de: "JuanK"
Mil gracias Eternal Idol me has sido de gran ayuda.  :smartass:
De nadas y para eso estamos  :devil:  :comp:
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: JuanK en Martes 20 de Septiembre de 2005, 15:19
Código: Text
  1.  
  2. bits =16
  3. format MZ
  4. segment datos
  5. cad db "prueba",0
  6.  
  7. segment codigo
  8. entry codigo:start
  9.  
  10. start:
  11. cld
  12. mov ax, datos
  13. mov ds, ax
  14. mov si, cad
  15. call imprimir
  16. ret
  17.  
  18. imprimir:
  19. mov ah,0eh
  20.  
  21. caracter:
  22. lodsb
  23. cmp al,0
  24. jz finchar
  25. int 10h
  26. jmp caracter
  27. finchar:
  28. ret      
  29.  
  30.  
Saludos, ahi voy de nuevo, porque no me funciona este codigo?
es decir la version com de es codigo funcionaba, pero al copnvertirlo a exe ya no me funciona.. porque?
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: Eternal Idol en Martes 20 de Septiembre de 2005, 16:31
Cita de: "JuanK"
Saludos, ahi voy de nuevo, porque no me funciona este codigo?
es decir la version com de es codigo funcionaba, pero al copnvertirlo a exe ya no me funciona.. porque?
Entre las modificaciones que hice estaba la de devolver el control a MS-DOS que no esta en tu ultimo codigo y si la agregaras funcionaria perfectamente:

Código: Text
  1.  
  2. mov ah, 4ch
  3. int 21h
  4.  
  5.  
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: JuanK en Martes 20 de Septiembre de 2005, 16:38
:blink:  pOR SUPUESTO!


y que hace puntualmente ese llamado a la interrupcion, es decir que quiere decir devolverle el control al DOS? porque el archivo COM no lo necesita?'
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: Eternal Idol en Martes 20 de Septiembre de 2005, 19:53
Cita de: "JuanK"
y que hace puntualmente ese llamado a la interrupcion, es decir que quiere decir devolverle el control al DOS? porque el archivo COM no lo necesita?

Para empezar yo asumi que ese codigo funcionaba como COM pero no es cierto. ¿Lo ensamblaste y lo probaste? Es imposible que funcione por la simple razon de que sus primeros bytes no son opcodes sino los bytes que corresponden a la cadena prueba ...

Asi si funcionaria como COM:

Código: Text
  1.  
  2. bits =16
  3. org 100h
  4. start:
  5. cld
  6. mov si, cad
  7. call imprimir
  8. ret
  9. imprimir:
  10. mov ah,0eh
  11. caracter:
  12. lodsb
  13. cmp al,0
  14. jz finchar
  15. int 10h
  16. jmp caracter
  17. finchar:
  18. ret
  19. cad db "prueba",0
  20.  
  21.  

En cuanto a la necesidad de avisar al sistema:
http://www.ctyme.com/intr/rb-2974.htm (http://www.ctyme.com/intr/rb-2974.htm)

Cuando haces el ret en un COM salta al codigo que hay en el cs:0, cabe recordar que nuestro ejecutable empieza en cs:100h, dentro de esa posicion hay un int 20h que es la forma antigua de devolver el control al sistema: http://www.ctyme.com/intr/rb-2471.htm (http://www.ctyme.com/intr/rb-2471.htm) en el EXE al hacer ret solo conseguis saltar al principio del codigo y hacer un bucle infinito.
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: JuanK en Martes 20 de Septiembre de 2005, 20:36
respecto a lo del com si me funciono pero es que este es el que yo tengo como version COM:
Código: Text
  1.  
  2. bits =16
  3. org 0100h
  4. start:
  5. cld
  6. mov si, cad
  7. call imprimir
  8. ret
  9. imprimir:
  10. mov ah,0eh
  11. caracter:
  12. lodsb
  13. cmp al,0
  14. jz finchar
  15. int 10h
  16. jmp caracter
  17. finchar:
  18. ret
  19. cad db "prueba",0
  20.  
  21.  

No sabia lo del 20H.

Bien gracias!.
Título: Re: Pasos Para Pasar De Com A Exe
Publicado por: Eternal Idol en Martes 20 de Septiembre de 2005, 21:21
Cita de: "JuanK"
respecto a lo del com si me funciono pero es que este es el que yo tengo como version COM
Bueno, es es igual al ultimo que te pase y la diferencia radica en la posicion del mensaje.