这个就是具体的程序,初学汇编,写出这个程序发现问题不少,虽然可以驻留内存显示,但是用上下键选择最近执行过的命令没用,执行EDIT出现异常,本来想按CTRL+Q退出并卸载,可惜还不懂。取时间本来可以直接系统调用,这里尝试一下自己取时间
time segment
org 100h
assume cs:time,ds:time,ss:time
start proc near
jmp begin
oldseg dw ?
oldoff dw ?
ms dw 0
sec db 0
min db 0
hr db 0
begin: mov ah,35h
mov al,1ch
int 21h;取中断
mov oldseg,es
mov oldoff,bx
lea dx,add55
mov ah,25h
mov al,1ch
int 21h;设置新中断
in al,21h
and al,11111100b
out 21h,al
sti
jmp tsr
back: mov ah,8;8=ctrl+q,目前这段无效,还不知如何卸载
int 21h
cmp al,11h
jne back
mov dx,oldoff
mov ax,es
mov ds,ax
mov ax,251ch
int 21h
int 20h
start endp
add55 proc near
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
sti
add ms,55
cmp ms,1000
jge exit
sub ms,1000
call near ptr gettime
call near ptr disp
exit: cli
pop es
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
iret
add55 endp
disp proc near
push ax
push cx
push dx
push es
mov ax,0b800h
mov es,ax
disp_h: mov al,hr
xor ah,ah
mov cl,10
div cl
add al,30h
mov es:[0f88h],al
add ah,30h
mov es:[0f8ah],ah
disp_: mov al,':'
mov es:[0f8ch],al
mov es:[0f92h],al
pop es
pop dx
pop cx
pop ax
ret
disp endp
tsr: mov dx,offset tsr
int 27h
jmp back
gettime proc near
push ax
push bx
push cx
push dx
push es
;mov ax,data
;mov ds,ax
xor ax,ax
mov es,ax
mov dl,es:[46eh]
mov dh,es:[46fh]
mov al,es:[46ch]
mov ah,es:[46dh]
mov bx,91
div bx;ax有几个5秒,余数DX/18.2就是秒数
mov cx,dx
mov bx,5
mul bx
push dx
push ax
mov ax,cx
mul bx
mov bx,91
div bx
pop cx
add ax,cx
pop dx;ds:ax=secs
mov cx,3600
div cx
mov hr,al
mov ax,dx
mov cl,60
div cl
mov min,al
mov sec,ah
pop es
pop dx
pop cx
pop bx
pop ax
ret
gettime endp
time ends
end start