您的位置:逆风者 汇编技术 正文
原作者:www.upwinder.com 添加时间:2007-09-01 原文发表:2007-08-31 人气:14 来源:未知

以下为利用ASSEMBLY,BASIC,PASCAL,C,FORTRAN等程式语言,将一个24x24之点阵字形,放大成为48x48,并分别比较其处理速度、占用空间以及制作时间。
为了正确计算执行时间,特意作10,000次处理,至于指定的24x24字形,则假设为一空格。
逆@风@者

一、ASSEMBLY

组合语言变化无穷,先以一般的作法,用点阵位移来处理。
1:PAGE60,132
2:CGSEGMENT
3:BUFINDB72DUP(0)
4:BUFOTDB72*4DUP(0)
5:ASSUMECS:CG,DS:CG,ES:CG
6:START:
7:MOVAX,CG
8:MOVDS,AX
9:MOVES,AX
10:CLD
11:MOVBP,10000;处理10,000次
12:S3:
13:SUBCX,CX
14:MOVBX,CX
15:MOVDX,1803H;计数用
16:MOVSI,OFFSETBUFIN;24*24点阵起始位址
17:MOVDI,OFFSETBUFOT;预定48*48储存位址
18:MVBYTE:
19:MOVBH,DL;做三列
20:MVDB:
21:LODSB;取原点阵
22:MOVBL,AL
23:MOVCL,8;做八位元
24:MVDB1:
25:RCLBL,1;左移一次
26:PUSHF;保存状态
27:RCLAX,1;两字同时左移一次
28:POPF;取出原移位状态
29:RCLAX,1;再一次,得双位点值
30:LOOPMVDB1;八次回路
31:STOSW;存入
32:MOV[DI 4],AX;上下放大一行
33:DECBH;共3列
34:JNZMVDB
35:ADDDI,6;移向次行
36:DECDH
37:JNZMVBYTE;共24行
38:DECBP;执行10,000次
39:JNZS3;完成
40:MOVAX,4C00H
41:INT21H
42:CGENDS
43:ENDSTART
本程式制作时间,为十五分钟。
汇编后,得934字元的执行程式,执行耗时14.5秒。
若将上段程式加以分析,可以发现到此段程式执行时间全部浪费在23至30这一段「回路」中。为了增加速度,可以将空间加大,避开回路,连续执行八次「移位」动作如次:
23:RCLBL,1
24:RCLAX,1
25:SHLAX,1
26:同上共八次

47:MOVCX,AX;AX中为单位元值
48:SHRCX,1;CX得到双位元点阵值
49:ORAX,CX;双位元点阵合并
似此,程式增大了36字元,但执行时间却减少为7.1秒,速度快了一倍!
是不是还是更好的方法呢?相信一定多得不计其数。比如说,我们已知原点阵放大一倍后点形为「双点」,以双点做表,取其对应之值,即可免除各点移位的手续,再将原程式第18条以下改为:
18:VT2:
19:CALLMVBYTE;放大一行
20:SUBSI,3;纵向尚须放大一次
21:CALLMVBYTE;再放大一行
22:DECDH;完成否?
23:JNZVT2;再做
24:RET;完成
25:MVBYTE:
26:MOVCL,DL;一行有三字元
27:MVDB:
28:LODSB;取一字元
29:MOVAH,AL;分置两处
30:ANDAX,0FF0H;AH,AL各取四位元
31:SHRAL,1;右移四次还原
32:SHRAL,1
33:SHRAL,1
34:SHRAL,1
35:MOVBL,AL
36:MOVAL,BYTETB[BX];左字元取预设表值
37:MOVBL,AH
38:MOVAH,BYTETB[BX];右字元取表值
39:STOSW;得二字元置缓冲器中
40:LOOPMVDB;做三次
41:RET
42;转换表
43:BYTETBDB000H,003H,00CH,00FH,030H,033H,03CH,03FH
44:DB0C0H,0C3H,0CCH,0CFH,0F0H,0F3H,0FCH,0FFH
45:CGENDS
46:ENDSTART

再换个方法,因为有个XALT的指令,是专为这种程式所设计的。由第25条起,调整如下:
25:MVBYTE:
26:MOVCL,4;供AL左移四位用
27:MOVBX,OFFSETBYTETB
28:MVDB:
29:LODSB;取一字元
30:MOVAH,AL;分置两处
31:ANDAX,0F00FH;AH,AL各取四位元
32:SHRAL,CL
33:XLAT;将[BX AL]值放AL中
34:XCHGAL,AH
35:XLAT
36:STOSW
37:DECDL
38:JNZMVDB
如此,执行程式959字元,执行速度3.2秒,效率更佳。

[1][2]下一页

相关文章

学习更多关于“绘制”文本串的知识
给程序加个图标
MASM的反反汇编技术
进一步学习对话框
驻留exe文件
如何建立汇编工作环境
汇编与C语言配合
动态链接库
masm中宏指令的bug
虚拟机管理器
任务状态段和控制门
只能在保护模式下执行的指令
系统托盘中的快捷图标
DEBUG命令详解
仿FDISK及PQMAGIC列出分区逻辑盘符的prw.as
保护方式简介
实模式和任何特权级下可执行的指令
汇编语言的高级语言特性
关于div/idiv/mul/imul指令的用法
建立自己的动态链接库

相关评论


本文章所属分类:首页 汇编技术

  热门关键字:
进制数据输出的通用程序 2007-09-12
汇编源码--showmem 2007-08-31
汇编源码--CLEAN 2007-08-31
汇编源码--hdr 2007-08-31
汇编源码--basload 2007-08-31
汇编源码--CHAR 2007-08-31
汇编源码--fxn 2007-08-31
汇编源码--alarm 2007-08-31
汇编源码--getsect 2007-08-31
汇编源码--DEV 2007-08-31
汇编源码--getspace 2007-08-31
汇编源码--frespace 2007-08-31
CIH文件型病毒检测消除程序 2007-08-31
Mixer Volume Ctrler V1.0 2007-08-31
汇编源码--COMINT 2007-08-31
自己用汇编语言写的一个病毒(源码... 2007-08-31
汇编源码--col 2007-08-31
汇编源码--BURNOUT 2007-08-31