用汇编语言 体育比赛计时程序,程序运行,屏幕显示00:00:00,并开始按秒计时。每按下一次空格键,在下一行显示当前暂停的时刻,最多可计10次暂停时间。按下Q键,程序退出。
时间: 2024-03-20 12:40:09 浏览: 179
以下是汇编语言实现体育比赛计时程序的代码,实现了在屏幕上按秒计时,并能够在空格键按下时显示当前暂停的时刻,最多可计10次暂停时间,按下Q键退出程序:
```
.model small
.stack 100h
.data
time db "00:00:00", "$"
pauseTime db " ", "$"
count dw 0
.code
main proc
mov ax, @data
mov ds, ax
; 初始化计时器
mov al, 00110110b ; 8253 控制字,选择计数器 0,工作方式 3,二进制计数器
out 43h, al
mov ax, 1193 ; 8253 计数器初值,时钟频率 1.19318 MHz,计数器 0 为 16 位,计时 1 秒
out 40h, al
mov al, ah
out 40h, al
; 开启时钟中断
mov al, 00000011b ; 8259 控制字,开启 IRQ0 中断
out 21h, al
mov al, 11111101b ; 8259 屏蔽字,屏蔽除 IRQ0 外的所有中断
out 21h, al
mov ah, 2 ; 设置光标位置,将时间和暂停时间显示在屏幕上
mov bh, 0
mov dh, 1
mov dl, 0
int 10h
mov ah, 9
lea dx, time
int 21h
mov ah, 2
mov bh, 0
mov dh, 2
mov dl, 0
int 10h
; 进入计时循环
mov cx, 0
mov dx, 0
mov ah, 0
int 1ah ; 读取计时器值
mov bx, dx
mov ax, 0
mov dx, 0
mov ah, 0
int 1ah ; 再次读取计时器值
sub bx, dx ; 计算计时器差值
add cx, bx ; 累加计时器差值
mov bx, cx
mov al, [count]
cmp al, 10 ; 判断是否已到最大暂停次数
je finish
cmp ah, 20h ; 判断是否按下空格键
jne skip_pause
inc byte ptr [count] ; 暂停次数加 1
mov ah, 2 ; 设置光标位置,显示当前暂停时间
mov bh, 0
add dh, byte ptr [count]
mov dl, 0
int 10h
mov ah, 9
lea dx, pauseTime
int 21h
mov ah, 2 ; 设置光标位置,继续计时
mov bh, 0
add dh, 1
mov dl, 0
int 10h
skip_pause:
cmp ah, 10h ; 判断是否按下 Q 键
jne loop
finish:
mov ah, 4ch ; 退出程序
int 21h
main endp
; 中断处理程序
clock proc
push ax
push bx
push cx
push dx
mov ah, 0
int 1ah ; 读取计时器值
mov bx, dx
mov ax, 0
mov dx, 0
mov ah, 0
int 1ah ; 再次读取计时器值
sub bx, dx ; 计算计时器差值
add cx, bx ; 累加计时器差值
mov bx, cx
mov ah, 2 ; 设置光标位置,更新时间显示
mov bh, 0
mov dh, 1
mov dl, 0
int 10h
mov ah, 9
lea dx, time
int 21h
pop dx
pop cx
pop bx
pop ax
iret
clock endp
; 中断向量表
org 0000h
jmp start
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
start:
mov ax, @data
mov ds, ax
mov dx, offset clock
mov ah, 25h
int 21h
mov ax, 0
mov es, ax
mov bx, es:[0022h]
mov es:[bx+08h], dx
mov es:[bx+0ah], cs
mov ax, 0
mov es, ax
mov bx, es:[002ch]
and byte ptr es:[bx+01h], 11111110b
mov ah, 0
int 1ah ; 初始化计时器
mov al, 11111011b ; 8259 屏蔽字,开启所有中断
out 21h, al
mov ax, 4c00h ; 进入主程序
int 21h
end
```
注意:以上代码是基于 DOS 环境下的汇编语言实现,可能无法在现代操作系统上直接运行。这段代码仅供参考,实际应用时需要进行适当的修改。
阅读全文