; 实验九 - 键盘输入程序 ; 功能: 使用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