Ввод нажатия клавиш не работает для ядра сборки - PullRequest
0 голосов
/ 25 апреля 2018

В 64-битной Ubuntu я написал загрузчик, который загружает ядро, которое предоставляет программу эха (выводит все, что введено):

Код загрузчика:

    [BITS 16]
    org 0x7C00
    bootdrive db 0
    start:
            mov [bootdrive], dl
            mov ah, 0
            int 13h

            mov dx, 0
            mov ah, 2
            mov al, 0x10
            mov dl, [bootdrive]
            mov ch, 0
            mov dh, 0
            mov cl, 2
            mov bx, 0
            int 13h
            jmp 0x1000:0000
    times 510-($-$$) db 0
    dw 0xAA55

Код ядра:

    [BITS 64]
    call _stdin
    jmp $

    _stdin:
            mov ah, 0
            int 16h
            mov ah, 0eh
            mov bx, 0
            int 10h
            ret

int 16h / ah = 0 принимает входные данные и помещает буфер в al.Затем я пытаюсь напечатать al через int 10h / al = 0eh, но это не проходит.Я даже пытался поместить

    mov al, "!"

между

    mov ah, 0eh

и

    mov bx, 0

, но это не похоже на 16-часовое прерывание.Я также пробовал различные другие команды stdin, используя int 21h (ah = 8, ah = 1, ah = 0ah), но ни одна из них не смогла прочитать нажатие клавиши.Я набрал бы клавишу и нажал ENTER, но ничего бы не случилось.Еще более запутанным был тот факт, что даже команда вывода в int 21h (ах = 02h) ничего не печатала.Я попытался переключить ядро ​​в реальный режим (32 бита) вместо длинного режима (64 бита), но int 21h все равно не работал.Чтобы было ясно, я хочу иметь возможность читать ввод с клавиатуры БЕЗ ожидания ожидаемого нажатия клавиши, чтобы я мог чередовать вызов прерывания ввода и выполнение других процессов.int 21h, похоже, не работал, даже в 32-битном режиме, а также int 16. Единственные прерывания, которые я когда-либо получал, были int 10h и int 13h (как показано в коде), но другие прерывания непо какой-то причине не работает.

ПРИМЕЧАНИЕ. Я собрал загрузчик и ядро ​​с помощью nasm bootloader.asm -p kernel.asm, чтобы создать файл bin с именем bootloader, и использовал qemu-system-x86_64 для запускасборный файл.

1 Ответ

0 голосов
/ 26 апреля 2018

[EDITED]

Вот программа, которую я написал, которая содержит как загрузчик, так и ядро, которая работает при преобразовании в файл .iso:

    [BITS 16]
    org 0x7C00

    mov ax, 0
    mov es, ax
    mov ah, 2
    mov al, 1
    mov ch, 0
    mov dh, 0
    mov cl, 2
    mov bx, _stage2
    int 0x13
    jmp _stage2
    times 510-($-$$) db 0
    dw 0xAA55

    _stage2:
            call _stdin
            call _stdout
            jmp _stage2
    _stdin:
            mov ah, 1
            mov al, 0
            int 16h
            cmp al, 0
            je _stdin
            mov ah, 0
            int 16h
            ret
    _stdout:
            mov ah, 0eh
            mov bx, 0
            int 10h
            ret
...