Как можно распечатать нажатую клавишу клавиатуры в сборочном загрузчике?

Я создал небольшую загружаемую ОС в сборке с Flat Assembler. Я называю это PulsarOS. Тем не менее, я хочу создать программу для печати. Как я уже сказал, это все в сборке x86. Я просто хочу, чтобы пользователь мог набрать текст, а набранный текст отображается на экране. Вот код Он отлично загружается в VirtualBox и на моем физическом ПК:

mov ax, 9ch
mov ss, ax
mov sp, 4096d
mov ax, 7c0h
mov ds, ax
;Pulsar Micro-Kernel With Text Editor v1.0.1, running Pulsar OS v1.0.4
;_______BOOTED CODE PAST THIS POINT______
mov ah, 09h
mov cx, 80d
mov al, 20h
MOV SI, HelloString
CALL PrintString
mov bl, 80h
int 10h

mov ah, 09h
mov cx, 1000h
mov al, 20h
mov bl, 17h
int 10h

JMP $


PrintCharacter:

mov ah, 0x0E
mov bh, 0x00

INT 0x10
RET

PrintString:

next_character:
MOV AL, [SI]
INC SI
OR AL, AL
JZ exit_function
CALL PrintCharacter
JMP next_character
exit_function:
RET



;In the quotes is the text shown, no ASCII codes here! :)
HelloString db 'PulsarOS Basic Text Editor v1.0.4 ', 0



;When building with cmd prompt, type: copy /b ytut.bin ytut.img
;ytut is the name of the file saved.
;----------------------------------------
times 510-($-$$) db 0
dw 0xAA55

Итак, это относительно просто, но я хочу простой код, который я могу добавить в загруженный код. Я также довольно новичок в ассемблере, только что закончил занятия, так что объясни мне, что мне пять лет. Спасибо!

1 ответ

Вы можете найти службы клавиатуры на прерывании BIOS 16h: INT 16H

ВНИМАНИЕ: этот метод работает только в "реальном режиме"
в настоящее время я не уверен насчет "защищенного режима", но это будет работать для вашего загрузчика или 16-битной ОС

mov ah,0h  ;service 0h Read key press
int 16h    ;Puts the pressed key into al 

если хотите, дождитесь ключа:
Вот функция, которая ждет нажатия клавиши, а затем помещает нажатие клавиши в al:

wait_for_keypress: ;al <= Pressed key | ah <= 0h
push bx ;push registers
push cx
push dx

wait_for_keypress_loop:
mov ah,0h
int 16h

cmp al,0h ;if you pressed a key exit
jg wait_for_keypress_end

jmp wait_for_keypress_loop ;if not loop infinitely until you press a key

wait_for_keypress_end:
pop dx ;restore registers
pop cx
pop bx
ret ;return  
Другие вопросы по тегам