设计在dosbox运行的汇编语言体育比赛计时程序,程序运行,屏幕显示00:00:00,并开始按秒计时。每按下一次空格键,在下一行显示当前暂停的时刻,最多可计10次暂停时间。按下Q键,程序退出。
时间: 2024-03-16 12:45:40 浏览: 151
下面是一个汇编语言程序,可以实现一个体育比赛计时器。这个程序使用8086汇编语言编写,可以在DOSBox中运行。程序使用了INT 16h中断来读取键盘输入,并且使用了INT 10h中断来在屏幕上显示计时器的值。程序的计时器是以毫秒为单位的,并且支持按下空格键来暂停计时,并在屏幕上显示暂停时间,最多可计10次暂停时间。按下Q键,程序退出。
```
.model small
.stack 100h
.data
count dw 0 ;计时器计数器
pause_time dw 0 ;暂停时间计数器
pause_count dw 0 ;暂停次数计数器
pause_list dw 10 dup(0) ;暂停时间列表
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 0 ;获取当前时间
int 1ah
mov count, dx ;保存计数器值
mov ah, 0 ;清屏
mov al, 3
int 10h
mov ah, 2 ;将计时器值显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 0
mov al, '0'
int 10h
mov ah, 2 ;将冒号显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 1
mov al, ':'
int 10h
mov ah, 2 ;将计时器值显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 2
mov al, '0'
int 10h
mov ah, 2 ;将冒号显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 3
mov al, ':'
int 10h
mov ah, 2 ;将计时器值显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 4
mov al, '0'
int 10h
loop1:
mov ah, 0 ;读取键盘输入
int 16h
cmp al, ' ' ;如果按下空格键,则记录暂停时间
jne loop2
cmp pause_count, 10 ;如果暂停次数达到10次,则不再记录暂停时间
jge loop2
mov ah, 0
int 1ah ;获取当前时间
sub dx, count ;计算时间差值
mov pause_time, dx ;保存暂停时间
mov bx, pause_time ;将暂停时间保存到bx中
mov pause_list[si], bx ;将暂停时间保存到暂停时间列表中
add si, 2 ;增加列表索引
inc pause_count ;增加暂停次数计数器
jmp loop1
loop2:
mov ah, 0 ;获取当前时间
int 1ah
sub dx, count ;计算时间差值
add dx, pause_time ;加上暂停时间
mov bx, dx ;将时间差值保存到bx中
mov ax, bx ;将时间保存到ax中
mov cx, 1000 ;将1000保存到cx中
div cx ;将时间除以1000,得到秒数
mov bx, ax ;将秒数保存到bx中
mov ax, bx ;将秒数保存到ax中
mov cx, 60 ;将60保存到cx中
div cx ;将秒数除以60,得到分钟数
mov dx, ax ;将分钟数保存到dx中
mov ax, bx ;将秒数保存到ax中
mov cx, 60 ;将60保存到cx中
div cx ;将秒数除以60,得到余下的秒数
mov ah, 2 ;将分钟数的十位数显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 0
mov al, dh
add al, 30h ;将数字转换为ASCII码
int 10h
mov ah, 2 ;将分钟数的个位数显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 1
mov al, dl
add al, 30h ;将数字转换为ASCII码
int 10h
mov ah, 2 ;将冒号显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 2
mov al, ':'
int 10h
mov ah, 2 ;将余下的秒数的十位数显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 3
mov al, ah
add al, 30h ;将数字转换为ASCII码
int 10h
mov ah, 2 ;将余下的秒数的个位数显示在屏幕上
mov bh, 0
mov dh, 0
mov dl, 4
mov al, dl
add al, 30h ;将数字转换为ASCII码
int 10h
cmp pause_count, 0 ;如果已经暂停过,显示暂停时间列表
je loop3
mov cx, pause_count ;循环显示暂停时间
mov si, 0 ;将列表索引清零
mov dl, 0 ;将显示列清零
mov dh, 1 ;将显示行加1
loop4:
mov ax, pause_list[si] ;将暂停时间从列表中读取出来
add si, 2 ;增加列表索引
mov bx, ax ;将暂停时间保存到bx中
mov ah, 2 ;将冒号显示在屏幕上
mov bh, 0
mov dh, dl
mov dl, 0
mov al, ':'
int 10h
mov ax, bx ;将时间保存到ax中
mov cx, 1000 ;将1000保存到cx中
div cx ;将时间除以1000,得到秒数
mov bx, ax ;将秒数保存到bx中
mov ax, bx ;将秒数保存到ax中
mov cx, 60 ;将60保存到cx中
div cx ;将秒数除以60,得到分钟数
mov dx, ax ;将分钟数保存到dx中
mov ax, bx ;将秒数保存到ax中
mov cx, 60 ;将60保存到cx中
div cx ;将秒数除以60,得到余下的秒数
mov ah, 2 ;将分钟数的十位数显示在屏幕上
mov bh, 0
mov dh, dl
mov dl, 1
mov al, dh
add al, 30h ;将数字转换为ASCII码
int 10h
mov ah, 2 ;将分钟数的个位数显示在屏幕上
mov bh, 0
mov dh, dl
mov dl, 2
mov al, dl
add al, 30h ;将数字转换为ASCII码
int 10h
mov ah, 2 ;将冒号显示在屏幕上
mov bh, 0
mov dh, dl
mov dl, 3
mov al, ':'
int 10h
mov ah, 2 ;将余下的秒数的十位数显示在屏幕上
mov bh, 0
mov dh, dl
mov dl, 4
mov al, ah
add al, 30h ;将数字转换为ASCII码
int 10h
inc dl ;增加显示列
cmp dl, 5 ;如果显示列达
阅读全文