汇编语言程序设计(五)
2007-04-25 09:29:59 来源:WEB开发网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
似此,程式较短,其他效果差不多。
这段程式,在处理速度上,还大有油水。因为已经检查过的资料,因为回路关系,还会不断地重复检查,是否能够避免这种情况呢?
事实上,当排序到某住址时,即表示由该住址起,上面已经检查完毕。因此,只要记录下来,下次再查时,将住址还原即可。
1: MOV CL,0FFH ;终止检查用
2: COMPAR0:
3: SUB AL,AL ;先设为最小值,备用
4: COMPAR:
5: MOV AH,AL ;设AH为低位值
6: COMPAR1:
7: LODSB ;取资料
8: CMP AL,CL ;比是否终止指令?
9: JAE COMRET ;完成
10: CMP AL,AH ;比大、小
11: JAE COMPAR ;高位大,再查
12: MOV DI,SI ;暂时保存
13: COMPAR2:
14: MOV [SI-2],AX ;交换AH,AL,排序
15: DEC SI ;向低位再查
16: MOV AH,[SI-2]
更多精彩
赞助商链接