assume cs:code
code segment
;名称:7ch中断例程(setscreen)安装程序
;
;功能:
;(1) 清屏;
;(2) 设置前景色;
;(3) 设置背景色;
;(4) 向上滚动
;
;参数:用ah寄存器传递功能号:
;0 表示清屏;1 表示设置前景色;
;2 表示设置背景色;3 向上滚动
;
;对于1、2号功能,用al传送颜色,
;al∈{0,1,2,3,4,5,6,7}
;
;对3号功能:dx存放滚动行数
;dx∈{1~24}
setld:jmp short set
table dw sub1,sub2,sub3,sub4
set: push bx
cmp ah,3
ja sret
mov bl,ah
xor bh,bh
add bx,bx
call word ptr table[bx]
sret: pop bx
iret
;以下为0号清屏功能
sub1: push bx
push es
push cx
mov bx,0b800h
mov es,bx
xor bx,bx
mov cx,2000
sub1s:and byte ptr es:[bx],0
add bx,2
loop sub1s
pop cx
pop es
pop bx
ret
;以下为1号设置前景色功能
sub2: push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
cmp al,7
ja sorry
;此机制是检测错误的颜色输入,并转入处理程序
sub2s:and byte ptr es:[bx],11111000b
or byte ptr es:[bx],al
add bx,2
loop sub2s
sory1:pop es
pop cx
pop bx
ret
;以下为2号设置背景色功能
sub3: push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
cmp al,7
ja sorry
;此机制是检测错误的颜色输入,并转入处理程序
mov cl,4
shl al,cl
mov cx,2000
sub3s:and byte ptr es:[bx],10001111b
or byte ptr es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
ret
;以下为错误颜色输入,处理程序
sorry:jmp short show
sor db "'al' input range for '0-7'"
show: push ds
push si
push di
push cx
;由于前面设置好es,多以在此处不必设置
mov di,13*160+60
push cs
pop ds
mov si,offset sor
mov cx,26
mov ah,0ah
show1:mov al,[si]
mov es:[di],ax
inc si
add di,2
loop show1
pop cx
pop di
pop si
pop ds
jmp sory1
;以下为3号向上滚动功能
sub4: push ds
push es
push si
push di
push cx
push ax
mov si,0b800h
mov es,si
mov ds,si
mov si,160
xor di,di
mov cx,25
sub cx,dx
push cx
;计算复制行数
cld
sub4s:push cx
mov cx,160
rep movsb
pop cx
loop sub4s
pop cx
mov ax,80
mul cx
mov cx,ax
;计算清空的行数
mov si,0f9eh
;指向最后一行最后一个字符
sub4y:and byte ptr [si],0
sub si,2
loop sub4y
pop ax
pop cx
pop di
pop si
pop es
pop ds
ret
send: nop
;以下为安装程序
start:push cs
pop ds
mov si,offset setld
xor ax,ax
mov es,ax
mov di,200h
mov cx,offset send - offset setld
cld
rep movsb
sti
mov word ptr es:[7ch*4],0
mov word ptr es:[7ch*4+2],20h
cli
mov ax,4c00h
int 21h
code ends
end start
;关于安装程序放到后面的原因:
;如果安装程序放到前面,那么......
;编译器在编译标号为地址是相对于前面的安装程序而产生的
;所以,放到前面才是正确的偏移地址
;
;关于注册中断向量。。
;中断程序被调用时,table[bx]默认的段存器为cs
;所以在安装程序中设置中断向量表时,应设:cs=20h,ip=0,而不是cs=0,ip=200h
;在debug下就能看到问题。。
- [kanwangxue] 如果是文字的,不是特别好啊,体力活,如果文字还加点动画,那就必须顶了。 01/15 01:10
- [kanwangxue] 必须顶啊。 01/15 00:54
- [ltoiii] 既然是实现loop功能,是否要考虑s和se标号? mov bx,offset s - offset 12/09 12:09
- [xiaoyao2012] 正确 11/01 15:33
- [xuer2016] 又找到2条被我忽视的地方: 1.PUSH 和 POP 针对字单元 2.POP 不能是CS 10/26 10:57
- [xuer2016] 学习了 我书写不规范,16进制字母前不加0,后面不加H,以后要注意了。。。 10/26 10:51
- [xuer2016] 来老师这学习下 10/26 10:31
- [youthangel] 不妙,CPU的利用率一下子就上去了。还好我的处理器不是太弱,35%左右的利用率。建议博主在修改一下 10/20 08:23
- [fpamc] 在我心里她就是我的女神。 10/02 08:58
- [newpeople] 你女朋友用得了简直就是一个女神…… 10/01 08:10
- [99998888] 请您指点一下如何找到会ASSEMBLER 语言的翻译,翻译成中文或英文。我的QQ ; 9097815 07/25 09:56
- [jeremy] 我觉得你学习的挺好,可以加你扣扣吗?我的469614823 08/07 14:46
- [zhangbo0805] 哈哈, 你好呀!很希望认识你呀!我发现你学习的积极性很高!正想向您学习呢! 07/31 23:31
- [tomato] 知道了,排得还挺满。 05/29 16:35
- [tomato] 现在学习情况怎么样?在做课设二还是什么? 05/29 10:41
- [tomato] 你的留言收到了。 05/05 23:51
- [fpamc] 开始学习c咯! 05/03 21:40
- [fpamc] 居然不能发博客了……! 04/22 21:03
- [tomato] 你相册中的游戏界面我看过了,非常好,界面很漂亮,很有创造力。博主,很有潜力。加油,一定能把这个游戏做 04/20 23:46
- [fpamc] 忙了半个月,不在家,没时间学习汇编。 但是在途中想到了一个有史以来最难的程序。对于刚学完9章的我。 04/13 20:56