| 汇编语言---程式设计 (5) |
| 责任编辑:admin 更新日期:2005-8-6 |
19: PUSH AX
20: PUSH BX
21: PUSH CX
22: CALL SUBTB[BX]
23: POP CX
24: POP BX
25: POP AX
26: LOOP1:
27: INC BX
28: INC BX
29: LOOP LOOP0
30: ENTRET:
31: RET
这样好得多了,可是,还能不能再加改进呢?组合语言的妙处就在于变化无穷,且看看是否还能变出花样来。
从设置开始,方式稍微改变一下,旗号的观念是供程式检查用。在应用时,要占用一个暂存器,而暂存器有限,浪费了可惜。此外,八个不同的子程式,又要占用一个计数用的暂存器,最好能够省掉。
因此,设置的重要性就显而易见了,程式的好坏,并非仅仅在于指令的应用。原始的理念,及程式的规划,经常在程式设计之前已经决定了。
我们称之为「预置法」,把前述的设置方式改变一下,用一组缓冲区,先定义如下:
DB 0 ; 计数用
BUFER DW 8 DUP (0) ; 存程式入口用
DW 1 ; 终止信号
然后再设计程式,预置及执行如次:
1: SETUP:
2: CMP BX,MAXVAL ; 最大值检查
3: JA SETRET ; 超过,无效
4: SHL BX,1 ; 参数乘2
5: ADD BX,SUBTB
6: JMP BX ; 各种程式
7: SUB3:
8: XOR BUUER,BX ; 设为第三组
9: JNZ SUB31 ; 开
10: SUB30:
11: DEC BUFER-1 ; 取消
12: RET
13: SUB31: INC BUFER_1 ; 计数
14: RET
15: SUBTB DW SUB1
16: DW SUB2
..
21: DW SUBN
22: ENTER:
23: MOV SI,OFFSET BUFER-1
24: LODSB ; 查是否需要
25: OR AL,AL ; 为0则无
26: JZ ENTRET
27: ENTER1:
28: LODSW ; 取程式资料
29: CMP AX,1 ; 查程式入口
30: JB ENTER1 ; 0表示不做
31: JZ ENTRET ; 1表示终止
32: PUSH SI
33: CALL AX ; 执行
34: POP SI
35: JMP ENTER1
36: ENTRET:
37: RET
前一段调用程式需要31个字元,而现在只要21个字元,速度也快得多。不仅如此,前段程式仅能提供八个子程式,最多用十六位元,不过十六个子程式。本程式则不然,只要预留的缓冲器够,可提供的子程式可以说是无限。
更重要的功能,是程式执行的顺序。除了这种预置法外,其他的方法,都受限于 SUBTB的安排次序,无法变更。但本方法则完全可任依使用者的需要,来决定子程式执行的顺序,以及是否执行。
请注意在 SETUP时,BX的参数就同时代表了执行的顺序。如果要想依照设定的次序决定顺序,只要将缓冲区加大,再加一组预设程式即可,如下所示:
1: SETUP:
2: SHL AX,1 ; 输入参数
3: ADD AX,OFFSET SUBTB ; 子程式入口
4: MOV BX,BUFER-2 ; 位置序数
5: &上一页 [1] [2] [3] [4] [5] [6] 下一页 |
|
| 上一篇文章: 汇编语言---程式设计 (4) |
| 下一篇文章: 汇编语言的艺术(组合语言的艺术)--基本认识(1) |
|
|
|
|