Странное поведение загрузчика

Я пытался разработать простую ОС, только загрузочный сектор и 16-битный реальный режим с прерываниями. Наконец-то я смог создать ОС / загрузчик, который я тестировал в виртуальной коробке, и это сработало.

Затем я записал образ на компакт-диск и загрузил его на свой старый рабочий стол с Pentium 4, версией BIOS A05 и 1 ГБ ОЗУ, и все заработало отлично — простая ОС, которая печатает «заголовок» на верхней части экрана, все, что он делает, это позволяет вам печатать на экране с несколькими зарегистрированными клавишами для перемещения курсора.

Затем я вставил диск в свой годовалый ноутбук с процессором i5, 2,6 ГБ ОЗУ и версией BIOS A05, и курсор, кажется, перемещается случайным образом, печатая случайные символы на высокой скорости, наконец, останавливаясь на символ anscii 235 (часть расширенной таблицы символов), после чего клавиатура работает нормально, клавиши, предназначенные для перемещения курсора, работают нормально, только заголовок. Это компьютер, на котором я его протестировал, скомпилировал, записал и записал на компакт-диск.(Я использовал ОС Linux Mint 12)

Я прошел через все «обручи», которые, как мне казалось, мне нужно было сделать: записывается в нужный сектор.

Это проблема с моим кодом, я что-то не так сделал или это нормально?

Вот мой код (синтаксис NASM x86):

    ;**************************
    ; Note OS, Experimental OS
    ;**************************
    [org 0x7C00]
    [bits 16]
    start:
    jmp loader                           ;jump to the actual start of bootloader
    times 8 - ($ - $$) db 0          ;pad eight bytes

    ;*********************
    ;El Torito Boot Info Table
    ;*********************

    ;in nasm, I couldn't figure out how to reserve bytes, in the middle of .text
    ;so I zeroed it out.
    times 56 db 0

    loader:
    call cls                ;clear the screen
    mov si, head1           ;setup page headers
    call printf 
    mov si, head2
    call printf
    jmp note                ;start note program

    cls:
    mov ah, 0x0F            ;get current video mode
    mov al, 0x00            ;reset register
    int 0x10                ;get video mode
    mov ah, 0x00            ;set video mode
    int 0x10                ;reset screen
    mov ah, 0x02            ;set cursor pos
    mov bh, 0x00            ;page 00
    mov dh, 0x00            ;row 00
    mov dl, 0x00            ;col. 00
    int 0x10                ;set pos
    ret

    printf:
    .loop                   ;our function that loops
    mov al, [si]            ;load byte
    cmp al, 0               ;if null, end
    je .end
    mov ah, 0x0E            ;function 0E
    mov bh, 0x00            ;page 0x00
    mov bl, 0x0F            ;white text on black background
    int 0x10                ;print
    inc si                  ;increment source index
    jmp .loop               ;repeat
    .end
    ret                     ;return

    ;*******************
    ; Note 'Program'
    ;*******************

    note:
    mov ah, 0x00            ;function 00
    int 0x16                ;get character
    cmp al, '`'             ;go up line?
    je setcur
    cmp al, 0x0D            ;enter?
    je setent
    cmp al, '+'             ;plus?
    je setplu
    cmp al, '-'             ;minus?
    je setminu
    cmp al, '\'             ;reset?
    je loader
    cmp al, 0x08            ;backspace?
    je setback
    mov ah, 0x0E            ;function 0E
    mov bh, 0x00            ;page 00
    mov bl, 0x0F            ;white on black
    int 0x10                ;print
    jmp note                ;repeat

    setcur:
    mov ah, 0x03            ;get cur pos
    mov bh, 0x00            ;page 00
    int 0x10                ;get pos
    cmp dh, 0x00            ;are we at top of page?
    je .begin               ;just reset cursor if so
    sub dh, 0x01            ;go up one line
    .begin
    mov dl, 0x00            ;set to beginning of line
    mov ah, 0x02            ;set cursor function
    mov bh, 0x00            ;page 00
    int 0x10                ;set position
    jmp note                ;read next character

    setent:
    mov ah, 0x0E            ;write character
    mov al, 0x0A            ;begin line
    mov bh, 0x00            ;page 00
    mov bl, 0x0F            ;white on black
    int 0x10                ;print

    setplu:
    mov ah, 0x03            ;get cursor pos
    mov bh, 0x00            ;page 0x00
    int 0x10                ;get pos
    mov ah, 0x02            ;set cursor pos
    add dl, 0x01            ;add one to column
    int 0x10                ;set new pos
    jmp note                ;get next char

    setminu:
    mov ah, 0x03            ;get cursor pos
    mov bh, 0x00            ;page 00
    int 0x10                ;get pos
    mov ah, 0x02            ;set cursor pos
    sub dl, 0x01            ;sub one to column
    int 0x10                ;set new pos
    jmp note                ;get next char

    setback:
    mov ah, 0x03            ;get cursor pos
    mov bh, 0x00            ;page 00
    int 0x10                ;get pos
    mov ah, 0x02            ;set cursor pos
    sub dl, 0x01            ;sub one column
    int 0x10                ;set pos
    mov ah, 0x0E            ;write char
    mov al, ' '             ;write space
    mov bh, 0x00            ;page 00
    mov bl, 0x0F            ;white on black
    int 0x10
    mov ah, 0x02            ;reset cur pos
    int 0x10                ;reset
    jmp note

    ;******************
    ; Our Page Headers
    ;******************
    head1: db '- Note OS Version 1.2-', 0x0A, 0x0D, 0
    head2: db '=======================', 0x0A, 0x0D, 0x0A, 0x0D, 0

    times 510 - ($ - $$) db 0
    dw 0xAA55

Для справки (вещи, на которые я ссылался):

Таблица Anscii: http://www.asciitable.com/

El-Torito Info : http://wiki.osdev.org/El-Torito

РЕДАКТИРОВАТЬ: Вот клавиши, которые я запрограммировал, и что они делают:

enter - теперь работает нормально backspace - теперь нормально работает плюс - перемещает курсор вправо минус - перемещает курсор влево ` - перемещает курсор в начало предыдущей строки \ - "мягкие перезагрузки" прыгают почти до начала загрузчика

7
задан codesmith 12 March 2012 в 00:28
поделиться