汇编网首页登录博客注册
chinatree的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
友情链接

[2011-09-24 21:54] 可以在dos下后台运行程序的方法

图片载入中
说白了也就是调用系统的中断,只是很少接触到:
assume cs:code 
code segment 
s:jmp go
b dw ?,?
d db 9,8,7,4,2,0 
  db "// :: " 
newint1c:pushf          ;新1ch中断入口
call dword ptr cs:b     ; 这里都是老程序了
push ax                  ;主意不要寄存器冲突就好
push bx
push cx
push dx
push si
push di
push es
mov ax,0b800h 
mov es,ax 
mov di,120 
xor si,si 
mov cx,6 
s1:mov al,cs:d[si] 
out 70h,al 
in al,71h 
mov ah,al 
shr ah,1 
shr ah,1 
shr ah,1 
shr ah,1 
and al,0fh 
add ax,3030h 
mov es:[di],ah 
mov ah,2 
mov es:[di+1],ah 
mov es:[di+2],ax 
mov al,cs:d[si+6] 
mov es:[di+4],ax 
inc si 
add di,6 
loop s1 
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
iret
go:push cs        
pop ds
mov ax,351ch  ;取老1ch中断的地址 ,21h中断35h号功能
int 21h     ;   1ch在系统中没有多大用           
mov b,bx    ; 但是它会被int 8中断每秒调用18次
mov bx,es   ;内存驻留也就是利用这个
mov b+2,bx   ;把es:bx保存在b中
mov dx,offset newint1c;置新的1ch中断,DS:DX中断入口
mov ax,251ch  ;25号功能
int 21h
mov dx,offset go-offset s;取新中断的字节数
mov cl,4
shr dx,cl;除16转换成节,这个中断是以16字节为单位的
add dx,1   ; 把余数也加进去,加1就够了
mov ax,3100h   ;结束并驻留,就可以后台运行了
int 21h        ;int 8 是时钟中断
code ends 
end s

我这个是直接写显存的,下面发个原版的,人家是用的bios int 10h中断
cursor equ 45h
attrib equ 2fh
code segment
assume cs:code,ds:code
start:jmp go
oldcur dw ?
old1c dw ?,?
newint1c:pushf
call dword ptr cs:old1c
push ax
push bx
push cx
push dx
xor bh,bh
mov ah,3
int 10h
mov cs:oldcur,dx
mov ah,2
xor bh,bh
mov dx,cursor
int 10h
mov ah,2
int 1ah
push dx
push cx
pop bx
push bx
call showbyte
call showcolon
pop bx
xchg bh,bl
call showbyte
call showcolon
pop bx
call showbyte
mov dx,cs:oldcur
mov ah,2
xor bh,bh
int 10h
pop dx
pop cx
pop bx
pop ax
iret
showbyte proc near
push bx
mov cl,4
mov al,bh
shr al,cl
add al,30h
call show
call curmove
pop bx
mov al,bh
and al,0fh
add al,30h
call show
call curmove
ret
showbyte endp
showcolon proc near
mov al,":"
call show
call curmove
ret
showcolon endp
curmove proc near
push ax
push bx
push cx
push dx
mov ah,3
mov bh,0
int 10h
inc dl
mov ah,2
int 10h
pop dx
pop cx
pop bx
pop ax
ret
curmove endp
show proc near
push ax
push bx
push cx
mov ah,09h
mov bx,attrib
mov cx,1
int 10h
pop cx
pop bx
pop ax
ret
show endp
go:push cs
pop ds
mov ax,351ch
int 21h
mov old1c,bx
mov bx,es
mov old1c+2,bx
mov dx,offset newint1c
mov ax,251ch
int 21h
mov dx,offset go-offset start
mov cl,4
shr dx,cl
add dx,11h
mov ax,3100h
int 21h
code ends
end start
这个只显示时分秒
ps:如果编译不通过,注意看下注释的分号,汉语的分号和英语的分号是不同的,否则会提示Out of memory.
评论次数(0)  |  浏览次数(863)  |  类型(默认类型) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码