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

想请问int 10h 滚动页面资料的方法

kim91013 发布于 2022-03-15 17:37, 8971 次点击
最近写assembly
要写滚动资料
有一長串資料要翻頁

于是查到int 10h
我使用ah=06h,07h有页面滚动
但是资料没有滚动
想请问板上有没有人能够帮我解答
或是提供范例
5 回复
#2
Valenciax2022-03-16 04:51
这个嘛,嗯....
好吧,说不如做,下面是临时捣一个范例.
上或下卷就是设定一个左上和右下的范围(dh,dl,ch,cl),指定卷动列数(al),再调用bios=10h

程式先在屏上输出一列字串,然后读键,按上则上卷,按下则下卷,按上或下都能不超出限制(比如10),按esc离开.
代码有解释,应该很好理解.

程序代码:


 StrY equ 5h            ;字串座标Y
StrX equ 15h            ;字串座标X
RollLine equ 10        ;卷动限制
BoxLY equ StrY         ;卷动范围左上Y
BoxLX equ StrX            ;卷动范围左上X
BoxRY equ (StrY +  RollLine)    ;卷动范围右下Y
RoxRX equ (BoxLX + mydataLen)    ;卷动范围右下X
Upkey equ 48h            ;上键扫描码
Downkey equ 50h        ;下键扫描码
RollUp equ 6            ;上卷函式码
RollDown equ 7            ;下卷函式码

assume cs:code,ds:data
data segment

 mydata db 'Press Up and down to roll me'    ;字串
mydataLen equ $ - offset mydata        ;资料长度
LineNum db 0                    ;字串卷动值(0-卷动限制)
Rollx db 0                    ;上卷或下卷
data ends

code segment
start:

 mov ax,data

 mov ds,ax

 mov es,ax

 mov ax,0003h            ;设定视讯=3,相当于清空
int 10h            ;调用BIOS
mov LineNum,0            ;初始化字串卷动值=0
mov bh,00             ;显示页
mov bl,7h            ;颜色值=7,黑底白字
mov cx,mydataLen        ;字串长
mov dh,StrY            ;座标y
mov dl,StrX            ;座标x
mov bp,offset Mydata        ;字串偏移
mov ax,1300h            ;输出ES:BP之字串,CX=长,(dl,dh)=(x,y)
int 10h            ;调用bios

Readkey:

 mov ah,0            ;读键
int 16h            ;调用bios
mov al,LineNum            ;取卷动值
cmp ah,1h            ;是否esc键
jz exit            ;是,走
cmp ah,UpKey            ;是否上键
jnz next1            ;否,继续以下比较
dec al                ;减al,卷动值
js Readkey            ;al=负,卷动值=0,不须上卷,重新读键
mov Rollx,RollUp        ;al不为负,取上卷
jmp next2            ;
next1:

 cmp ah,DownKey            ;是否下键
jnz Readkey            ;否,重新读键
inc al                ;加al,卷动值
cmp al,RollLine        ;是否已到卷动上限   
jae Readkey            ;已到,重新读键
mov Rollx,RollDown        ;取下卷
next2:

 mov LineNum,al            ;更新卷动值
mov ah,Rollx            ;取上卷或下卷
mov bh,0            ;显示页
mov ch,BoxLY            ;取卷动范围座标左上y
mov cl,BoxLX            ;取卷动范围座标左上x
mov dh,BoxRY            ;取卷动范围座标右下y
mov dl,RoxRX            ;取卷动范围座标右下x
mov al,1             ;卷动一列
int 10h            ;调用bios
jmp Readkey            ;重新读键
exit:

 mov ax,4c00h            ;离开
int 21h

code ends
end start



只有本站会员才能查看附件,请 登录
#3
kim910132022-03-16 18:33
您好,谢谢您的回覆  我有看完整个代码了,有个思路想再请教您  
若是我循环打印资料,在行数纪录是否就是抓取cx值去做滚动?
非常感謝您的解答
#4
Valenciax2022-03-16 19:07
al才是決定卷动列数
#5
kim910132022-03-16 22:35
若是我的资料已经打印超出屏幕范围,ah=06h滚动时,能够帮我把屏幕外的资料滚动上来吗
#6
Valenciax2022-03-17 02:46
回复 5楼 kim91013
屏幕卷动干的是在屏幕范围内的料做卷动,没有显示的怎可以卷?
屏幕之外的东西仍然在你的程式资料区,程式本身应该知道本次输出完了,再往下输出就是。
1