int 16H是怎样实现等待键盘输入的?(救救我吧)

时间:2022-05-14 16:24:23
我用DEBUG的T跟踪了半天,也没看出什么东西啊

我想自己用INT 9(书上说键盘上的按键按下和松开都会引发INT 9中断) 编个能用方向键移动的点(别给我代码,我要自己写)

我现在脑袋好乱啊,汇编的键盘输入太复杂了啊~~~~(>_<)~~~~
不用系统和BIOS的中断怎么就这么囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧啊 

5 个解决方案

#1


http://topic.csdn.net/u/20081002/13/2daf5cfb-a496-4c0e-99d8-e7cb050c865e.html
hmm,是code,但不是实现你要功能的code.

#2


BIOS有一个键盘缓冲区,INT 9触发时,从60H端口读入键盘扫描码,保存到键盘缓冲区。INT 16H从键盘缓冲区取扫描,并转换ASCII码返回。等待输入就是当缓冲区为空时循环一直检查,直到有数据为止。

#3


谁回答怎么挂起CPU,分给谁

#4


其实只要接管一下int 9就可以了,
以前收藏的一个,供参考:
1.接管INT 9 终端服务程序替换为发声程序.
2.退出并驻留内存,等待触发中断.
3.当有中断产生(如按键盘),进入新的中断服务程序Music.
4.检查按键是否是ALT+F6,or ALT+F7,如果不是就直接调用原本的INT9 中断服务程序处理.
   如果是ALT+F6,就调用speaker发出声音,最后调用原本的INT9 中断服务程序处理.
   如果是ALT+F7,就调用draw清屏,然后画图[黄色小矩形],调用原本的INT9 中断服务程序处理.
drawup MACRO;clear screen
    MOV AH,07H
    MOV CH,0
    MOV CL,0
    MOV DH,79
    MOV DL,79
    MOV BH,00000010B
    MOV AL,0
    int 10h
ENDM

draw MACRO S1,S2,S3,S4,S5
    MOV AH,07H
    MOV CH,S2
    MOV CL,S1
    MOV DH,S4
    MOV DL,S3
    MOV BH,S5
    MOV AL,0
    int 10h
ENDM

speaker MACRO time,freq;make a sound as the time and frequency
    local Dur,SpkrOn
    MOV BX,time
    MOV AX,0B6H
    OUT 43H,AL ;Timer 2 Control
    MOV DX,14H
    MOV AX,4F38H
    DIV freq
    OUT 42H,AL ;LowByte(Quo)
    MOV AL,AH
    OUT 42H,AL ;HighByte(Quo)
    IN AL,61H
    MOV AH,AL
    OR AL,03H ;SpeakOn
    OUT 61H,AL ;Timer 2 On

Dur:
    MOV CX,14546

SpkrOn:
    LOOP SpkrOn
    DEC BX
    JNZ Dur
    MOV AL,AH
    OUT 61H,AL
ENDM


StSeg SEGMENT STACK
    DB 64 dup (?)
StSeg ENDS
CodeSg SEGMENT
    ASSUME CS: CodeSg
    ORG 0100H
Main:
    JMP Load
    CARD DD ? ;存放原来的int 9 handle
    A3  DW 440 ;設定音樂符號語頻率
    AU3 DW 467
    B3  DW 494
    C4  DW 523
    CU4 DW 555
    D4  DW 587
    DU4 DW 623

MUSIC PROC ;音樂
    PUSH AX
    MOV AH,02H ;Get KBD
    INT 16H ;Status
    TEST AL,00001000B;Alt
    JZ Over
    IN AL,60H
    CMP AL,40H ;F6 Key
    JNE Over

    speaker 16000,D4
    speaker 16000,D4
    speaker 16000,CU4

Over: 
    IN  AL,60H
    CMP AL,41H ;F7 Key
    JNE final

    drawup
    draw 37,3,45,3,11100110B
    
final:
    POP AX
    JMP CS:CARD
MUSIC ENDP

    ASSUME CS:CodeSg,DS:CodeSg
Load PROC NEAR
    push CS
    pop DS
    MOV AH,35H ;Get Interrupt Vector
    MOV AL,09H
    INT 21H
    MOV WORD PTR CARD,BX
    MOV AX,ES
    MOV WORD PTR CARD+2,AX
    MOV AH,25H ;Set Interrupt Vector
    MOV AL,09H
    MOV DX,OFFSET MUSIC
    INT 21H
    MOV DX,(OFFSET Load-OFFSET CodeSg)
    ADD DX,15
    MOV CL,4
    SHR DX,CL
    MOV AH,31H;程序退出并驻留内存
    INT 21H
