汇编语言写比赛计时器,程序运行,屏幕显示00:00:00,并开始按秒计时。每按下一次空格键,在下一行显示当前暂停的时刻,最多可计10次暂停时间。按下Q键,程序退出在dosbox运行
时间: 2023-09-19 15:10:56 浏览: 194
好的,以下是一个实现比赛计时器的汇编语言程序,可以在DOSBox中运行。程序会在屏幕上显示00:00:00,并开始按秒计时。每当按下一次空格键,程序会在下一行显示当前暂停的时刻,最多可计10次暂停时间。当按下Q键时,程序会退出。
```
.MODEL SMALL
.STACK 100h
.DATA
timer DW 0 ; 计时器变量,存储经过的秒数
pause_times DB 10 DUP ('$') ; 记录暂停时间的数组,最多10次
.CODE
MAIN PROC
MOV AX, @DATA ; 初始化数据段寄存器
MOV DS, AX
; 显示计时器初始值
MOV AH, 0
MOV AL, 2
INT 10h
MOV AH, 0Eh
MOV AL, '0'
INT 10h
MOV AL, '0'
INT 10h
INT 10h
MOV AL, '0'
INT 10h
MOV AL, '0'
INT 10h
INT 10h
; 设置计时器中断频率为18.2Hz
MOV AL, 36
OUT 43h, AL
MOV AX, 65535
OUT 40h, AL
OUT 40h, AH
; 设置键盘中断
MOV AH, 25h
MOV AL, 9
MOV DX, OFFSET KEYBOARD
INT 21h
; 等待用户操作
MOV AH, 0
INT 16h
; 退出程序
MOV AH, 4Ch
INT 21h
MAIN ENDP
; 中断处理程序
TIMER PROC
; 保存寄存器
PUSH AX
PUSH BX
PUSH CX
PUSH DX
; 更新计时器
INC timer
MOV AX, timer
MOV BX, 3600
DIV BX
MOV CL, AL
ADD CL, '0'
MOV AH, 0Eh
MOV DL, CL
INT 10h
MOV CL, ':'
MOV AH, 0Eh
INT 10h
MOV AX, timer
MOV BX, 60
DIV BX
MOV CL, AL
ADD CL, '0'
MOV AH, 0Eh
MOV DL, CL
INT 10h
MOV CL, ':'
MOV AH, 0Eh
INT 10h
MOV AL, AH
MOV AH, 0Eh
MOV DL, AL
ADD DL, '0'
INT 10h
MOV AL, timer
AND AL, 0Fh
ADD AL, '0'
MOV AH, 0Eh
MOV DL, AL
INT 10h
; 恢复寄存器
POP DX
POP CX
POP BX
POP AX
; 中断返回
IRET
TIMER ENDP
; 键盘中断处理程序
KEYBOARD PROC
; 保存寄存器
PUSH AX
PUSH BX
PUSH CX
PUSH DX
; 检测键盘输入
MOV AH, 0
INT 16h
CMP AL, 20h
JNE SKIP_PAUSE
CMP BYTE PTR [pause_times], 10
JNE RECORD_PAUSE
; 暂停次数达到上限,不再记录暂停时间
JMP SKIP_PAUSE
RECORD_PAUSE:
; 记录暂停时间
MOV AH, 0Eh
MOV DL, 0Dh
INT 10h
MOV DL, 0Ah
INT 10h
MOV AL, ' '
INT 10h
MOV AL, '$'
MOV BYTE PTR [pause_times + 1], AL
INC BYTE PTR [pause_times]
SKIP_PAUSE:
; 恢复寄存器
POP DX
POP CX
POP BX
POP AX
; 中断返回
IRET
KEYBOARD ENDP
END MAIN
```
这个程序首先会显示计时器的初始值为00:00:00,然后会设置计时器中断频率为18.2Hz,并启动计时器。每次中断处理程序被调用时,程序会更新计时器的值,并在屏幕上显示当前的计时器值。当按下空格键时,程序会在下一行显示当前暂停的时刻,最多可记录10次暂停时间。当按下Q键时,程序会退出。
阅读全文