用已知的技巧,来改进设计的程式呢?
回路是利用计数器,反复进行相同的
程序作业,这种程式,目的就是为了节省空间,相对地,时间上难免有所损失。
因此,在设计回路时,必须先行考虑清楚: 空间的节省与时间的交换是否值得? 其次,则要充份掌握回路的特色,要用得恰到好处,不可掉以轻心。
原则上,在回路中,指令要用得精简,流程要非常明确,尤其重要的是,应力求避免在回路中使用缓冲器,最好充份利用暂存器。如果时间效率极为重要,则不妨放弃回路方式。
有一个显示程式,目的是要将 16*16点阵字形送到萤幕上。对象是Hercules 640*400的图形卡,计分四区交互传送,这是另一个「高科技」界的新鲜奇事,在IBM PC推出时,最高密度的图形态,只有 640X200点阵,那是迁就电视萤幕的扫描方式,先送单线的水平讯号,再送双线,故分两区。Hercules卡为了加高密度,应用Interlace 技术,又在单双水平扫描线中各加了一行,遂成了四区。
Hercules很适宜中文的显示,如用 16X16字形,正好显示25行,每行40字,与英文完全兼容。若希望有一状态显示栏,则可用 15X15字形,留出24条线供做状态栏。
遗憾的是在最需要中文的国内,却偏爱CGA,EGA 等密度不足的显示设备。不但售价偏高,功能也不足,弄得不伦不类。
最理想的还是VGA 显示,计有 640X480之萤幕点阵,不仅空间大,在记忆体中,只有一区,应用非常灵活。
下面,我们先介绍 Hercules 的显示方法,同时探讨回路的处理方式。
1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2: ;HERCULES 中文显示处理程式。 ;
3: ;输入参数:SI=点阵字形,DI=萤幕位置。 ;
4: ; DS =CG,ES= 0B800H(萤幕段)。 ;
5: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6: CDSP0:
7: MOV CX,16 ;高16点
8: CDSP1:
9: MOVSW ;移至萤幕上
10: ADD DI,1FFEH ;加一区,每区=2000H
11: JNS CDSP2 ;未超越区限,继续
12: ADD DI,8050H ;超越区限,换区加行
13: CDSP2:
14: LOOP CDSP1
15: RET
程式到此结束,相当精简,技巧在第10至12条区限的检测方式。一般做法是在检查区限时,用:
ADD DI,1FFEH ; 加区值
CMP DI,8000H ; 最大区限值
JB CDSP2 ; 未超过
SUB DI,8000H ; 减去区限
如此则多了一条4字元的指令,加上4个时钟脉冲,做16次回路就损失64个时钟脉冲值。在全萤幕显示时,以1,000 个字来算,为数就不少了。
当然,取消了回路速度还可以加快,其结果,则要增加130 个字元,时间则快了 272个时钟脉冲,是否值得,就要看实际需要而定了。
另一个方法,要增加2个字元,但可快上36个时钟脉冲,其法在第11条上:
11: JS CDSP3
12:CDSP2:
13: LOOP CDSP1
14: RET
15:CDSP3:
16: ADD DI,8050H
17: JMP CDSP2
再换一