В 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 для запускасборный файл.