您的位置:首页 > 其它

汇编实验:屏幕窗口程序

2017-03-27 10:47 197 查看
实验3.4  屏幕窗口程序

      1.题目:屏幕窗口程序

  2.实验要求:

     在屏幕上开出三个窗口,它们的行列坐标按照教材要求。光标首先定位在右窗口最下面一行的行首(15,50),如从键盘输入字符,则显示在右窗口,同时也显示在下窗口的最下面一行。若需要将字符显示于左窗口,则先按下键,接着再从键盘输入字符,字符就会从左窗口的最下行开始显示,同时下窗口也显示出左窗口的内容。如若再按下键,输入字符就会接在先前输入的字符之后显示出来。当一行字符显示满后(左右窗口一行向社会20个字符,下窗口一行显示50个字符),窗口自动向上卷动一行,输入字符继续显示最低一行,窗口最高一行向上卷动后消失。

;shiyan3.4
;--------------------------------------------------
datarea segment
lx	db 15    ;win1当前光标位置
ly	db 10
rx	db 15    ;win2当前光标位置
ry	db 50
dwx	db	22   ;win3当前光标位置,初始化为win2初始位置
dwy	db	15
winnum	db	1;这个是自定义窗口标记,0是win1,1是win2(默认的)
datarea	ends
;---------------------------------------------------
clear	macro;清屏功能,参考书上例题9.11
mov	ah,6
mov	al,0
mov	bh,7
mov	ch,0
mov	cl,0
mov	dh,24
mov	dl,79
int	10h
endm
;---------------------------------------------------
scroll macro cont,win_ulr,win_ulc,win_lrr,win_lrc;上卷窗口(上卷cont行)参考书上例题9.13
mov	ah,6          ;参数分别为上卷行数,左上角行号,左上角列号,右下角行号,右下角列号
mov	al,cont
mov	ch,win_ulr
mov cl,win_ulc
mov dh,win_lrr
mov dl,win_lrc
mov	bh,14h
int 10h
endm
;---------------------------------------------------
pos_curse macro px,py ;光标定位 参考书上例题9.8
mov bh,0;页号
mov	ah,2
mov dh,px;行
mov dl,py;列
int 10h;BIOS调用,置光标位置
endm
;---------------------------------------------------
display macro;屏幕显示
;在win3输出
pos_curse dwx,dwy;光标定位win3
mov ah,0ah
mov bh,0
mov cx,1
int 10h
inc dwy          ;判断win3是否上卷
cmp dwy,65
jle is_win1      ;不上卷
scroll 1,18,15,22,65;上卷1行
mov dwy,15       ;光标回到新一行起点
is_win1:              ;判断是否在win1
cmp winnum,0
jnz disp_win2
disp_win1:            ;判断win1是否上卷
inc ly
cmp ly,30
jle win1opt
scroll 1,5,10,15,30
mov	ly,10
win1opt:              ;win1输出
pos_curse lx,ly
jmp input
disp_win2:            ;判断win2是否上卷
inc ry
cmp ry,70
jle win2opt
scroll 1,5,50,15,70
mov ry,50
win2opt:             ;win2输出
pos_curse rx,ry
jmp input
endm
;---------------------------------------------------
;接收输入字符,判断是ESC,左方向键还是右方向键并进行相应处理
get_char macro           ;输入键盘输入的字符
input:
mov ah,0
int 16h;BIOS调用,从键盘读字符,ah=扫描码
cmp ah,4Bh;判断字符是否为左方向键
jnz no_win1
pos_curse lx,ly
mov	winnum,0
jmp input
no_win1:
cmp ah,4Dh;判断输入字符是否为右方向键
jnz no_win2
pos_curse rx,ry
mov winnum,1
jmp input
no_win2:
cmp ah,01;判断输入字符是否为esc
jnz c1
mov ah,4ch;结束本程序,回到DOS系统
int 21h
endm
;---------------------------------------------------
codes segment
assume cs:codes,ds:datarea
start:
main	proc	far
push	ds
sub	ax,ax
push	ax
mov	ax,datarea
mov	ds,ax
clear
scroll 11,5,10,15,30
scroll 11,5,50,15,70
scroll 5,18,15,22,65
pos_curse 15,50
get_char
c1:
mov ah,0ah
mov bh,0;第0页
mov cx,1;重复次数
int 10h;输出al里面的字符
display
;---------------------------------------------------
main endp
;---------------------------------------------------
codes ends
;---------------------------------------------------
end start


编译及运行结果



问题及收获

对于实验3.4,清屏,卷屏,光标定位等部分在书上都有实例讲解,比较容易,对于接收字符,显示字符部分就需要自己动动脑,动动手去实现,这部分主要是参考自己在网上查找的资料实现的。所以整体来说,好好读书,理解起来不难,实现的话也没有遇到特别的困难。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: