dosbox汇编语言写比赛计时程序,程序运行,屏幕显示00:00:00,并开始按秒计时。每按下一次空格键,在下一行显示当前暂停的时刻,最多可计10次暂停时间。按下Q键,程序退出。11.体育比赛计时程序,程序运行,屏幕显示00:00:00,并开始按秒计时。每按下一次空格键,在下一行显示当前暂停的时刻,最多可计10次暂停时间。按下Q键,程序退出。
时间: 2024-03-17 16:45:34 浏览: 121
汇编计时程序,按秒分时天月年计
以下是用汇编语言编写的比赛计时程序,可以在DOSBox中运行:
```
; 比赛计时程序
.model small
.stack 100h
; 定义数据段
.data
time db 0,0,0 ; 记录秒、分、时的变量
pause_times db 10 ; 最多暂停10次
pause_records db 10 dup(3 dup(0)) ; 记录暂停时间的数组,每次暂停记录3个字节,最多10次
prompt db "Press SPACE to pause, Q to quit.", 0ah, " 00:00:00", 0
pause_prompt db "Pause at 00:00:00", 0ah, " 00:00:00", 0
; 定义代码段
.code
start:
mov ax, @data
mov ds, ax
; 显示提示信息
mov ah, 9
lea dx, prompt
int 21h
; 开始计时
mov ah, 2ch
int 21h ; 获取系统时间
mov [time], cl ; 初始化秒
mov [time+1], ch ; 初始化分
mov [time+2], dh ; 初始化时
; 进入循环
mov cx, pause_times ; 初始化暂停次数为10
mov si, offset pause_records ; 初始化暂停记录数组的偏移量
loop_start:
; 显示当前时间
call display_time
; 等待用户按键
mov ah, 0
int 16h ; 等待键盘输入
cmp al, ' ' ; 如果是空格键
je pause_time ; 跳转到暂停时间处理
cmp al, 'q' ; 如果是Q键
je quit_program ; 跳转到退出程序处理
jmp loop_start ; 否则继续循环
pause_time:
; 显示暂停时间
mov ah, 2ch
int 21h ; 获取系统时间
mov [si], cl ; 记录秒
mov [si+1], ch ; 记录分
mov [si+2], dh ; 记录时
add si, 3 ; 增加暂停记录数组的偏移量
dec cx ; 减少暂停次数
cmp cx, 0 ; 如果还可以暂停
jne loop_start ; 跳转到循环开始
jmp quit_program ; 否则退出程序
quit_program:
mov ah, 4ch
int 21h ; 退出程序
; 显示当前时间
display_time proc
; 获取系统时间
mov ah, 2ch
int 21h
; 计算经过的时间
sub cl, [time] ; 秒数
cmp cl, 60
jb minute_not_changed
sub ch, 1 ; 分钟数
mov [time], 0 ; 秒数清零
minute_not_changed:
sub dh, [time+1] ; 分钟数
cmp dh, 60
jb hour_not_changed
sub [time+2], 1 ; 小时数
mov [time+1], 0 ; 分钟数清零
hour_not_changed:
sub [time+2], dh ; 小时数
; 显示时间
mov ah, 9
lea dx, prompt+2
mov dl, [time+1] ; 分钟数的十位
shr dl, 4
add dl, 30h
int 21h
mov dl, [time+1] ; 分钟数的个位
and dl, 0fh
add dl, 30h
int 21h
mov dl, ':'
int 21h
mov dl, [time+2] ; 小时数的十位
shr dl, 4
add dl, 30h
int 21h
mov dl, [time+2] ; 小时数的个位
and dl, 0fh
add dl, 30h
int 21h
; 显示暂停记录
mov cx, pause_times ; 暂停次数
mov si, offset pause_records ; 暂停记录数组的偏移量
display_pause_records:
cmp cx, 0 ; 如果没有暂停记录
je display_end
add si, 3 ; 读取下一个暂停记录
mov dl, ' '
int 21h
mov dl, [si+1] ; 暂停分钟数的十位
shr dl, 4
add dl, 30h
int 21h
mov dl, [si+1] ; 暂停分钟数的个位
and dl, 0fh
add dl, 30h
int 21h
mov dl, ':'
int 21h
mov dl, [si+2] ; 暂停小时数的十位
shr dl, 4
add dl, 30h
int 21h
mov dl, [si+2] ; 暂停小时数的个位
and dl, 0fh
add dl, 30h
int 21h
dec cx ; 剩余暂停次数减1
jmp display_pause_records
display_end:
; 显示暂停提示信息
mov ah, 9
lea dx, pause_prompt
int 21h
ret
display_time endp
end start
```
程序使用了DOS的中断功能来获取系统时间和等待键盘输入,主要思路是在一个循环中不断显示当前时间,并等待用户的输入。如果用户按下了空格键,程序会记录当前时间并显示在下一行,最多可以记录10次。如果用户按下了Q键,程序会退出程序。
阅读全文