2016-07-09 37 views
0

Ich habe ein kleines Boot-fähiges Betriebssystem in Assembly mit Flat Assembler erstellt. Ich nenne es PulsarOS. Ich möchte jedoch ein Tippprogramm dafür erstellen. Wie ich schon sagte, es ist alles in x86 Assembly. Ich will es einfach wo der Benutzer tippen kann, und der getippte Text wird auf dem Bildschirm angezeigt. Hier ist der Code. Es bootet ganz gut in VirtualBox und auf meinem physischen PC:Wie kann ich die gedrückte Tastatur im Assembly Bootloader drucken?

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 

So ist es relativ einfach, aber ich will ein Just-as-einfachen Code, den ich in den gebootet Code hinzufügen kann. Ich bin auch ziemlich neu in Assembly, frisch aus meinen Klassen, also erkläre es mir, als wäre ich fünf. Vielen Dank!

+2

Vielleicht wäre der Versuch, einen Tastenanschlag vom Benutzer zu erhalten, ein nützlicher Ausgangspunkt. BIOS [Int 16h/ah = 0h] (http://www.ctyme.com/intr/rb-1754.htm) kann nützlich sein, um auf einen Tastenanschlag des Benutzers zu warten. Es ist eine blockierende Funktion. Wenn Sie es aufrufen, wartet es auf einen Tastendruck und gibt das ASCII-Zeichen in _AL_ zurück. Eine [Liste von BIOS-Interrupts] (http://www.ctyme.com/intr/cat-003.htm) nach Kategorie finden Sie in [Ralf Browns Interrupt-Liste] (http://www.ctyme.com/rbrown) .htm) –

+0

INT 16h enthält BIOS-Tastaturroutinen, die Sie verwenden können. –

+0

Können Sie mir einen Beispielcode geben? @MichaelPetch Alles was ich brauche ist, dass der Benutzer tippen kann. Wie NotePad. Ich kann es nicht alleine herausfinden. –

Antwort

0

Sie Tastatur-Dienste auf dem BIOS-Interrupt 16h finden: INT 16H

WARNUNG: Diese Methode funktioniert nur in „Real Mode“
zur Zeit im nicht sicher „Protected Mode“, aber dies wird für Ihren Bootloader arbeiten oder 16bit OS

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

, wenn Sie es für den Schlüssel warten haben wollen:
hier ist eine Funktion, die auf einen Tastendruck wartet und setzt dann die keypress in 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