通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
资源搜索:
热门搜索:Linux VB C语言 PhotoShop Flash TCP/IP
   首页 | 文章 | 软件 | 动画 | 资源 | 励志 | 骗术 | 论坛 | 邮箱 | 会员中心 | 军事 | 科技 | 博客 | 图片 | 商城 | 最新更新 | 800g资源 | 爱心黑客
您现在的位置: 爱国者黑客 >> 资源 >> 程序设计 >> 汇编语言 >> 基础教程 >> 文章正文
汇编语言---套装软件制作(2)
责任编辑:admin   更新日期:2005-8-6
    第三节  程式合并

    我所见过的各种组合程式虽不算多,但至少有百余个了。毛病最多的当然是缺乏完整的规划,其次则是信马游缰,一份不折不扣的流水帐!明明大门口在东边,程式硬要朝西,直到游完了大观园,天黑了,才出东门!
    这种程式我收集了一大叠,可是举来做例子,却心有余而力不足。原因无他,实在不耐烦照抄一遍,一见到就头痛!
    电脑最强的功能,便是处理繁杂重复的工作,为什么一般程式师居然存心与电脑争风吃醋呢?不说别的,光把程式输入到电脑中,就要花上几个月宝贵的光阴,真值得这样做吗?
    有一份程式,足足有四十多页,我只略作调整,便缩小到十页,处理速度则快了五倍。为什么会差这样远呢?很简单,有些人不喜欢用大脑,久而久之,习惯成自然,大脑就生了铁銹!除了等因奉此,什么都不会想了。
    要想做一个优秀的程式师,第一个条件是不能偷懒,第二个条件则要有分析观察的习惯,第三个也是最重要的,则是要有追求完美的精神。程式师要像艺术家,不论是自己的或是别人的程式,都要一而再、再而三地玩味改良。
    我曾见过一个扫地的妇人,她不管在哪里,见不得有任何脏乱。这种人才值得尊敬,这种精神是伟大的,与她的职业丝毫无关!
    程式写得不够精简,有三个原因,第一个是程式师无能,这种程式能够写完,可以运行,已算相当难得了;第二个原因是不懂技巧,硬桥硬马的干, 不知什么是效率,也不知道如何达成。自己写的程式都不见得看得懂,遑论他人的?第三则是根本缺乏敬业精神,敷衍塞责,这种人我最瞧不起。
    写程式之初,如果把任务瞭解清楚,然后分析因素,分割模组。所有类似的情况都合并到一处,再以变数代替,统一执行。这原本是份内的工作,前述的情况根本不可能发生!
    问题是发生了以后怎么办呢?我建议最好重写,如果一定要改,只好采用程式合并的技巧,浓缩一下。
    合并的目的是为了增进效率,而合并的方法则因情况不同而异,就像人生了病,必须先查出病因,否则无法下药。我试着以所知道的一些例证,简要地解说如后。

一、过程的合并:

    要做过程的合并,首先要查明下列各点:
  1,首先找出过程类似的,全部移到一堆,如果找不到,那就没救了。
    然而,这种程式要就是太小,根本不可能有类似的情况,再不就是写作时杂乱无章,信马游缰。分明有类似的过程,但没有共通的原则,无从浓缩。当然,也可能有些程式,因工作量及处理的细节太多,以致无法浓缩。

  2,在类似的程式中,找寻相异的指令或流程,再若没有,那就是重复了,正宜合并。

  3,把相异的指令或流程用变数取代,或将不同程式之入口放在暂存器里。

  4,将各程式在应用该流程前,设好变数及使用的暂存器。

  5,合并相似的程式段,不同处应用变数取代之。

    下面举一实例,系一绘图程式之片断,兹改变原用标题,并将分散在各处若干不同之段,列述如下:
  189: MASK    PROC    NEAR
  190:        MOV    DX,3C4H
  191:        MOV    AL,2
  192:        OUT    DX,AL
  193:        MOV    DX,3C5H
  194:        MOV    AL,PCOLOR
  195:        OUT    DX,AL
  196:        RET
  197: MASK    ENDP
  …
  380:        MOV    DX,03CEH
  381:        MOV    AL,3
  382:        OUT    DX,AL
  383:        MOV    AL,18H
  384:        INC    DX
  385:        OUT    DX,AL
  386:        RET
  …
  490:        MOV    DX,3CEH
  491:        MOV    AL,3
  492:        OUT    DX,AL
  493:        MOV    DX,3CFH
  494:        MOV    AL,0H
  495:        OUT    DX,AL
  496:        RET
  …
  589: CROSS    PROC    NEAR
  590:        MOV    DX,3C4H
  591:        MOV    AL,2
  592:        OUT    DX,AL
  593:        INC    DX
  594:        MOV    AL,0FH
  595:        OUT    DX,AL
  596:        RET
  597: CROSS    ENDP
  …

    这样的段落有十多处,看来每个都略有不同,似乎不能合并。然而仔细分析,显然是程式师训练不够,把一个非常有规则的程式,安排得非常紊乱,以致到这个地步。
    我们先归纳问题,决定如何合并。第一,上述各段程式,应该统一作为子程式;第二,全部变数只有四个,其中两个是传送值,两个是输出入埠。后者有连续关系,等于只有一个。因此,在调用此子程式前,应先令DX为输出入埠,再将变数装入AX中,一次调用即可。此子程式如下:
  300: SUB:
  301:        OUT    DX,AL
  302:        INC    DX
  303:        MOV    AL,AH
  304:        OUT    DX,AL
  305:        RET
    这样简短的子程式,有无必要,端视时空的效益而定。不论怎样整理,都远比原来的要好。
    另外有种情况,更为可怕,就是在键盘输入后,用流程方式,一一比较输入码,再一一分别处理。
    比如说,为了检查游标键的左、右、上、下等八个方向的移动,以便作相应的处理,程式居然写成:
  100: PP1:    MOV    AH,0
  101:        INT    16H
  102:        CMP    AX,4800H    ;↑键
  103:        JNE 

[1] [2] [3] [4] [5] 下一页

  • 上一篇文章:
  • 下一篇文章:
  • 热门文章
    Olldbg常见问题
    汇编语言的艺术(组合语言的艺术)--观
    汇编语言的艺术(组合语言的艺术)--准
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言---程式设计 (4)
    虚拟8086模式
    SYS命令使用说明
    javascript + CSS 实现动态菜单显
    推荐文章
    自制Windows XP SP2自动安装光盘
    SQLServer注入工具改进版 v1.02
    使用photoshop CS进行自然美肤
    Photoshop绘制诺基亚手机
    PHOTOSHOP制作秋日之梦
    PHOTOSHOP鼠绘名模王爱萍
    Photoshop制作晶莹飞溅的水珠
    教你用PHOTOSHOP做放大镜
    鼠绘美女及服装修画全过程