- [kanwangxue] 感觉楼主很乖的。有点孩子气。呵呵。 01/27 08:58
- [kanwangxue] it界,进去干嘛啊,到时候自己牛比了,首先写一个自己的语言,自己用。进入IT界不就是随波做流吗/?他 01/27 08:57
- [kanwangxue] 哥们,不要为了赚钱而学计算机。 计算机是年轻时候干的, 30岁后可以开始想赚钱,年轻嘛,不要这么悲 01/27 08:50
- [游客] 怎么说? 01/26 16:22
- [游客] 你这不行啊,差远了! 01/10 22:29
- [chinatree] 谢谢你。相信你也会成功的。 01/09 14:22
- [landyking] 哥们儿,好久不见。相信你会成功的。 12/02 23:34
- [chinatree] 哇哇,被挖坟了。莫生气,只是感觉谦虚些好,就算你的程序真的是史上最强的,也别说出来嘛,自己偷着乐就行 11/20 00:41
- [xiaoyao2012] 你的程序和我的程序比较也不见得你的程序又节约空间,在某种意义上说你的程序用了没学的指令,所以不见得你 11/19 15:39
- [heliang6291] 一起加油啊 07/02 02:45
- [游客] 急需一个汇编程序大作业。。。。。。。。。。。。。。。。。。。??? 12/28 16:50
- [游客] 这么多人喜欢你,我嫉妒了。但你不可以喜欢那么多,允许你在我不需要你的时候帮别人。如果我需要立叫立到。 11/13 13:11
- [tily] 兄弟 我来看你啦 呵呵 最近可好呀 09/26 22:17
- [stqcw] 能加我qq吗?1270911891 我在做课程设计2的时候 遇到点问题 09/24 09:16
- [stqcw] 能加我qq吗?1270911891 我的环境还是有点问题。按下A的时候不能显示满屏的A 09/20 09:36
- [stqcw] 牛人 我在xp里面运行王爽 汇编第二版 p280的例子 按下esc键没反应 呀 怎样在虚拟机里配置一 09/17 15:18
- [landyking] 呵呵,交个朋友,共同学习. 09/08 00:03
- [luyingdzx] 能知道你的QQ吗?或者请加一下我的QQ271190440,可以吗 虽然在论坛能获得解答,但是有的问 08/07 21:32
[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.
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) |
类型(默认类型) |
收藏此文 |