元,如仅变DL,只需两个字元。这一指令共用了十一次,除第一次有必要外,其他十次就可以省下10个字元。
再要斤斤计较,还可以榨出二个字元来,在5至8条中,若用INC DX 只需要一个字元。 此外,31,32及43 ,44是浪费的作法,只要在第18条加一标号,就可以省却两个字元输出的指令。另外,还有35及39两条指令,应该合并,一次即将AX设妥,于是,又省下了一个字元。
先令 DH=3
1: CSEND0:
2: MOV DL,0FDH ; 输出埠
3: MOV AL,80H
4: OUT DX,AL ; 输出指令
5: MOV DL,0F8H ; LSB 速度控制
6: MOV AL,06H ; 速度=19200/秒
7: OUT DX,AL
8: INC DX ; MSB 速度控制
9: SUB AL,AL ; 速度=19200/秒
10: OUT DX,AL
11: MOV DL,0FBH ; 行控制暂存器
12: MOV AL,DH ;NO PARITY,1
; STOP,8
13: OUT DX,AL
14: INC DX ; 通讯控制
15: OUT DX,AL
16: MOV DL,0F9H ; 中断有效
17: SUB AL,AL
18: CSNDA:
19: OUT DX,AL
20: CSND1:
21: MOV DL,0FDH ; 状态暂存器
22: IN AL,DX
23: TEST AL,10H ; 是否可接收?
24: JNZ CRCV0 ; 可
25: TEST AL,20H ; 通道已清否?
26: JZ CSND1 ; 8250未清
27: MOV AH,1 ; 键盘有输入?
28: INT 16H
29: CMP AL,07H ; =''CTRL+G''
30: JE CEND ; 是,完毕
31: MOV DL,0F8H
32: JMP CSNDA ; 送输入字符
33: CRCV0: ; 接收
34: MOV DL,0FCH ; 通讯控制
35: MOV AX,0E08H ; 暂停中断
36: OUT DX,AL ; 及显示
37: MOV DL,0F8H
38: IN AL,DX ; 收字符
39: INT 10H ; 萤屏显示
40: MOV DL,0FCH
41: MOV AL,0BH
42: JMP CSNDA ; 循环工作
43: CEND:
44: RET ; 完成
看来似乎这样太小气,可是所谓艺术,就要具备丝毫不苟且的态度,再说由84个字元变成66个字元,省了近百分之廿,而且,速度也快了。这种程式原本就很精简,只有训练有素,追求完美的程式师,才做得到。
另一种做法,便是将重复的过程写成回路,约可节省廿几个字元。但是,由于时间定律限制,通讯程式颇重时效,回路是否值得,尚要多方面分析,不可轻率决定。
2,回路的实例:
前面曾经讨论过,程式的效率,经常决定于回路的处理方式及其技巧。其对空间上影响比较小,但是良好的设计理念,常使速度上有高达十倍,甚至百倍的差异,读者想必已经知道,但是如何能应