📄 附录二 程式语言效率分析.htm
字号:
<BR> 26: 同上共八次
<BR> …
<BR> 47: MOV CX,AX ; AX中为单位元值
<BR> 48: SHR CX,1 ; CX得到双位元点阵值
<BR> 49: OR AX,CX ; 双位元点阵合并
<BR> 似此,程式增大了36字元,但执行时间却减少为 7.1秒,速度快了一倍!
<BR> 是不是还是更好的方法呢?相信一定多得不计其数。比如说,我们已知原点阵放大一倍后点形为「双点」,以双点做表,取其对应之值,即可免除各点移位的手续,再将原程式第18条以下改为:
<BR> 18: VT2:
<BR> 19: CALL MVBYTE ; 放大一行
<BR> 20: SUB SI,3 ; 纵向尚须放大一次
<BR> 21: CALL MVBYTE ; 再放大一行
<BR> 22: DEC DH ; 完成否?
<BR> 23: JNZ VT2 ; 再做
<BR> 24: RET ; 完成
<BR> 25: MVBYTE:
<BR> 26: MOV CL,DL ; 一行有三字元
<BR> 27: MVDB:
<BR> 28: LODSB ; 取一字元
<BR> 29: MOV AH,AL ; 分置两处
<BR> 30: AND AX,0FF0H ; AH,AL 各取四位元
<BR> 31: SHR AL,1 ; 右移四次还原
<BR> 32: SHR AL,1
<BR> 33: SHR AL,1
<BR> 34: SHR AL,1
<BR> 35: MOV BL,AL
<BR> 36: MOV AL,BYTETB[BX] ; 左字元取预设表值
<BR> 37: MOV BL,AH
<BR> 38: MOV AH,BYTETB[BX] ; 右字元取表值
<BR> 39: STOSW ; 得二字元置缓冲器中
<BR> 40: LOOP MVDB ; 做三次
<BR> 41: RET
<BR> 42 ; 转换表
<BR> 43: BYTETB DB 000H,003H,00CH,00FH,030H,033H,03CH,03FH
<BR> 44: DB 0C0H,0C3H,0CCH,0CFH,0F0H,0F3H,0FCH,0FFH
<BR> 45: CG ENDS
<BR> 46: END START
<BR><BR> 再换个方法,因为有个XALT的指令,是专为这种程式所设计的。由第25条起,调整如下:
<BR> 25: MVBYTE:
<BR> 26: MOV CL,4 ; 供AL左移四位用
<BR> 27: MOV BX,OFFSET BYTETB
<BR> 28: MVDB:
<BR> 29: LODSB ; 取一字元
<BR> 30: MOV AH,AL ; 分置两处
<BR> 31: AND AX,0F00FH ; AH,AL 各取四位元
<BR> 32: SHR AL,CL
<BR> 33: XLAT ; 将[BX+AL]值放AL中
<BR> 34: XCHG AL,AH
<BR> 35: XLAT
<BR> 36: STOSW
<BR> 37: DEC DL
<BR> 38: JNZ MVDB
<BR> 如此,执行程式959 字元,执行速度3.2 秒,效率更佳。
<BR> 上述程式的缺点为:在循环过程中,速度有所损失,而且用四位元查表也费事耗时。如果用一字元查表,则需增大「表」的对应值,再改为「总表」的方式,一次即可查到。且由第20行改起,并力求指令的精简,如:
<BR> 20: MOV DX,OFFSET BYTETB
<BR> 21: MVDB:
<BR> 22: LODSB
<BR> 23: SUB AH,AH
<BR> 24: SHL AX,1 ; 一字元须变为二字元
<BR> 25: ADD AX,DX ; 之位置以查表
<BR> 26: MOV BX,AX ; BX可供间接定址用
<BR> 27: MOV AX,[BX] ; 以一字元查表值
<BR> 28: STOSW ; 查妥存入第一行
<BR> 29: MOV [DI+4],AX ; 上下再重复一行
<BR> 30: LODSB
<BR> 31: SUB AH,AH ; 处
<BR> 32: SHL AX,1 ; 理
<BR> 33: ADD AX,DX
<BR> 34: MOV BX,AX ; 第
<BR> 35: MOV AX,[BX] ; 二
<BR> 36: STOSW ; 列
<BR> 37: MOV [DI+4],AX ;
<BR> 38: LODSB ;
<BR> 39: SUB AH,AH ; 处
<BR> 40: SHL AX,1 ; 理
<BR> 41: ADD AX,DX
<BR> 42: MOV BX,AX ; 第
<BR> 43: MOV AX,[BX] ; 三
<BR> 44: STOSW ; 列
<BR> 45: MOV [DI+4],AX ;
<BR> 46: ADD DI,6 ; 再处理下一行
<BR> 47: LOOP MVDB ; 共24次
<BR> 48: DEC BP ; 做10,000次
<BR> 49: JNZ S3 ; 完成
<BR> 50: MOV AX,4C00H
<BR> 51: INT 21H
<BR> 52: RET
<BR><BR> 程式到此为止,下面还有一转换总表,可供各程式共用。
<BR> 1:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
<BR> 2:; 转 换 表 ;
<BR> 3:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
<BR> 4: BYTETB LABEL WORD
<BR> 5: DB 000H,000H,000H,003H,000H,00CH,000H,00FH
<BR> 6: DB 000H,030H,000H,033H,000H,03CH,000H,03FH
<BR> 7: DB 000H,0C0H,000H,0C3H,000H,0CCH,000H,0CFH
<BR> 8: DB 000H,0F0H,000H,0F3H,000H,0FCH,000H,0FFH
<BR> 9: DB 003H,000H,003H,003H,003H,00CH,003H,00FH
<BR> 10: DB 003H,030H,003H,033H,003H,03CH,003H,03FH
<BR> 11: DB 003H,0C0H,003H,0C3H,003H,0CCH,003H,0CFH
<BR> 12: DB 003H,0F0H,003H,0F3H,003H,0FCH,003H,0FFH
<BR> 13: DB 00CH,000H,00CH,003H,00CH,00CH,00CH,00FH
<BR> 14: DB 00CH,030H,00CH,033H,00CH,03CH,00CH,03FH
<BR> 15: DB 00CH,0C0H,00CH,0C3H,00CH,0CCH,00CH,0CFH
<BR> 16: DB 00CH,0F0H,00CH,0F3H,00CH,0FCH,00CH,0FFH
<BR> 17: DB 00FH,000H,00FH,003H,00FH,00CH,00FH,00FH
<BR> 18: DB 00FH,030H,00FH,033H,00FH,03CH,00FH,03FH
<BR> 19: DB 00FH,0C0H,00FH,0C3H,00FH,0CCH,00FH,0CFH
<BR> 20: DB 00FH,0F0H,00FH,0F3H,00FH,0FCH,00FH,0FFH
<BR> 21: DB 030H,000H,030H,003H,030H,00CH,030H,00FH
<BR> 22: DB 030H,030H,030H,033H,030H,03CH,030H,03FH
<BR> 23: DB 030H,0C0H,030H,0C3H,030H,0CCH,030H,0CFH
<BR> 24: DB 030H,0F0H,030H,0F3H,030H,0FCH,030H,0FFH
<BR> 25: DB 033H,000H,033H,003H,033H,00CH,033H,00FH
<BR> 26: DB 033H,030H,033H,033H,033H,03CH,033H,03FH
<BR> 27: DB 033H,0C0H,033H,0C3H,033H,0CCH,033H,0CFH
<BR> 28: DB 033H,0F0H,033H,0F3H,033H,0FCH,033H,0FFH
<BR> 29: DB 03CH,000H,03CH,003H,03CH,00CH,03CH,00FH
<BR> 30: DB 03CH,030H,03CH,033H,03CH,03CH,03CH,03FH
<BR> 31: DB 03CH,0C0H,03CH,0C3H,03CH,0CCH,03CH,0CFH
<BR> 32: DB 03CH,0F0H,03CH,0F3H,03CH,0FCH,03CH,0FFH
<BR> 33: DB 03FH,000H,03FH,003H,03FH,00CH,03FH,00FH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -