Я написал простой загрузчик, который хорошо работает в QEMU, и решил попробовать его на реальной машине.Я скопировал файл образа на флешку и попытался загрузить с него.Но по какой-то причине я получил только черный экран с курсором где-то рядом с верхним левым углом, и это заставило меня подумать, что это может быть некоторая проблема с отображением строк на экране.Чтобы проверить эту идею, я написал упрощенный загрузчик, который показывает сообщение «Загрузка изображения» и проверяет, поддерживаются ли расширения ввода-вывода (int 13h ah = 42). Если он поддерживается, отображается сообщение «Расширения здесь».Так что в QEMU это работает, и я получаю эти два сообщения, как ожидалось.Но на моем компьютере вместо двух строк я получаю одну строку вроде «LoaExtensions здесь».Для печати сообщения я использую int 10h ah = 0Eh Я пытался установить различные режимы видео, используя функцию ah = 0 в int 10h, но у меня всегда был один и тот же результат.Не могли бы вы помочь мне понять, что может быть не так?Это код:
bits 16 ; we are in 16 bit real mode
org 0 ; we will set regisers later
start: jmp Main ; jump to start of bootloader
msgLoading db "Loading Image ", 0x0D, 0x0A, 0x00
msgSectorReadingError db "ERROR: Can't read sectors from disk",0x0D,0x0A, 0x00
msgExtNotSupported db "ERROR: BIOS doesn't support LBA",0x0D,0x0A, 0x00
msgErrWhileLoadingImage db "ERROR: Couldn't read seconday image",0x0D,0x0A, 0x00
msgExtSupported db "Extensions are here",0x0D,0x0A, 0x00
imgName db "STAGE2 SYS"
;************************************************;
;************************************************;
; Prints a string
; DS=>SI: 0 terminated string
;************************************************;
Print:
lodsb ; load next byte from string from SI to AL
or al, al ; Does AL=0?
jz PrintDone ; Yep, null terminator found-bail out
mov ah, 0xE ; Nope-Print the character
int 0x10
jmp Print ; Repeat until null terminator found
PrintDone:
ret ; we are done, so return
;************************************************;
; Set Video mode
;
;************************************************;
SetVideoMode:
mov ax,0x0002
int 0x10
ret
;***********************************************;
; Checks whether BIOS supports extensions
;************************************************;
CheckExtenstions:
xor ax,ax
mov ah,0x41
xor dx,dx
mov dl,BYTE[driveNumber]
mov bx,0x55AA
int 0x13
cmp bx,0xAA55
jnz .error
test cl,0x1
jz .error
jmp .exit
.error:
mov si,msgExtNotSupported
call Print
cli
hlt
.exit:
mov si,msgExtSupported
call Print
cli
hlt
ret
Main:
;----------------------------------------------------
; code located at 0000:7C00, adjust segment registers
;----------------------------------------------------
cli ; disable interrupts
mov ax, 0x07C0 ; setup registers to point to our segment
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
;----------------------------------------------------
; create stack
;----------------------------------------------------
mov ax, 0x0000 ; set the stack
mov ss, ax
mov sp, 0xFFFE
mov BYTE[driveNumber],dl
sti ; restore interrupts
call SetVideoMode
mov si, msgLoading ; Show Loading Message
call Print
call CheckExtenstions
cli
hlt
TIMES 510-($-$$) DB 0
DW 0xAA55