Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: lucaslopez0000 en 24 Junio 2013, 20:02 pm



Título: [SOLUCIONADO] No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 24 Junio 2013, 20:02 pm
Hola a todos  , estoy tipeando un bootloader en asm , pero esto me tiene ya medio calvo. No se donde puede estar el fallo , no tengo la mas remota idea !!!
Os paso el codigo
Código
  1. [BITS 16]
  2. [ORG 0x07C] ; Uno de los fallos estaba aqui , puse mal esta direccion
  3.  
  4. ; Entry point
  5. jmp main
  6.  
  7. ; Rutinas
  8. putchar:
  9. ; He comprobado que la rutina putchar funciona perfectamente , no la revises
  10. ; Imprime el caracter guardado en el registro al
  11. mov ah , 0x0E
  12. mov bh , 0x00
  13. mov bl , 0x07
  14. int 10h
  15. retn
  16.  
  17. putstr:
  18. ; Y el otro fallo estaba aqui , que no me asegure de que lodsb incrementara SI
  19.                ; Abajo del post esta el codigo corregido
  20. lodsb ; Lee 1 caracter del string
  21. cmp al , 0x00
  22. jz retornar
  23. call putchar
  24. jmp putstr
  25. retornar:
  26. retn
  27. main:
  28. ; El problema PUEDE estar aqui
  29. mov si , msgTexto
  30. call putstr
  31.  
  32. ; Declaraciones
  33. msgTexto db 0x0D, 0x0A, "Hola mundo!!", 0x00 ; El mensaje
  34.  
  35. ; Firma bootloader
  36. times 510-($-$$) db 0
  37. dw 0xAA55
  38.  

No comprendo donde esta el problema , como dato os digo que ni se mueve el cursor :( Muchas gracias de antemano


La solucion fue esta :
1 ) Corregi el valor de ORG , que lo puse mal por un error de tipeo
2 ) Como solucion temporal hasta que maneje bien lods y familia , hice un mov al , [DS:SI]. Luego antes de repetir el bucle incremento SI para pasar al siguiente caracter y por fin resuelto !!!!!!!!!!!!!!!!!!!!!!!(10^9000 exclamaciones)!!!!!!!!!!!!!!!!!!!!

Os dejo el codigo corregido :)

Código
  1. [BITS 16]
  2. [ORG 0x7C00] ; Este es el org correcto
  3.  
  4. ; Entry point
  5. jmp main
  6.  
  7. ; Rutinas
  8. putchar:
  9. ; Imprime el caracter guardado en el registro al
  10. mov ah , 0x0E
  11. mov bh , 0x00
  12. mov bl , 0x07
  13. int 10h
  14. retn
  15.  
  16. putstr:
  17. cld ; Asi me aseguro de que lodsb incremente SI
  18.                lodsb
  19. or al , al
  20. jz retornar
  21. call putchar
  22. jmp putstr
  23. retornar:
  24. retn
  25. main:
  26. mov si , msgTexto
  27. call putstr
  28.  
  29. ; Declaraciones
  30. msgTexto db 0x0D, 0x0A, "Hola mundo!!", 0x00 ; El mensaje
  31.  
  32. ; Firma bootloader
  33. times 510-($-$$) db 0
  34. dw 0xAA55
  35.  

Nota : Lo se usar cld para asegurarme de que lodsb incremente SI ha posteado por cpu2


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: x64core en 24 Junio 2013, 20:12 pm
Has depurado el codigo?  :rolleyes:


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 24 Junio 2013, 20:35 pm
Has depurado el codigo?  :rolleyes:

Hay 2 problemas