Load ENDP
CodeSg ENDS
    END Main

#5


引用 3 楼 wendaosheyu 的回复:
谁回答怎么挂起CPU,分给谁

不想要分,不回答。

#1


http://topic.csdn.net/u/20081002/13/2daf5cfb-a496-4c0e-99d8-e7cb050c865e.html
hmm,是code,但不是实现你要功能的code.

#2


BIOS有一个键盘缓冲区,INT 9触发时,从60H端口读入键盘扫描码,保存到键盘缓冲区。INT 16H从键盘缓冲区取扫描,并转换ASCII码返回。等待输入就是当缓冲区为空时循环一直检查,直到有数据为止。

#3


谁回答怎么挂起CPU,分给谁

#4


其实只要接管一下int 9就可以了,
以前收藏的一个,供参考:
1.接管INT 9 终端服务程序替换为发声程序.
2.退出并驻留内存,等待触发中断.
3.当有中断产生(如按键盘),进入新的中断服务程序Music.
4.检查按键是否是ALT+F6,or ALT+F7,如果不是就直接调用原本的INT9 中断服务程序处理.
   如果是ALT+F6,就调用speaker发出声音,最后调用原本的INT9 中断服务程序处理.
   如果是ALT+F7,就调用draw清屏,然后画图[黄色小矩形],调用原本的INT9 中断服务程序处理.
drawup MACRO;clear screen
    MOV AH,07H
    MOV CH,0
    MOV CL,0
    MOV DH,79
    MOV DL,79
    MOV BH,00000010B
    MOV AL,0
    int 10h
ENDM

draw MACRO S1,S2,S3,S4,S5
    MOV AH,07H
    MOV CH,S2
    MOV CL,S1
    MOV DH,S4
    MOV DL,S3
    MOV BH,S5
    MOV AL,0
    int 10h
ENDM

speaker MACRO time,freq;make a sound as the time and frequency
    local Dur,SpkrOn
    MOV BX,time
    MOV AX,0B6H
    OUT 43H,AL ;Timer 2 Control
    MOV DX,14H
    MOV AX,4F38H
    DIV freq
    OUT 42H,AL ;LowByte(Quo)
    MOV AL,AH
    OUT 42H,AL ;HighByte(Quo)
    IN AL,61H
    MOV AH,AL
    OR AL,03H ;SpeakOn
    OUT 61H,AL ;Timer 2 On

Dur:
    MOV CX,14546

SpkrOn:
    LOOP SpkrOn
    DEC BX
    JNZ Dur
    MOV AL,AH
    OUT 61H,AL
ENDM


StSeg SEGMENT STACK
    DB 64 dup (?)
StSeg ENDS
CodeSg SEGMENT
    ASSUME CS: CodeSg
    ORG 0100H
Main:
    JMP Load
    CARD DD ? ;存放原来的int 9 handle
    A3  DW 440 ;設定音樂符號語頻率
    AU3 DW 467
    B3  DW 494
    C4  DW 523
    CU4 DW 555
    D4  DW 587
    DU4 DW 623

MUSIC PROC ;音樂
    PUSH AX
    MOV AH,02H ;Get KBD
    INT 16H ;Status
    TEST AL,00001000B;Alt
    JZ Over
    IN AL,60H
    CMP AL,40H ;F6 Key
    JNE Over

    speaker 16000,D4
    speaker 16000,D4
    speaker 16000,CU4

Over: 
    IN  AL,60H
    CMP AL,41H ;F7 Key
    JNE final

    drawup
    draw 37,3,45,3,11100110B
    
final:
    POP AX
    JMP CS:CARD
MUSIC ENDP

    ASSUME CS:CodeSg,DS:CodeSg
Load PROC NEAR
    push CS
    pop DS
    MOV AH,35H ;Get Interrupt Vector
    MOV AL,09H
    INT 21H
    MOV WORD PTR CARD,BX
    MOV AX,ES
    MOV WORD PTR CARD+2,AX
    MOV AH,25H ;Set Interrupt Vector
    MOV AL,09H
    MOV DX,OFFSET MUSIC
    INT 21H
    MOV DX,(OFFSET Load-OFFSET CodeSg)
    ADD DX,15
    MOV CL,4
    SHR DX,CL
    MOV AH,31H;程序退出并驻留内存
    INT 21H
Load ENDP
CodeSg ENDS
    END Main

#5


引用 3 楼 wendaosheyu 的回复:
谁回答怎么挂起CPU,分给谁

不想要分,不回答。