用汇编语言写一个简易的电子秒表
时间: 2023-09-29 18:09:49 浏览: 216
好的,下面是一个简单的汇编语言程序,可以实现电子秒表功能:
```
; 电子秒表程序
ORG 100h ; 程序从100h地址开始
; 定义常量
SECOND equ 1000 ; 每秒钟的计数值
KEY equ 60 ; 按键扫描码
; 初始化
mov al, 0 ; 秒表计数器清零
mov bl, 0 ; 分钟计数器清零
mov cl, 0 ; 小时计数器清零
mov dh, 0 ; 显示小时数的十位清零
mov dl, 0 ; 显示小时数的个位清零
mov bh, 0 ; 显示分钟数的十位清零
mov ch, 0 ; 显示分钟数的个位清零
mov ah, 2 ; 设置光标位置
mov bh, 0 ; 页码
mov dh, 0 ; 行号
mov dl, 0 ; 列号
int 10h ; 调用BIOS中断显示光标
; 主循环
loop:
; 检测按键
mov ah, 0 ; 设置功能号
int 16h ; 调用BIOS中断读取键盘输入
cmp ah, 0 ; 判断是否有键按下
je tick ; 如果没有键按下,则计时器加1秒
cmp al, KEY ; 判断是否按下开始/暂停键
je pause ; 如果按下开始/暂停键,则跳转到pause处理
cmp al, 1 ; 判断是否按下复位键
je reset ; 如果按下复位键,则跳转到reset处理
jmp loop ; 否则继续循环
; 计时器加1秒
tick:
inc al ; 秒表计数器加1
cmp al, 60 ; 判断是否达到1分钟
jl show_sec ; 如果没有,直接显示秒数
mov al, 0 ; 秒表计数器清零
inc bl ; 分钟计数器加1
cmp bl, 60 ; 判断是否达到1小时
jl show_min ; 如果没有,直接显示分钟数
mov bl, 0 ; 分钟计数器清零
inc cl ; 小时计数器加1
cmp cl, 24 ; 判断是否达到1天
jl show_hr ; 如果没有,直接显示小时数
mov cl, 0 ; 小时计数器清零
; 显示小时数
show_hr:
mov dh, cl ; 更新显示小时数的十位
shr dh, 4 ; 将高4位移到低4位
and dh, 0fh ; 取低4位
add dh, 30h ; 转换为ASCII码
mov dl, cl ; 更新显示小时数的个位
and dl, 0fh ; 取低4位
add dl, 30h ; 转换为ASCII码
mov ah, 2 ; 设置光标位置
mov bh, 0 ; 页码
mov dh, 0 ; 行号
mov dl, 8 ; 列号
int 10h ; 调用BIOS中断显示光标
; 显示分钟数
show_min:
mov bh, 0 ; 页码
mov ch, bl ; 更新显示分钟数的十位
shr ch, 4 ; 将高4位移到低4位
and ch, 0fh ; 取低4位
add ch, 30h ; 转换为ASCII码
mov cl, bl ; 更新显示分钟数的个位
and cl, 0fh ; 取低4位
add cl, 30h ; 转换为ASCII码
mov ah, 2 ; 设置光标位置
mov bh, 0 ; 页码
mov dh, 0 ; 行号
mov dl, 11 ; 列号
int 10h ; 调用BIOS中断显示光标
; 显示秒数
show_sec:
mov bh, 0 ; 页码
mov ah, 2 ; 设置光标位置
mov dh, 0 ; 行号
mov dl, 14 ; 列号
mov al, al ; 更新显示秒数的个位
and al, 0fh ; 取低4位
add al, 30h ; 转换为ASCII码
int 10h ; 调用BIOS中断显示光标
jmp loop ; 继续主循环
; 暂停处理
pause:
mov ah, 0 ; 设置功能号
int 16h ; 调用BIOS中断读取键盘输入
cmp al, KEY ; 判断是否按下开始/暂停键
jne pause ; 如果没有,则继续等待
jmp loop ; 否则回到主循环
; 复位处理
reset:
mov al, 0 ; 秒表计数器清零
mov bl, 0 ; 分钟计数器清零
mov cl, 0 ; 小时计数器清零
mov dh, 0 ; 显示小时数的十位清零
mov dl, 0 ; 显示小时数的个位清零
mov bh, 0 ; 显示分钟数的十位清零
mov ch, 0 ; 显示分钟数的个位清零
mov ah, 2 ; 设置光标位置
mov bh, 0 ; 页码
mov dh, 0 ; 行号
mov dl, 8 ; 列号
int 10h ; 调用BIOS中断显示光标
mov ah, 2 ; 设置光标位置
mov bh, 0 ; 页码
mov dh, 0 ; 行号
mov dl, 11 ; 列号
int 10h ; 调用BIOS中断显示光标
mov ah, 2 ; 设置光标位置
mov bh, 0 ; 页码
mov dh, 0 ; 行号
mov dl, 14 ; 列号
int 10h ; 调用BIOS中断显示光标
jmp loop ; 回到主循环
; 程序结束
mov ah, 4ch ; 设置功能号
int 21h ; 调用DOS中断结束程序
```
这个程序使用了BIOS中断来读取键盘输入和显示输出。程序在主循环中不断计时,并且检测是否有键按下。如果检测到开始/暂停键,程序会进入暂停处理;如果检测到复位键,程序会进入复位处理;否则,程序会继续计时并且更新显示。
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![ASM](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)