- [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
[2012-05-23 23:48] 实验16「优化」
code segment
;名称:7ch中断例程(setscreen)安装程序
;
;功能:
;(1) 设置前景色;
;(2) 设置背景色;
;(3) 向上滚动,或清屏
;
;参数:用ah寄存器传递功能号:
;0 表示设置前景色;
;1 表示设置背景色;2 向上滚动,或清屏
;
;对于0、1号功能,用al传送颜色,
;al∈{0,1,2,3,4,5,6,7}
;
;对于2号功能:dx存放滚动行数
;dx∈{0~24},当dx=0时,为清屏
;dx最大为24,即向上滚动24行,否则设置0,清屏
setld:jmp short set
table dw sub1,sub2,sub3
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 ds
push es
push si
push di
push cx
push ax
;此处保存这么多寄存器是为了兼容下面的错误处理程序
;更贴切的说是兼容三个功能的程序
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
cmp al,7
ja sorry
;此机制是检测错误的颜色输入,并转入处理程序
sub1s:and byte ptr es:[bx],11111000b
or byte ptr es:[bx],al
add bx,2
loop sub1s
sory1:pop ax
pop cx
pop di
pop si
pop es
pop ds
ret
;以下为1号设置背景色功能
sub2: push ds
push es
push si
push di
push cx
push ax
mov bx,0b800h
mov es,bx
mov bx,1
cmp al,7
ja sorry
;此机制是检测错误的颜色输入,并转入处理程序
mov cl,4
shl al,cl
mov cx,2000
sub2s:and byte ptr es:[bx],10001111b
or byte ptr es:[bx],al
add bx,2
loop sub2s
pop ax
pop cx
pop di
pop si
pop es
pop ds
ret
;以下为错误输入处理程序
sorry:jmp short show
sor db "'al' input range for '0-7' "
soo db "'dx' maximum not more than 24"
show: push ds
push es
push si
push di
push cx
;由于前面设置好es,多以在此处不必设置
mov si,offset sor
show2:mov di,13*160+60
push cs
pop ds
mov cx,29
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 es
pop ds
jmp sory1
show3:push ds
push es
push si
push di
push cx
mov si,offset soo
jmp show2
;以下为2号向上滚动功能
sub3: 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
cmp dx,24
ja show3
;检测错误行数输入,并转入错误处理程序
sub cx,dx
;计算复制行数
cld
sub3s:push cx
mov cx,160
rep movsb
pop cx
loop sub3s
mov ax,80
mul dx
mov cx,ax
;计算清空的行数
mov si,0f9eh
;指向最后一行最后一个字符
sub3y:and byte ptr [si],0
sub si,2
loop sub3y
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
;
;程序结构与第一版的实验16同理
;
;目前发现这个程序的一个问题就是,
;滚屏的功能中,复制的不是最后那几条,而是前几条。。。
[ fpamc 发表于 2012-05-23 23:55 ]
这两个实验16可是送给tomato老师的惊喜呦!O(∩_∩)O~
[ yahwei 发表于 2012-05-24 13:15 ]
滚屏的功能,我是以字为单位,将1行至24行的内容直接复制到0行至23行,然后清空24行。这样就可以少用一个循环了。
[ fpamc 发表于 2012-05-24 13:27 ]
我的这个滚屏是可控的……向上滚动多少行在于dx……
呵呵,谢谢两个建议咯~
[ fpamc 发表于 2012-05-25 11:05 ]
滚屏算法有问题……有时间研究研究……
[ tomato 发表于 2012-05-25 17:10 ]
如果想要看到效果,是不是还需要写个应用程序?能不能弄个小软件出来,运行就可以选择功能?
[ fpamc 发表于 2012-05-25 19:10 ]
咦?
老师一说……突然冒出了思路……
不过……我要先把这个滚屏的算法研究研究……
目前这个有问题。
还有……动态时间(中断)。
先还债……欠了好多债`(*∩_∩*)′~
[ yahwei 发表于 2012-05-25 21:23 ]
滚动25行的效果不就和清屏一样了么?为什么是滚动0行等于清屏?
[ fpamc 发表于 2012-05-25 22:21 ]
sub cx,dx
;计算复制行数
这里加一条mov dx,cx
其实不加也可以清屏,就是循环了10000h次……
浪费了资源。
整个滚屏算法有问题。
有时间我研究个相对更准确的。