📄 3.4屏幕窗口程序.asm
字号:
;屏幕窗口程序
datas segment
cury db 15 ;光标初始位置
curx db 50
;
lx db 10 ;记录左窗口当前光标位置
ly db 15
rx db 50 ;记录右窗口当前光标位置
ry db 15
dwx db 15 ;记录下窗口当前光标位置
dwy db 22
;
ulrow db 0
ulcol db 0
lrrow db 0
lrcol db 0
;
lefted db 0 ;记录光标当前是左还是右的状态
righted db 0
datas ends
;----------------------------------------------------------------------
clear macro ulrow,ulcol,lrrow,lrcol ;宏指令clear 清屏
mov ah,6
mov al,0
mov ch,ulrow
mov cl,ulcol
mov dh,lrrow
mov dl,lrcol
mov bh,7
int 10h
endm
;------------------------------------------------------------------------
scroll macro cont,ulrow,ulcol,lrrow,lrcol ;宏指令 scroll 向上卷动一行
mov ah,6
mov al,cont
mov ch,ulrow
mov cl,ulcol
mov dh,lrrow
mov dl,lrcol
mov bh,60h
int 10h
endm
;------------------------------------------------------------------------
pos_curce macro row,col ;宏指令 pos_curce 光标定位
mov ah,2
mov dh,row
mov dl,col
mov bh,0
int 10h
endm
;------------------------------------------------------------------------
codes segment
;************************************************************************
assume cs:codes,ds:datas
;------------------------------------------------------------------------
main proc far
start:
push ds
sub ax,ax
push ax
;
mov ax,datas
mov ds,ax
;
clear 0,0,24,79
scroll 10,5,10,15,30 ;左窗口
scroll 10,5,50,15,70 ;右窗口
scroll 4,18,15,22,65 ;下窗口
pos_curce cury,curx ;初始置光标在右窗口最下行开始
get_char: ;输入键盘上的字符
mov ah,0
int 16h
;
cmp ah,4bh ;判断是否是←键
jnz not_left
cmp lefted,1
jz get_char ;已是左窗口,再按←键没反应
;
push ax
mov al,cury
mov ry,al ;保存右窗口光标位置
mov al,curx
mov rx,al
mov al,ly ;取左窗口光标位置
mov cury,al
mov al,lx
mov curx,al
pop ax
mov lefted,1
mov righted,0
pos_curce cury,curx ;跳到左窗口光标位置
jmp get_char
not_left:
cmp ah,4dh ;判断是否是→键
jnz not_right
cmp righted,1
jz get_char ;已是右窗口,再按→键没反应
;
push ax
mov al,cury ;保存左窗口光标位置
mov ly,al
mov al,curx
mov lx,al
mov al,ry ;取右窗口光标位置
mov cury,al
mov al,rx
mov curx,al
pop ax
mov righted,1
mov lefted,0
pos_curce cury,curx ;跳到右窗口光标位置
jmp get_char
not_right:
cmp ah,01 ;Esc键退出
jnz display
ret
display: ;显示所输入的字符
mov ah,0ah
mov bh,0
mov cx,1
int 10h
inc curx ;显示一个字符后当前列+1
;
pos_curce dwy,dwx ;同时在下窗口也显示相同字符
mov ah,0ah
mov bh,0
mov cx,1
int 10h
inc dwx
cmp dwx,65
ja down ;满行后换行即上卷一行
pos_curce cury,curx ;返回当前光标继续
;
mov al,curx
cmp al,30
jle continue
cmp al,50
jle left
cmp al,70
jle continue
ja right
left:
scroll 1,5,10,15,30 ;左窗口满行上卷
mov cury,15
mov curx,10
jmp continue
right:
scroll 1,5,50,15,70 ;右窗口满行上卷
mov cury,15
mov curx,50
continue:
pos_curce cury,curx
jmp get_char
down:
scroll 1,18,15,22,65
mov dwx,15
pos_curce cury,curx ;返回当前光标继续
jmp get_char
;
main endp
;---------------------------------------------------
codes ends
;***************************************************
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -