47: MOV CX,AX ; AX中为单位元值
48: SHR CX,1 ; CX得到双位元点阵值
49: OR AX,CX ; 双位元点阵合并
似此,程式增大了36字元,但执行时间却减少为 7.1秒,速度快了一倍!
是不是还是更好的方法呢?相信一定多得不计其数。比如说,我们已知原点阵放大一倍后点形为「双点」,以双点做表,取其对应之值,即可免除各点移位的手续,再将原程式第18条以下改为:
18: VT2:
19: CALL MVBYTE ; 放大一行
20: SUB SI,3 ; 纵向尚须放大一次
21: CALL MVBYTE ; 再放大一行
22: DEC DH ; 完成否?
23: JNZ VT2 ; 再做
24: RET ; 完成
25: MVBYTE:
26: MOV CL,DL ; 一行有三字元
27: MVDB:
28: LODSB ; 取一字元
29: MOV AH,AL ; 分置两处
30: AND AX,0FF0H ; AH,AL 各取四位元
31: SHR AL,1 ; 右移四次还原
32: SHR AL,1
33: SHR AL,1
34: SHR AL,1
35: MOV BL,AL
36: MOV AL,BYTETB[BX] ; 左字元取预设表值
37: MOV BL,AH
38: MOV AH,BYTETB[BX] ; 右字元取表值
39: STOSW ; 得二字元置缓冲器中
40: LOOP MVDB ; 做三次
41: RET
42 ; 转换表
43: BYTETB DB 000H,003H,00CH,00FH,030H,033H,03CH,03FH
44: DB 0C0H,0C3H,0CCH,0CFH,0F0H,0F3H,0FCH,0FFH
45: CG ENDS
46: END START
再换个方法,因为有个XALT的指令,是专为这种程式所设计的。由第25条起,调整如下:
25: MVBYTE:
26: MOV CL,4 ; 供AL左移四位用
27: MOV BX,OFFSET BYTETB
28: MVDB:
29: LODSB ; 取一字元
30: MOV AH,AL ; 分置两处
31: AND AX,0F00FH ; AH,AL 各取四位元
32: SHR AL,CL
33: XLAT ; 将[BX+AL]值放AL中
34: XCHG AL,AH
35: XLAT
36: STOSW
37: DEC DL
38: JNZ MVDB
如此,执行程式959 字元,执行速度3.2 秒,效率更佳。
上述程式的缺点为:在循环过程中,速度有所损失,而且用四位元查表也费事耗时。如果用一字元查表,则需增上一页 [1] [2] [3] [4] 下一页 |