使用汇编语言制作一个程序,要求如下:11. 体育比赛计时程序,程序运行,屏幕显示 00:00:00,并开始按秒计时。每按下一次空格键,在下一行显示当前暂停的时刻,最多可计10次暂停时间。按下Q键,程序退出。
时间: 2024-03-17 13:40:32 浏览: 223
汇编语言实现体育比赛计时程序的代码如下:
```
.MODEL SMALL
.STACK 100h
.DATA
time DB 0, 0, 0, 0, 0, 0 ; 存储时间的数组,依次为:小时、分钟、秒、毫秒、暂停次数、暂停时间
msg1 DB '00:00:00$' ; 初始时间的字符串
msg2 DB 'Pause time: $' ; 暂停时间的字符串
msg3 DB 'Press Space to pause, Q to quit.$' ; 提示信息的字符串
.CODE
MAIN PROC
MOV AX, @DATA ; 初始化数据段寄存器
MOV DS, AX
MOV AH, 0 ; 设置计时器
INT 1Ah ; 获取系统时间
MOV [time], CH ; 将小时存储到数组中
MOV [time+1], CL ; 将分钟存储到数组中
MOV [time+2], DH ; 将秒钟存储到数组中
MOV AH, 2 ; 显示初始时间
MOV DL, 13 ; 光标移动到下一行
INT 21h
MOV DL, 10 ; 光标移动到下一列
INT 21h
LEA DX, msg1 ; 装载初始时间的字符串
MOV AH, 9 ; 显示字符串
INT 21h
MOV DL, 13 ; 光标移动到下一行
INT 21h
MOV DL, 10 ; 光标移动到下一列
INT 21h
LEA DX, msg3 ; 装载提示信息的字符串
MOV AH, 9 ; 显示字符串
INT 21h
MOV [time+4], 0 ; 初始化暂停次数为0
loop1:
MOV AH, 0 ; 设置计时器
INT 1Ah ; 获取系统时间
MOV BH, [time+2] ; 保存上一次的秒钟数
MOV [time+2], DH ; 将当前秒钟存储到数组中
SUB DH, [time] ; 计算小时数的差值
CMP BH, [time+2] ; 比较上一次和当前的秒钟数
JAE skip ; 如果秒钟数没有变化,跳过下面的操作
ADD [time+3], 10 ; 毫秒数加10
CMP [time+3], 100 ; 如果毫秒数超过100,进位
JAE carry
JMP update
skip:
ADD [time+3], 1 ; 毫秒数加1
CMP [time+3], 100 ; 如果毫秒数超过100,进位
JAE carry
update:
MOV DL, 13 ; 光标移动到下一行
INT 21h
MOV DL, 10 ; 光标移动到下一列
INT 21h
MOV AH, 2 ; 显示当前时间
MOV DL, [time]
ADD DL, 30H ; 将小时数转换为ASCII码
INT 21h
MOV DL, ':'
INT 21h
MOV DL, [time+1]
ADD DL, 30H ; 将分钟数转换为ASCII码
INT 21h
MOV DL, ':'
INT 21h
MOV DL, [time+2]
ADD DL, 30H ; 将秒钟数转换为ASCII码
INT 21h
MOV DL, '.'
INT 21h
MOV DL, [time+3]
ADD DL, 30H ; 将毫秒数转换为ASCII码
INT 21h
MOV AH, 0 ; 检测键盘输入
INT 16h
CMP AH, 20h ; 如果是空格键
JNE skip2
CMP [time+4], 10 ; 如果暂停次数已满,提示错误信息
JE error
MOV AH, 2 ; 显示暂停时间
MOV DL, 13 ; 光标移动到下一行
INT 21h
MOV DL, 10 ; 光标移动到下一列
INT 21h
LEA DX, msg2 ; 装载暂停时间的字符串
MOV AH, 9 ; 显示字符串
INT 21h
MOV AH, 2 ; 显示当前暂停时间
MOV DL, [time]
ADD DL, 30H
INT 21h
MOV DL, ':'
INT 21h
MOV DL, [time+1]
ADD DL, 30H
INT 21h
MOV DL, ':'
INT 21h
MOV DL, [time+2]
ADD DL, 30H
INT 21h
MOV DL, '.'
INT 21h
MOV DL, [time+3]
ADD DL, 30H
INT 21h
MOV AX, [time+4] ; 暂停次数加1
ADD AX, 1
MOV [time+4], AX
MOV AX, [time+5] ; 累加暂停时间
ADD AX, [time+3]
MOV [time+5], AX
MOV [time+3], 0 ; 重置毫秒数
JMP loop1
skip2:
CMP AH, 10h ; 如果是Q键,退出程序
JE exit
JMP loop1
error:
MOV AH, 2 ; 显示错误信息
MOV DL, 13 ; 光标移动到下一行
INT 21h
MOV DL, 10 ; 光标移动到下一列
INT 21h
MOV DX, OFFSET msg2 ; 装载错误信息的字符串
MOV AH, 9 ; 显示字符串
INT 21h
JMP loop1
carry:
ADD [time+2], 1 ; 秒钟数加1
CMP [time+2], 60 ; 如果秒钟数超过60,进位
JNE update
MOV [time+2], 0 ; 重置秒钟数
ADD [time+1], 1 ; 分钟数加1
CMP [time+1], 60 ; 如果分钟数超过60,进位
JNE update
MOV [time+1], 0 ; 重置分钟数
ADD [time], 1 ; 小时数加1
CMP [time], 24 ; 如果小时数超过24,重置为0
JNE update
MOV [time], 0
exit:
MOV AH, 4Ch ; 退出程序
INT 21h
MAIN ENDP
END MAIN
```
阅读全文