Загрузчик.Запись строк на экран - PullRequest
0 голосов
/ 25 ноября 2018

Я написал простой загрузчик, который хорошо работает в 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 
...