creating a looping bootloader
Posted: Mon Apr 05, 2010 4:31 am
Hi. I have a question on using int 19h to create a looping/reloading bootloader.
This bootloader prints the string "Testing interrupts!Testing interrupts!" when run
Now if I add a
right after I do the first call print_string, should the system go for a reboot and the bootloader be loaded again and the same string "Testing interrupts!" be printed again and the same thing continued recursively, with the bootloader being loaded again and again? This doesn't seem to be happening. What am I missing? I seem to have understood the interrupt wrongly. Shouldn't "int 19h" reread the first sector of the first hard disk and then reexcute the entire bootloader again?
like this
Thanks a lot
This bootloader prints the string "Testing interrupts!Testing interrupts!" when run
Code: Select all
BITS 16
start:
mov ax, 07C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
mov si, text_string ; Put string position into SI
call print_string ; Call our string-printing routine
mov si, text_string ; Put string position into SI
call print_string ; Call our string-printing routine
jmp $ ; Jump here - infinite loop!
text_string db 'Testing interrupts!', 0
print_string: ; Routine: output string in SI to screen
mov ah, 0Eh ; int 10h 'print char' function
.repeat:
lodsb ; Get character from string
cmp al, 0
je .done ; If char is zero, end of string
int 10h ; Otherwise, print it
jmp .repeat
.done:
ret
times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
dw 0xAA55 ; The standard PC boot signature
Code: Select all
int 19h
like this
Code: Select all
BITS 16
start:
mov ax, 07C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
mov si, text_string ; Put string position into SI
call print_string ; Call our string-printing routine
int 19h ; i have called this interrupt here
mov si, text_string ; Put string position into SI
call print_string ; Call our string-printing routine
jmp $ ; Jump here - infinite loop!
text_string db 'Testing interrupts!', 0
print_string: ; Routine: output string in SI to screen
mov ah, 0Eh ; int 10h 'print char' function
.repeat:
lodsb ; Get character from string
cmp al, 0
je .done ; If char is zero, end of string
int 10h ; Otherwise, print it
jmp .repeat
.done:
ret
times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
dw 0xAA55 ; The standard PC boot signature