七、模式法
所谓模式法,是指在程式的处理过程中,分析其规律,以期找到一种共同具有的「模式」。并用此模式,设计成为一个个程式单元,以追求最高效率。 这种模式,可用「概念」来代表,但最理想的表达方法,仍以视觉图形为宜。也就是说,最好能把分析出来的模式,用图形表示,并据以理解及设计程式。 兹以常用的功能「排序」为例,来说明模式法的应用,并设计成为程式。 先假定需要排序的资料结构为: 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/2 首页 上一页 1 2 |