He estado atascado con esto durante semanas y no tengo idea de dónde me estoy equivocando porque NASM no me ha dado ningún error. El código es bastante auto explicativo debido a los comentarios.Cómo cargar un kernel desde el disco con el BIOS int 13h en el ensamblado NASM?
este es el código que se carga desde la BIOS
;--------------------------------------------
; 'boot.asm'
; loaded from BIOS
[org 0x7C00]
[bits 16]
;--------------------------------------------
main:
mov ah, 0x0E ; print function
mov al, '.' ; ascii char
int 0x10 ; IO int
resetdisk:
mov ah, 0x00 ; reset function
mov dl, 0x00 ; drive
int 0x13 ; disk int
jc resetdisk
readdisk:
mov bx, 0x8000 ; segment
mov es, bx
mov bx, 0x0000 ; offset
mov ah, 0x02 ; read function
mov al, 0x03 ; sectors
mov ch, 0x00 ; cylinder
mov cl, 0x02 ; sector
mov dh, 0x00 ; head
mov dl, 0x00 ; drive
int 0x13 ; disk int
jc readdisk
jmp [es:bx] ; buffer
;--------------------------------------------
times 510 - ($ - $$) db 0x00
db 0x55, 0xAA
Este es el código que debe ser (pero no lo es) cargado
;--------------------------------------------
; 'load.asm'
; loaded from 'boot.asm'
[org 0x8000]
[bits 16]
;--------------------------------------------
main:
mov ah, 0x0E ; print function
mov al, '.' ; ascii char
int 0x10 ; IO int
jmp $ ; hang
Cualquier ayuda sería muy apreciada .
Patrick
Por favor, corrija si me equivoco, pero tal vez será un mejor enfoque si en lugar de 'jmp $' usted hace 'cli' para borrar las interrupciones seguidas por' hlt' para detener la CPU. De esta forma evitará consumir mucho tiempo de CPU. – kaneda
Minimal ejemplo gas de trabajo: https://github.com/cirosantilli/x86-bare-metal-examples/blob/1f6af9021283dc01f2247efbb6aa9217363fbf07/bios_disk_load.S –