127 lines
1.9 KiB
NASM
127 lines
1.9 KiB
NASM
; 实验九 - 键盘输入程序
|
|
; 功能: 使用INT 16H从键盘读取字符
|
|
; 模式: 文本模式 80x25 彩色
|
|
|
|
.MODEL SMALL
|
|
.DATA
|
|
PROMPT DB 'Please press any key: ', '$'
|
|
KEY_MSG DB 'You pressed: ', '$'
|
|
CRLF DB 0DH, 0AH, '$'
|
|
BUFFER DB 80 DUP(?)
|
|
|
|
.CODE
|
|
.STARTUP
|
|
; 设置数据段
|
|
MOV AX, @DATA
|
|
MOV DS, AX
|
|
|
|
; 显示提示信息
|
|
LEA DX, PROMPT
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
; 使用INT 16H读取按键 (AH=10H, 扩展键盘支持)
|
|
MOV AH, 10H
|
|
INT 16H
|
|
|
|
; 保存按键值
|
|
MOV [BUFFER], AL
|
|
MOV [BUFFER+1], AH
|
|
|
|
; 显示回车换行
|
|
LEA DX, CRLF
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
; 显示 "You pressed: "
|
|
LEA DX, KEY_MSG
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
; 显示按键的ASCII码
|
|
MOV AL, [BUFFER]
|
|
CALL PRINT_CHAR
|
|
|
|
; 显示扩展码
|
|
MOV AH, 02H
|
|
MOV DL, ' '
|
|
INT 21H
|
|
|
|
MOV AL, [BUFFER+1]
|
|
CALL PRINT_HEX
|
|
|
|
; 再次读取一个按键演示
|
|
LEA DX, CRLF
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
LEA DX, PROMPT
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
; 使用INT 16H的00H功能 (基本键盘读取)
|
|
MOV AH, 00H
|
|
INT 16H
|
|
|
|
; 显示按键
|
|
LEA DX, CRLF
|
|
MOV AH, 09H
|
|
INT 21H
|
|
LEA DX, KEY_MSG
|
|
MOV AH, 09H
|
|
INT 21H
|
|
|
|
MOV AL, AH
|
|
CALL PRINT_HEX
|
|
|
|
; 等待按键
|
|
MOV AH, 00H
|
|
INT 16H
|
|
|
|
.EXIT
|
|
|
|
; 子程序: 打印AL中的字符
|
|
PRINT_CHAR PROC
|
|
PUSH AX
|
|
MOV DL, AL
|
|
MOV AH, 02H
|
|
INT 21H
|
|
POP AX
|
|
RET
|
|
PRINT_CHAR ENDP
|
|
|
|
; 子程序: 以十六进制形式打印AL的内容
|
|
PRINT_HEX PROC
|
|
PUSH CX
|
|
PUSH DX
|
|
|
|
MOV DL, AL
|
|
MOV CL, 4
|
|
SHR DL, CL
|
|
CALL PRINT_NIBBLE
|
|
|
|
MOV DL, AL
|
|
AND DL, 0FH
|
|
CALL PRINT_NIBBLE
|
|
|
|
POP DX
|
|
POP CX
|
|
RET
|
|
PRINT_HEX ENDP
|
|
|
|
PRINT_NIBBLE PROC
|
|
PUSH DX
|
|
CMP DL, 10
|
|
JB IS_DIGIT
|
|
ADD DL, 'A' - 10
|
|
JMP PRINT_IT
|
|
IS_DIGIT:
|
|
ADD DL, '0'
|
|
PRINT_IT:
|
|
MOV AH, 02H
|
|
INT 21H
|
|
POP DX
|
|
RET
|
|
PRINT_NIBBLE ENDP
|
|
|
|
END |