;PDF 309 实验16
;编写多功能int7ch中断例程,具有清屏,设置前景,背景,上滚一行以及超界示警功能.
;老规矩独立完成的
;这个是完美版的,花了大概。。恩。。8个多小时
;用debug载入内存后直接g, 然后每隔几秒会跳出一种效果来
;al是字符属性参数
;int7cH中断程序安装与 0:200H处
;又是血的教训啊!table和error是从200H处开始算偏移的.
;实在是昏头转向了,居然把初始化循环条件放在循环体内
;话说不知道为啥这个版的没写多个注释我也不知道为什么。。这不像我的风格- -!
;一些心得:设计程序没花我多少时间,但是调试却很费时间不过通过调试可以学到许多课本没有的知识,比如说 数据标号默认的段地址为ds等,程序只要一大,写的时间一长就容易犯些低级错误。
assume cs:code
stack segment
db 128 dup (' ')
stack ends
code segment
int7c_start:jmp choose
table:dw offset s0+200H,offset s1+200H,offset s2+200H,offset s3+200H
error:db 'AH or AL out of range'
s0:mov bx,0b800H
mov es,bx
mov bx,0
mov cx,2000
show_s0:mov byte ptr es:[bx],' '
add bx,2
loop show_s0
ret
; s0作用:显示满屏空格(清屏)
s2:mov cl,4
shl al,cl
mov cx,2000
mov bx,0b800h
mov es,bx
mov bx,1
show_st2: and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop show_st2
ret
s1:mov cx,2000
mov bx,0b800h
mov es,bx
mov bx,1
show_st: and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop show_st
ret
; s1作用:设置前景
; s2作用:设置背景
s3:
mov di,0b800H
mov ds,di
mov es,di
mov si,160
mov di,0
cld
mov cx,24
page_up:push cx
mov cx,160
rep movsb
pop cx
loop page_up
mov cx,80
space:mov byte ptr es:[di],' '
add di,2
loop space
ret
;s3 作用:向上滚动一行
err: mov bx,0b800h
mov es,bx
mov si,0
mov cx,21
mov di,offset error+200H
err_show: mov bl,cs:[di]
mov byte ptr es:[si+160*12],bl
mov byte ptr es:[si+160*12+1],2
add si,2
inc di
loop err_show
mov ax,4c00h
int 21h
;err作用;当ah和al数值超过范围是报错并退出
choose: cmp ah,3
ja err
cmp al,7
ja err
push ax
push bx
push cx
push dx
push ds
push es
push si
push di
mov bx,cs
mov ds,bx
add ah,ah
mov bl,ah
mov bh,0
add bx,offset table
call word ptr ds:[bx+200H]
pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
iret
;根据ah的数值选择调用的子程序
int7c_end:nop
start:mov ax,stack
mov ss,ax
mov sp,128
mov ax,cs
mov ds,ax
mov si,offset int7c_start
mov ax,0
mov es,ax
mov di,200H
mov cx,offset int7c_end-int7c_start
cld
rep movsb
;安装int7cH在0:200H处
mov word ptr es:[7cH*4],200H
mov word ptr es:[7cH*4+2],0
;安装int7cH入口地址
mov bx,0b800h
mov es,bx
mov cx,5
mov ah,0
mov al,2
tests:push cx
mov bx,0
mov cx,2000
show_a: mov byte ptr es:[bx],'A'
add bx,2
loop show_a
pop cx
int 7cH
call delay
inc ah
inc al ;避免前景和背景同色导致看不出字符
loop tests
mov ax,4c00H
int 21H
;全屏显示A,同时每次循环 调用不同的int7c
delay: pushf
push ax
push cx
push dx
mov dx,0FFFFH
sub ax,ax ;cf=0
dlp:sub ax,1
sbb dx,0
cmp dx,0
jne dlp
pop dx
pop cx
pop ax
popf
ret
;延迟程序
code ends
end start
- [springaccount] 请问下我虚拟机安装完毕后怎么还不行调试哦 能否请大虾给个完整的调试过程呢 谢拉 03/31 20:25
- [michael1947] 一个软盘怎么分的A和B,我知道0面为A,1面为B,可是怎么让DOS系统知道啊,我这里输入B:,就提示 03/05 17:13
- [游客] 我按照你说的帖子用bochs模拟了dos,然后就不知道该干什么了。。。。。。到底应该如何验证啊?怎么 12/24 15:36
- [游客] 花了8天60+小时,中间的曲折和艰辛实在是。。。不过还好我挺过来了,一直一直没有放弃,我坚信付出总会 07/14 13:39
- [游客] 因为nochar 就表示非ASCII键 即没有对应ASCII的键盘输入 所以我用扫描码来判断 06/30 14:19
- [游客] 我觉得你的程序没有什么逻辑上的问题啊。出现了你的错误提示,说明这个输入的字符ascii码小于20H, 06/30 11:53
- [游客] 嗯。我觉得,不能in 16H等待键盘输入,别的就不能运行了不是,所以,肯定应该开中断的。 06/23 15:32
- [zhenglxd] 回楼上的这个 out of range是我自己设计的,如果当ah>3 或者al>7 就会提示out 06/23 09:47
- [游客] 功能设计的不错。不过在运行过程中,设置完背景色后,就会出错退出。博主自己在检查一下。在command 06/20 12:05
- [游客] 苍天弄人,亦成人 支持博主 06/19 20:59
[ 游客 发表于 2009-06-20 12:05 ]
功能设计的不错。不过在运行过程中,设置完背景色后,就会出错退出。博主自己在检查一下。在command下显示out of range 。
[ zhenglxd 发表于 2009-06-23 09:47 ]
回楼上的这个 out of range是我自己设计的,如果当ah>3 或者al>7 就会提示out of range
因为 程序只有4种功能 并且 设置前景和背景 的范围也只有0~7
当超过他们的范围的时候 就提示 超出范围了。