[SOLUCIONADO] No funciona mi bootloader !!!!

Iniciado por lucaslopez0000, 24 Junio 2013, 20:02 PM

0 Miembros y 1 Visitante están viendo este tema.

lucaslopez0000

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 (asm) [Seleccionar]

[BITS 16]
[ORG 0x07C] ; Uno de los fallos estaba aqui , puse mal esta direccion

; Entry point
jmp main

; Rutinas
putchar:
; He comprobado que la rutina putchar funciona perfectamente , no la revises
; Imprime el caracter guardado en el registro al
mov ah , 0x0E
mov bh , 0x00
mov bl , 0x07
int 10h
retn

putstr:
; Y el otro fallo estaba aqui , que no me asegure de que lodsb incrementara SI
               ; Abajo del post esta el codigo corregido
lodsb ; Lee 1 caracter del string
cmp al , 0x00
jz retornar
call putchar
jmp putstr
retornar:
retn
main:
; El problema PUEDE estar aqui
mov si , msgTexto
call putstr

; Declaraciones
msgTexto db 0x0D, 0x0A, "Hola mundo!!", 0x00 ; El mensaje

; Firma bootloader
times 510-($-$$) db 0
dw 0xAA55


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 (asm) [Seleccionar]

[BITS 16]
[ORG 0x7C00] ; Este es el org correcto

; Entry point
jmp main

; Rutinas
putchar:
; Imprime el caracter guardado en el registro al
mov ah , 0x0E
mov bh , 0x00
mov bl , 0x07
int 10h
retn

putstr:
cld ; Asi me aseguro de que lodsb incremente SI
               lodsb
or al , al
jz retornar
call putchar
jmp putstr
retornar:
retn
main:
mov si , msgTexto
call putstr

; Declaraciones
msgTexto db 0x0D, 0x0A, "Hola mundo!!", 0x00 ; El mensaje

; Firma bootloader
times 510-($-$$) db 0
dw 0xAA55


Nota : Lo se usar cld para asegurarme de que lodsb incremente SI ha posteado por cpu2
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

x64core


lucaslopez0000

Cita de: x64Core en 24 Junio 2013, 20:12 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  :(
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

Eternal Idol

¿Y despues del main ejecutas msgTexto?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

Yo uso bochs para tales requerimientos  ;D
Create una imagen, insertas el codigo, cargas la imagen a la VM y a depurar  :D

lucaslopez0000

Cita de: Eternal Idol 7D en 24 Junio 2013, 21:31 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
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

x64core

Cita de: The C Coder en 24 Junio 2013, 21:47 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

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

MCKSys Argentina

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


lucaslopez0000

Cita de: Eternal Idol 7D 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.

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 ...
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX