2012-09-16 3 views
2

bios interrupt 함수 21h (ah = 1h)는 standart 입력에서 문자를 읽고 에코해야합니다.assembler (fasm) - 문자 읽기

내 읽기 기능 : 내가 키를 누르면

mov ah, 1h 
    int 21h 

그래서, 그 실현하지만, 문자를 표시하지 않습니다. 메신저 내 플로피와 문자 에코 기능 int 10h (아 = 0eh)에서 부팅하기 위해 내 코드를 사용하기 때문에, 나는 그것을 저장하고 "비디오 - teletype 출력"(int 10h (ah = 0eh)).

아니면 aboce 코드에서 뭔가를 놓쳤습니까?

+2

"내 플로피에서 부팅"이란 무엇을 의미합니까, 당신은 당신 자신의 커스텀 부트 로더 또는 DOS 부트 디스크를 작성하고 있다는 것을 의미합니까? (DOS에서'int 21h' 인터럽트를 기반으로합니다)? 대답은 코드를 작성하는 환경에 따라 다릅니다. – nrz

답변

2

인터럽트 0x21은 BIOS가 아닌 MSDOS와 유사한 OS 기능의 '인터페이스'입니다.

리얼 모드 부트 로더 또는 작은 OS 커널을 작성하는 경우 사용자 고유의 IRQ 1 핸들러를 사용해야합니다.

는 자신의 메모리 버퍼에있는 모든 키 누름을 캡처하는 방법이 답변을 참조하십시오 : How to check keys status in x86 assembly?

는 그런 다음 루프의 일종을 준비해야합니다. 키 누름을 확인합니다 (메모리 버퍼를 읽음). 키 누르기가 감지되면 "에코"키를 인쇄하려면 비디오 메모리에 무언가를 써야합니다. 그것은 또 다른 이야기입니다. 기본 텍스트 모드를 사용하는 경우 0xB800 세그먼트에 쓰기 만하면됩니다. 그래픽 모드 (VGA 또는 VESA)를 사용하는 경우, 어딘가에서 래스터 글꼴을 가져와야합니다.

조립품에 부트 로더 레벨로 물건을 쓰고 있다면 사용 가능한 공간이별로 없습니다. 확실히 int 0x21이 아닙니다. 당신은 기본적으로 다른 두 가지 일을

0

: 화면에 표시 키보드

  • 에서 문자를 받고

    두 개의 서로 다른 BIOS는 개입 중단하지만, 다행히도 모두 동일한를 사용하여 AL의 값.

    mov ah,0h ;get character from keyboard 
    int 16h  ;and store it in AL 
    mov ah,0eh ;Display a character in AL 
    int 10h  ;aka, echo it 
    

    INT 21h는 MSDOS의 것으로, 부트 로더에 관해서 말하면 no-no입니다.