题目: 使用中断程序设计的方法,编写一个驻留程序,该程序可以在屏幕窗口的右下角显示当前的时间,格式为HH:MM:SS,时间的显示不能影响前台程序的正常运行
时间: 2023-06-17 16:07:13 浏览: 247
这个题目需要涉及到操作系统级别的编程,需要使用汇编语言和中断程序设计的知识。以下是一个简单的示例程序,可以显示当前时间,并且不影响前台程序的运行。
```asm
.model small
.stack 100h
.data
time db '00:00:00$' ; 存储当前时间
oldInt9 dd ? ; 存储原来的中断处理程序
.code
main proc
mov ax, @data
mov ds, ax
; 保存原来的中断处理程序
mov ax, 350h
mov es, ax
mov ax, word ptr es:[2ch] ; 获取原来的中断处理程序地址
mov word ptr oldInt9, ax
mov ax, word ptr es:[2eh]
mov word ptr oldInt9+2, ax
; 设置新的中断处理程序
mov ax, 350h
mov es, ax
mov dx, offset newInt9 ; 设置新的中断处理程序地址
mov word ptr es:[2ch], dx
mov dx, cs
mov word ptr es:[2eh], dx
; 初始化计数器
mov ah, 0
int 1ah ; 获取系统时间
mov byte ptr time, ch ; 存储小时
mov byte ptr time+3, cl ; 存储分钟
mov byte ptr time+6, dh ; 存储秒钟
; 显示时间
mov ah, 9
mov dx, offset time
int 21h
; 等待用户按下任意键
mov ah, 0
int 16h
; 恢复原来的中断处理程序
mov ax, 350h
mov es, ax
mov ax, word ptr oldInt9
mov word ptr es:[2ch], ax
mov ax, word ptr oldInt9+2
mov word ptr es:[2eh], ax
mov ah, 4ch
int 21h
main endp
newInt9 proc
push ax
push bx
push cx
push dx
mov ah, 0
int 1ah ; 获取系统时间
mov byte ptr time, ch ; 存储小时
mov byte ptr time+3, cl ; 存储分钟
mov byte ptr time+6, dh ; 存储秒钟
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, ' ' ; 先清除原来的时间
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, byte ptr time+1 ; 显示小时十位
sub dl, 48 ; 将字符转换为数字
add dl, 30h ; 转换为字符
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, byte ptr time+2 ; 显示小时个位
sub dl, 48 ; 将字符转换为数字
add dl, 30h ; 转换为字符
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, ':' ; 显示冒号
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, byte ptr time+4 ; 显示分钟十位
sub dl, 48 ; 将字符转换为数字
add dl, 30h ; 转换为字符
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, byte ptr time+5 ; 显示分钟个位
sub dl, 48 ; 将字符转换为数字
add dl, 30h ; 转换为字符
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, ':' ; 显示冒号
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, byte ptr time+7 ; 显示秒钟十位
sub dl, 48 ; 将字符转换为数字
add dl, 30h ; 转换为字符
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, byte ptr time+8 ; 显示秒钟个位
sub dl, 48 ; 将字符转换为数字
add dl, 30h ; 转换为字符
mov dh, 24
int 10h
mov ah, 0ch ; 设置光标位置
mov bh, 0
mov dl, ' ' ; 显示空格
mov dh, 24
int 10h
pop dx
pop cx
pop bx
pop ax
jmp word ptr oldInt9 ; 跳转到原来的中断处理程序
newInt9 endp
end main
```
这个程序使用中断 9h 来实现键盘输入的处理,同时使用中断 1ah 来获取系统时间。在新的中断处理程序中,先获取当前系统时间,然后根据时间的格式在屏幕上显示出来。在主程序中,先设置新的中断处理程序,然后显示一次当前时间,并等待用户按下任意键后恢复原来的中断处理程序。
阅读全文