利用汇编语言实现一个可以在显示器上显示秒、毫秒信息的电子秒表。
时间: 2024-03-08 11:47:36 浏览: 162
miaobiao.rar_ miaobiao_miaobiao_汇编语言秒表_电子秒表_秒表
5星 · 资源好评率100%
下面是一个简单的电子秒表程序,使用了80x86汇编语言,可以在显示器上显示秒、毫秒信息:
```
.model small
.stack 100h
.data
count dw 0
mscount dw 0
msg db 'Seconds: $'
msg1 db 'Milliseconds: $'
buf db 6 dup(0)
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 00h
int 1Ah ; 获取系统时间
mov count, cx ; 存储秒数
mov mscount, dx ; 存储毫秒数
mov ah, 09h
lea dx, msg
int 21h ; 显示“Seconds:”字符串
call display_count ; 显示秒数
call delay ; 延迟1秒
next:
mov ah, 00h
int 1Ah ; 获取系统时间
sub cx, count ; 计算已经过去的秒数
sub dx, mscount ; 计算已经过去的毫秒数
mov count, cx ; 存储新的秒数
mov mscount, dx ; 存储新的毫秒数
mov ah, 09h
lea dx, msg
int 21h ; 显示“Seconds:”字符串
call display_count ; 显示秒数
call display_mscount ; 显示毫秒数
call delay_ms ; 延迟10毫秒
jmp next
mov ah, 4ch
int 21h
main endp
; 延迟1秒
delay proc
mov cx, 0
mov dx, 0
mov bx, 1000 ; 循环1000次,每次延迟1毫秒
loop1:
push cx
push dx
call delay_ms
pop dx
pop cx
loop loop1
ret
delay endp
; 延迟10毫秒
delay_ms proc
mov cx, 0
mov dx, 0
mov bx, 10 ; 循环10次,每次延迟1毫秒
loop2:
push cx
push dx
mov ah, 00h
int 1Ah ; 获取系统时间
mov cx, dx
add cx, 1 ; 将毫秒数加1
cmp cx, 1000 ; 如果毫秒数等于1000,说明过了1秒,秒数加1,毫秒数清零
jne skip
mov cx, 0
inc count
skip:
mov dx, cx ; 存储新的毫秒数
pop dx
pop cx
loop loop2
ret
delay_ms endp
; 显示秒数
display_count proc
mov ax, count
mov si, offset buf
mov cx, 0
mov bx, 10
loop3:
xor dx, dx
div bx ; 将秒数除以10,得到一个余数和商
add dl, 30h ; 将余数转化为ASCII码
mov [si], dl ; 将余数存储到buf中
inc si
inc cx
cmp ax, 0 ; 如果商为0,说明已经将所有位数转化为ASCII码
jne loop3
mov ah, 09h
mov dx, offset buf
add dx, cx
dec si ; 将buf指向最后一个数字
loop4:
mov dl, [si] ; 从后往前依次显示数字
mov ah, 02h
int 21h
dec si
cmp si, offset buf ; 如果已经显示完所有数字,退出循环
jge loop4
mov ah, 02h
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h ; 显示回车和换行
ret
display_count endp
; 显示毫秒数
display_mscount proc
mov ax, mscount
mov si, offset buf
mov cx, 0
mov bx, 10
loop5:
xor dx, dx
div bx ; 将毫秒数除以10,得到一个余数和商
add dl, 30h ; 将余数转化为ASCII码
mov [si], dl ; 将余数存储到buf中
inc si
inc cx
cmp ax, 0 ; 如果商为0,说明已经将所有位数转化为ASCII码
jne loop5
mov ah, 09h
lea dx, msg1
int 21h ; 显示“Milliseconds:”字符串
mov ah, 09h
mov dx, offset buf
add dx, cx
dec si ; 将buf指向最后一个数字
loop6:
mov dl, [si] ; 从后往前依次显示数字
mov ah, 02h
int 21h
dec si
cmp si, offset buf ; 如果已经显示完所有数字,退出循环
jge loop6
mov ah, 02h
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
ret
display_mscount endp
end main
```
这个程序首先获取系统时间,将秒数和毫秒数存储在count和mscount变量中,然后显示“Seconds:”字符串,并调用display_count过程显示秒数。接下来程序进入一个循环,每次循环都获取系统时间,计算已经过去的秒数和毫秒数,调用display_count和display_mscount过程显示秒数和毫秒数,然后延迟10毫秒,再次进入循环。在每次延迟时,程序使用delay_ms过程实现,该过程计算每次循环应该延迟多长时间,并且每当毫秒数达到1000时,秒数加1,毫秒数清零。
阅读全文