2016-07-09 3 views
0

플랫 어셈블러를 사용하여 어셈블리에 작은 부팅 가능 OS를 만들었습니다. 나는 그것을 PulsarOS라고 부른다. 그러나, 나는 그것에 대한 타이핑 프로그램을 만들고 싶다. 제가 말했듯이, 그것은 모두 x86 어셈블리에 있습니다. 사용자가 입력 할 수있는 곳으로 간단하게 입력하고 입력 한 텍스트가 화면에 표시됩니다. 여기에 코드가 있습니다. 비교적 간단한, 그래서조립 된 부트 로더에서 누른 키를 어떻게 인쇄합니까?

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 

,하지만 난이 부팅 코드에 추가 할 수있는 단지 것과 같이 간단한 코드합니다 : 그것은 버추얼 박스에서 내 실제 PC에 잘 부팅. 나는 또한 새로운 수업에서 꽤 신선하고, 그래서 나는 5 살인 것처럼 설명합니다. 고맙습니다!

당신은 BIOS 인터럽트 16 시간에 키보드 서비스를 찾을 수 있습니다
+2

아마도 사용자로부터 키 스트로크를 얻으려고하면 유용한 출발점이 될 수 있습니다. BIOS [Int 16h/ah = 0h] (http://www.ctyme.com/intr/rb-1754.htm)는 사용자의 키 입력을 기다리는 데 유용 할 수 있습니다. 이것은 블로킹 함수이므로 호출 할 때 _AL_의 ASCII 문자를 반환하는 키 스트로크가 대기 할 때까지 기다립니다. 범주 별 [BIOS 인터럽트 목록] (http://www.ctyme.com/intr/cat-003.htm)은 [Ralf Brown의 인터럽트 목록] (http://www.ctyme.com/rbrown)에서 찾을 수 있습니다. .htm) –

+0

INT 16h에는 사용할 수있는 BIOS 키보드 루틴이 들어 있습니다. –

+0

예제 코드를 제공해 줄 수 있습니까? @MichaelPetch 사용자가 입력 할 수 있어야합니다. 메모장처럼. 나는 그것을 스스로 알아낼 수 없다. –

답변

0

: INT 16H

경고 :이 방법은
가 현재 "보호 모드"에 대해 확실하지 메신저 "리얼 모드"에서 작동하지만이 부트 로더를 위해 작동 또는 16 비트 OS는

mov ah,0h ;service 0h Read key press 
int 16h ;Puts the pressed key into 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 
관련 문제