Files
2026-06-25 00:09:09 +08:00

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