Código:
En que estoy fallando? Gracias por adelantado. Uso Kubuntu, Qemu, Nasm, GCC y Kate. [BITS 16] ; Seteo a modo de 16bits q es como se encuentra el procesador al inicio
[ORG 0] ; Pongo el codigo desde el principio del segmento
jmp inicializar ; Voy al inicio del programa, salto todo lo q es declaraciones
;--------------------------------------------------------------
; Datos usados en el proceso de boot-loading
;--------------------------------------------------------------
mensajeInicial db "Hola Mundo!!", 0x0D,0x0A,0
;--------------------------------------------------------------
; impMensaje imprime un mensaje en ascii por pantalla
;--------------------------------------------------------------
impMensaje:
imprimir:
lodsb ; Carga el byte q esta en ds:si en al
or al,al ; Mira si el caracter es 0 (fin)
jz finImpMensaje
mov ah,0x0E ; Indica q la interrupcion sera para imprimir por pantalla
mov bx,0x0009 ; Se indica pagina base y color de fondo
int 10h ; Llamada al BIOS
jmp imprimir
finImpMensaje: ret
;--------------------------------------------------------------
; Procedimiento que carga un programa contenido en el floppy
;--------------------------------------------------------------
cargarKernel:
reset:
mov ax, 0x0000 ; opcion para resetear el dispositivo
mov dl, 0x00 ; drive=0 floppy
int 0x13 ; interrupcion 13 del bios
jc reset ; si hay carry es q ocurrio un error, entonces intento de nuevo
cargar:
mov ax, 0x1000 ; ES:BX es donde se carga lo leido por la interrupcion
mov es, ax ; por lo que pongo en ES 1000
mov bx, 0x0000 ; y pongo en bx la dir 0000
mov ah, 0x02 ; con ah=2 digo q voy a leer
mov al, 0x05 ; con al indico la cantidad de sectores a leer
mov ch, 0x00 ; cilindro=0
mov cl, 0x02 ; sector=2 (en el 1 tengo el booteable)
mov dh, 0x00 ; cabeza=0
mov dl, 0x00 ; drive=0 es el floppy
int 13h ; invoco la interrupcion
jc cargar ; si ocurrio un error (carry=1), intento de nuevo
jmp 0x1000:0x00 ; salto a la direccion donde cargue el programa
ret ; nunca va a llegar a ejecutarse
;--------------------------------------------------------------
; Procedimiento que inicializa los registros
;--------------------------------------------------------------
inicializar:
;el BIOS me pone en el segmento 07C00h, asi q seteo los segmentos a mi posicion actual
;Asi no tenemos q añadir 07C00h a todos nuestros datos
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
;inicializo los valores para la pila
cli ;desabilito las interrupciones
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti ;habilito nuevamente las interrupciones
jmp main
;--------------------------------------------------------------
; main del programa
;--------------------------------------------------------------
main:
mov si, mensajeInicial ; Muestro el mensaje por pantalla
call impMensaje
call cargarKernel
TIMES 510-($-$$) DB 0 ; Hace q el archivo sea de 512 bytes de longitud
dw 0AA55h ; Indica al bios q es un bootstrap