1. Yo lo que hago cuando programo bootloaders es usar unas directivas nasm
que dejan el fichero en 512 bytes y le agregan la firma bootloader , y luego lo pruebo en una maquina virtual. Pero yo no se de ningun "depurador para maquina virtual"
2. Llevo 3 semanas aprendiendo ASM , y como en C la vida era de color rosa no necesitaba debuggers. Asi que nunca me dio por aprender a usarlos y no tengo ni idea de depurar  :(


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: Eternal Idol en 24 Junio 2013, 21:31 pm
¿Y despues del main ejecutas msgTexto?


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: x64core en 24 Junio 2013, 21:38 pm
Yo uso bochs para tales requerimientos  ;D
Create una imagen, insertas el codigo, cargas la imagen a la VM y a depurar  :D


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 24 Junio 2013, 21:47 pm
¿Y despues del main ejecutas msgTexto?

Punto 1.
He visto bootloaders "hola mundo" que lo ponen despues de main
Punto 2
¿ ejecutar msgTexto ???
usando msgTexto db "unacadena" , lo que haces es incrustar unacadena en el fichero resultante , es algo propio de nasm y creo que tu usas masm. Como la BIOS carga los 512 primeros bytes , tambien cargará en algun sitio del segmento de datos la cadena hola mundo , y luego la idea es que una vez en memoria recorrer todos los caracteres. de todos modos probaré lo que tu dices


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: x64core en 24 Junio 2013, 21:50 pm
Punto 1.
He visto bootloaders "hola mundo" que lo ponen despues de main
Punto 2
¿ ejecutar msgTexto ???
usando msgTexto db "unacadena" , lo que haces es incrustar unacadena en el fichero resultante , es algo propio de nasm y creo que tu usas masm. Como la BIOS carga los 512 primeros bytes , tambien cargará en algun sitio del segmento de datos la cadena hola mundo , y luego la idea es que una vez en memoria recorrer todos los caracteres. de todos modos probaré lo que tu dices

jajaja Es notable que te falta mucho por aprender creo que lo que deberias es empezar
a leer un libro de programacion en ensamblador   ;D


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: Eternal Idol en 24 Junio 2013, 21:51 pm
x64Core tiene razon, demasiadas preguntas sin sentido y respuestas idem. No tenes bases, por eso no comprendes lo que hace tu main, leelo de nuevo y si seguis sin comprender olvidate de hacer un bootloader y primero aprende a hacer un programa en assembly.


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: MCKSys Argentina en 24 Junio 2013, 21:52 pm
Siguiendo lo que dijo x64Core (1er comment):

http://wiki.osdev.org/VMware (http://wiki.osdev.org/VMware)
http://weichong78.blogspot.com.ar/2010/04/vmware-qemu-and-gdb-for-boot-time-real.html (http://weichong78.blogspot.com.ar/2010/04/vmware-qemu-and-gdb-for-boot-time-real.html)

Otra info interesante:

http://cyberview.wordpress.com/2010/09/16/debugging-bios-under-vmware-using-idas-gdb-debugger/ (http://cyberview.wordpress.com/2010/09/16/debugging-bios-under-vmware-using-idas-gdb-debugger/)

Saludos!


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 24 Junio 2013, 21:55 pm
x64Core tiene razon, demasiadas preguntas sin sentido y respuestas idem. No tenes bases, por eso no comprendes lo que hace tu main, leelo de nuevo y si seguis sin comprender olvidate de hacer un bootloader y primero aprende a hacer un programa en assembly.

Estuve estudiandome varios manuales tanto de asm con S.O como asm sin S.O
Por lo visto parece que tengo que leer mucho mas ...


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: Eternal Idol en 24 Junio 2013, 22:08 pm
Sin duda.

[ORG 0x7C00]

Ademas de lo que ya te dije sobre ejecutar msgTexto, lee la descripcion de la instruccion lods.

http://faydoc.tripod.com/cpu/lodsb.htm


Y despues trata de comprender como es que poniendo esto antes funciona:
Código
  1. push cs
  2. pop ds


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: x64core en 24 Junio 2013, 22:10 pm
Siguiendo lo que dijo x64Core (1er comment):

http://wiki.osdev.org/VMware (http://wiki.osdev.org/VMware)
http://weichong78.blogspot.com.ar/2010/04/vmware-qemu-and-gdb-for-boot-time-real.html (http://weichong78.blogspot.com.ar/2010/04/vmware-qemu-and-gdb-for-boot-time-real.html)

Otra info interesante:

http://cyberview.wordpress.com/2010/09/16/debugging-bios-under-vmware-using-idas-gdb-debugger/ (http://cyberview.wordpress.com/2010/09/16/debugging-bios-under-vmware-using-idas-gdb-debugger/)

Saludos!

BIOS != MBR/Bootloader  ::)


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 24 Junio 2013, 22:15 pm
echadle una ojeada al codigo de esta URK   http://elektronblog.wordpress.com/2010/08/31/crear-un-boot-loader-para-comenzar-tu-propio-sistema-operativo/

Pone el msgTexto casi al final y hace mov si , msgTexto , lo cual deberia guardar en si la direccion de msgTexto ¿ Entonces por qué a la persona del tutorial le funciona y a mi no ???
Pero por favor no se rian de mis conocimientos basicos de asm y ayudenme.
Muchas gracias


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: Eternal Idol en 24 Junio 2013, 22:20 pm
Lee mi anterior mensaje con atencion. Hay dos problemas fundamentales, tenes mal el ORG y al no saber como funciona la instruccion lodsb te falta darle el valor correspondiente a un registro.

Amen de eso tu main despues de llamar a putstr ejecuta lo que le sigue a continuacion. ¿Y que es eso? Pone un hlt al menos.

El codigo del ejemplo ese que ya publicaste en otro hilo tiene un bucle infinito, por eso nunca retorna de su rutina de escritura de cadena ...


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 24 Junio 2013, 22:21 pm
Sin duda.

[ORG 0x7C00]

Ademas de lo que ya te dije sobre ejecutar msgTexto, lee la descripcion de la instruccion lods.

http://faydoc.tripod.com/cpu/lodsb.htm


Y despues trata de comprender como es que poniendo esto antes funciona:
Código
  1. push cs
  2. pop ds

Lo de org fue un error de tipeo , y aunque todavia no he leido la descripcion de lods , ahora me lo leo. Muchisimas gracias !!!


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 24 Junio 2013, 22:38 pm
Sin duda.

[ORG 0x7C00]

Ademas de lo que ya te dije sobre ejecutar msgTexto, lee la descripcion de la instruccion lods.

http://faydoc.tripod.com/cpu/lodsb.htm


Y despues trata de comprender como es que poniendo esto antes funciona:
Código
  1. push cs
  2. pop ds

Ya he leido la descripcion de lodsb , pero aun asi volvemos a lo de antes , la persona del tutorial no pone por parte alguna
Código
  1. push cs
  2. pop ds
Y sin embargo su code funciona !!!!!!!!!!!!!!!!!(1000 exclamaciones mas)!!!!!!!!!!!!


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: Eternal Idol en 24 Junio 2013, 22:56 pm
No volvemos a ninguna parte:
AC  LODSB  Load byte at address DS:(E)SI into AL

¿Y que valor tiene DS en tu loader? En el tutorial no esta indefinido (tene en cuenta que ahi ORG es 0).



Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 24 Junio 2013, 23:09 pm
No volvemos a ninguna parte:
AC  LODSB  Load byte at address DS:(E)SI into AL

¿Y que valor tiene DS en tu loader? En el tutorial no esta indefinido (tene en cuenta que ahi ORG es 0).



Perdonadme por calentaros tanto la cabeza pero me parece que hay un transfondo de algo que no acabo de entender al 100% , tienes razon mejor leere mucho mas de lo que ya he leido. Creo que mi deberia releerme lo de los registros de segmento , ¿ Estoy en lo cierto ? ¿ Y si no que cosas me recomiendas leer para que comprenda el problema de mi código ?


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: Eternal Idol en 24 Junio 2013, 23:32 pm
Si relee eso y como ya te dijo x64Core conseguite algun libro de ensamblador (como por ejemplo el de Charte Ojeda http://www.fcharte.com/Default.asp?libro84-415-2511-5).


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: MCKSys Argentina en 25 Junio 2013, 01:16 am
BIOS != MBR/Bootloader  ::)

Y quién ha dicho lo contrario ?

Interesante aquí significa: leelo pues tiene información que podrías encontrar útil (depurar con gdb-IDA en VMWare).

Aparte si depuras el BIOS, puedes mirar fácilmente la carga del MBR...  :P


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: x64core en 25 Junio 2013, 08:33 am
Yo puedo decir que lo que puede hacer es, aprender a depurar este tipo de codigos, depuracion es tan esencial como
saber programarlos. Recomiendo altamente para empezar es usar bochs como dije al principio, luego para saber si todo
va bien lo haces desde la VM.


Título: Re: S.O.S No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 25 Junio 2013, 17:12 pm
Si relee eso y como ya te dijo x64Core conseguite algun libro de ensamblador (como por ejemplo el de Charte Ojeda http://www.fcharte.com/Default.asp?libro84-415-2511-5).

Al final consegui solucionarlo. Aunque como dicen por ahi , primero haz que compile ( en este caso ensamble ) y luego optimizalo. Lo que he hecho es en lugar del lodsb poner un mov al , [DS:SI] , hacer el proceso de impresion del caracter y luego antes de repetir el bucle incrementar SI para pasar al siguiente caracter. Aunque es evidente que con lodsb necesitas menos instrucciones , pero por lo menos asi comprendo mi codigo y se que funciona hasta que le coja el truco a lodsb.

RESUELTO AL FIN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Título: Re: [SOLUCIONADO] No funciona mi bootloader !!!!
Publicado por: xv0 en 25 Junio 2013, 20:00 pm
Al final consegui solucionarlo. Aunque como dicen por ahi , primero haz que compile ( en este caso ensamble ) y luego optimizalo. Lo que he hecho es en lugar del lodsb poner un mov al , [DS:SI] , hacer el proceso de impresion del caracter y luego antes de repetir el bucle incrementar SI para pasar al siguiente caracter. Aunque es evidente que con lodsb necesitas menos instrucciones , pero por lo menos asi comprendo mi codigo y se que funciona hasta que le coja el truco a lodsb.

RESUELTO AL FIN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Pues es una tontería, esto es mejor.

Código
  1. cld
  2. lodsb

cld limpial a bandera DF y te aseguras de que incremente si.

Un saludo.


Título: Re: [SOLUCIONADO] No funciona mi bootloader !!!!
Publicado por: lucaslopez0000 en 26 Junio 2013, 18:09 pm
Pues es una tontería, esto es mejor.

Código
  1. cld
  2. lodsb

cld limpial a bandera DF y te aseguras de que incremente si.

Un saludo.

No sabia que lodsb aumenta o decrementa SI segun el valor de este flag , ahora me entero
si lo hubiera sabido antes ....