Files
Operating-System/Experiment/asm-exp/实验九/keyboard_counter.asm
2026-06-25 00:09:09 +08:00

160 lines
2.5 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; 实验九 - 键盘计数器程序
; 功能: 统计按键次数并显示
; 模式: 文本模式 80x25 彩色
.MODEL SMALL
.DATA
TITLE_MSG DB '=== Keyboard Counter ===', 0DH, 0AH, '$'
COUNT_MSG DB 'Key presses: ', '$'
EXIT_MSG DB 0DH, 0AH, 'Press ESC to exit.', '$'
COUNT_STR DB '00000', '$'
CRLF DB 0DH, 0AH, '$'
.CODE
.STARTUP
MOV AX, @DATA
MOV DS, AX
; 清除屏幕
MOV AX, 0600H
MOV BH, 07H
MOV CX, 0000H
MOV DX, 184FH
INT 10H
; 显示标题
LEA DX, TITLE_MSG
MOV AH, 09H
INT 21H
; 显示计数初始值
LEA DX, COUNT_MSG
MOV AH, 09H
INT 21H
LEA DX, COUNT_STR
MOV AH, 09H
INT 21H
; 初始化计数器
XOR CX, CX ; CX = 0
COUNT_LOOP:
; 检查是否有按键按下 (INT 16H, AH=01H)
MOV AH, 01H
INT 16H
JZ NO_KEY ; ZF=1 表示无按键
; 读取按键 (INT 16H, AH=00H)
MOV AH, 00H
INT 16H
; 检查是否是ESC键
CMP AH, 01H ; ESC的扫描码
JE EXIT_PROGRAM
; 计数器加1
INC CX
; 将计数器值转换为字符串
CALL WORD_TO_STR
; 清除当前行
MOV AH, 02H
MOV BH, 0
MOV DH, 2
MOV DL, 0
INT 10H
; 显示当前计数
MOV AH, 13H
MOV AL, 01H
MOV BH, 0
MOV BL, 0FH
MOV DX, OFFSET COUNT_MSG
MOV CX, 12
PUSH DS
POP ES
MOV BP, DX
INT 10H
; 重新显示计数
MOV AH, 02H
MOV BH, 0
MOV DH, 2
MOV DL, 12
INT 10H
LEA DX, COUNT_STR
MOV AH, 09H
INT 21H
NO_KEY:
; 短暂延时避免过度消耗CPU
MOV CX, 0FFFFH
DELAY:
LOOP DELAY
JMP COUNT_LOOP
EXIT_PROGRAM:
; 按下ESC退出程序
MOV AH, 00H
INT 16H
; 清除屏幕
MOV AX, 0600H
MOV BH, 07H
MOV CX, 0000H
MOV DX, 184FH
INT 10H
.EXIT
; 子程序: 将CX中的16位数值转换为字符串
WORD_TO_STR PROC
PUSH AX
PUSH BX
PUSH DX
; 将数字分解为万位、千位、百位、十位、个位
MOV AX, CX
MOV BX, 10
; 个位
MOV DX, 0
DIV BX
ADD DL, '0'
MOV [COUNT_STR+4], DL
; 十位
MOV DX, 0
DIV BX
ADD DL, '0'
MOV [COUNT_STR+3], DL
; 百位
MOV DX, 0
DIV BX
ADD DL, '0'
MOV [COUNT_STR+2], DL
; 千位
MOV DX, 0
DIV BX
ADD DL, '0'
MOV [COUNT_STR+1], DL
; 万位
MOV DX, 0
DIV BX
ADD DL, '0'
MOV [COUNT_STR], DL
POP DX
POP BX
POP AX
RET
WORD_TO_STR ENDP
END