注册 登录
编程论坛 汇编论坛

驻留dos程序问题

hook615 发布于 2012-04-11 22:56, 578 次点击
我是自学的...木有老师
我用以下方法写了时钟驻留,成功了
但是在用同样的方法写字体背景颜色每一秒钟改变的时候..这种方法不行了
以下是我的驻留方式
start:
jmp start1
color record hs:1,back:3,hl:1,front:3
cval color<0,0,0,0>
start1:
  mov ax,cs
  mov ds,ax
  mov dx,offset s ;//s处的代码在下面
  mov ax,251ch
  int 21h
  
  mov ax,3100h
  mov dx,(offset sn-offset start+15)/16+16;sn为最后的结束标号,start为整个dos程序的开始标号
  int 21h  

我还用了一种方法
就是把可执行代码部分的代码复制到了b35:100h处
代码如下
mov ax,cs
mov ds,ax
mov si,offset s//源址
mov ax,b35h
mov es,ax
mov di,100h
mov cx,offset sn-offset s
cld
cli//暂时屏蔽其他中断
rep movsb
sti
mov ax,4c00h
int 21h//由于上面不能终止程序,所以自己加一个

以上两种方法 ,我在驻留时钟里面成功了
为什么现在不行了?

其实用27h中断也可以驻留,但是先把以上两个方法为什么失效搞懂...
有高人研究过的..指点下小弟 ...谢谢
顺便希望能找到师傅收下我这个徒弟(我有一定基础,用pascal写过俄罗斯方块等小游戏..高人收)

[ 本帖最后由 hook615 于 2012-4-12 12:07 编辑 ]
2 回复
#2
hook6152012-04-12 11:51
我顺便把s部分贴出来 大家帮我看看~
为啥驻留成功了
但是不能显示
s proc far
  cmp cx,0//由于修改的是1ch中断
  jz done
  dec cx
  iret
done:
  mov ah,9h
  mov al,'T'
  mov bh,0
  mov bl,cval
  mov cx,1
  int 10h//不设置行列,原地显示
  mov al,cval//为下一次颜色准备
  mov ah,al
  and al,not mask back
  and ah,mask back
  mov cl,back
  shr ah,cl
  inc ah
  shl ah,cl
  or ah,al
  mov cval,al
  mov cx,18//驻留的cx变为18,计数器
  iret
s endp
sn:
  nop


[ 本帖最后由 hook615 于 2012-4-12 12:10 编辑 ]
#3
hook6152012-04-12 12:47
先上课~~回来继续顶贴~
好心人...高手人
走过路过不要错过
1