p; ; 为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: SHL BX,1 ; 指向位置
6: MOV BUFDER[BX],AX ; 存入缓冲区
7: INC WORD PTR BUFER-2; 序数加一
8: RET
这一来,先调用的程式放在前面,后调用的放在后面,使用者只要知道子程式的代号,就可以随意安排调用。
甚至于各子程式所需的参数,也可以用类似的方法,预先设置妥当,然后一次取出运用。
预置法最宜于「用户」接口,而且作为应用程式,既简单又容易,方便灵活。
比如有一些应用模组,即可应用此方法,分别归类、编号后,书于手