AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

汇编语言---程式设计 (5)

51自学网 http://www.51zixue.net



七、模式法

    所谓模式法,是指在程式的处理过程中,分析其规律,以期找到一种共同具有的「模式」。并用此模式,设计成为一个个程式单元,以追求最高效率。
    这种模式,可用「概念」来代表,但最理想的表达方法,仍以视觉图形为宜。也就是说,最好能把分析出来的模式,用图形表示,并据以理解及设计程式。
    兹以常用的功能「排序」为例,来说明模式法的应用,并设计成为程式。
    先假定需要排序的资料结构为:
    11每笔资料之长度固定为一字元。
    12资料形式为 ASCII码,16进位值,由 20H到 7EH。
    13排序时,资料数值小者排在低位,大者排在高位。
    14程式开始时参数设定为:
      AL= 高位之资料。
      AH= 低位之资料。
      DS:SI=资料存贮处。
    资料由低位开始检查,并同时排序,直到全部查完为止。排序时,交换高位及低位之资料,以使
    高位住址资料≧低位住址中之资料。
    由于人类行为与视觉息息相关,故最有效的认知方式,是以作图来说明。以下即为上一陈述之图形说明。

                    │? │
    模式一供检查            ├─┤
    AL,AH 之大小       ┌ AH <--│? │<-- AL ┐
            模 │        ├─┤     │模
    模式二交换资料    式 ┤ AL <--│? │<-- AH ├式
    其中 AH>AL     一 │        ├─┤     │二
               └ SI =  │? │ =  SI ┘
                    ├─┤

    由上图可见在模式一中,AH为低位资料,AL为高位资料。比较 AL,AH 之大小,即可知是否符合序列规定。如符合,则继续做下去,否则依模式二,将小值放进低位,大值放进高位住址中。程式只要设法保持此一处理之形式,即可简单明瞭地完成任务。
    1: COMPAR:
    2:        MOV    AH,AL      ;设AH为低位值
    3: COMPAR1:
    4:        LODSB          ;取资料
    5:        CMP    AL,AH      ;比大、小
    6:        JAE    COMPAR      ;高位大,不变
    7:        MOV    [SI-2],AX ;交换AH,AL,排序
    8:        DEC    SI      ;向低位再查
    9:        MOV    AH,[SI-2]
   10:        JMP    COMPAR1

    当然,上面这段程式并不成立,因为没有出口,永远做不完。程式的终止有很多方法,一是用计数器,一是用位置来比较,也有用终止指令的,不一而足,各有长短。
    首先,假设在DS:SI 中,有一长度值,兹以计数器的回路来试试看:
    1:        LODSW
    2:        MOV    CX,AX      ;似此,3B 18C
        ;若用    MOV   CX,[SI]
        ;    INC   SI
        ;    INC   SI
        ;则需    6B,21T
    3:        SUB    AL,AL      ;先设最小值,备用
    4: COMPAR:
    5:        MOV    AH,AL      ;设AH为低位值
    6: COMPAR1:
    7:        LODSB          ;取资料
    8:        CMP    AL,AH      ;比大、小
    9:        JB    COMPAR2   ;低位大,需排序
   10:        LOOP    COMPAR      ;回路
   11:        RET          ;完成
   12: COMPAR2:
   13:        MOV    [SI-2],AX ;交换AH,AL,排序
   14:        DEC    SI      ;向低位再查
   15:        MOV    AH,[SI-2]
   16:        JMP    COMPAR1
    程式中的回路,对前面有一比较分支不太有利,因为回路每次要17T ,比较分支就是现成的回路,不利用形成浪费。
    若把回路改为位置比较,程式即为:
    1:        MOV    CX,SI
    2:        ADD    CX,[SI]
    3:        INC    SI
    4:        INC    SI
    5:        SUB    AL,AL      ;先设为最小值,备用
    6: COMPAR:
    7:        MOV    AH,AL      ;设AH为低位值
    8: COMPAR1:
    9:        LODSB          ;取资料
   10:        CMP    SI,CX      ;比位置到终点?
   11:        JAE    COMRET      ;完成
   12:        CMP    AL,AH      ;比大、小
   13:        JAE    COMPAR      ;高位大,再查
   14:        MOV    [SI-2],AX ;交换AH,AL,排序
   15:        DEC    SI      ;向低位再查
   16:        MOV    AH,[SI-2]
   17:        JMP    COMPAR1
   18: COMRET:
   19:        RET
    如此,在分支时,在第13条指令做回路,10,11 则比较住址以决定是否完成。这一来,完成结束只有一次,需时 16T,其余所有执行时间皆为4T,较前一回路快了13T 之多。
    再试用「终止指令」法,其必要条件为资料中有多余的组合可供选择。一般多以 00H,0FFH 等极端值比较理想,下面且以0FFH作为终止指令,并置于资料终止处。
    1:        MOV    CL,0FFH   ;终止检查用
    2:        SUB    AL,AL      ;先设为最小值,备用
    3: COMPAR:
    4:        MOV    AH,AL      ;设AH为低位值
    5: COMPAR1:
    6:        LODSB          ;取资料
    7:        CMP    AL,CL      ;比是否终止指令?
    8:        JAE    COMRET      ;完成
    9:        CMP    AL,AH      ;比大、小
   10:        JAE    COMPAR      ;高位大,再查
   11:        MOV    [SI-2],AX ;交换AH,AL,排序
   12:        DEC    SI      ;向低位再查
   13:        MOV    AH,[SI-2]
   14:        JMP    COMPAR1
   15: COMRET:
   16:        RET
    似此,程式较短,其他效果差不多。
    这段程式,在处理速度上,还大有油水。因为已经检查过的资料,因为回路关系,还会不断地重复检查,是否能够避免这种情况呢?

 
 

上一篇:汇编语言的艺术(组合语言的艺术)--基本认识(2)  下一篇:汇编语言---程式设计&nbsp;(4)