第二节 研究改进
想要把程式写好,一定要不断地研究、改进,由错误中学习,由改进中得到经验,培养出敏锐的观察能力和良好的写作习惯。
在开始时,这种过程需要付出不少时间,但对一位程式师来说,写程式是终身职业,能不精益求精吗?
以下举两个实例,以说明如何研究改进已完成的程式。
1,指令的运用:
以下面这段通讯处理程式而论,不仅语法及指令完全正确,执行时也毫无错误,是不是还可以加以改进呢?
1-1 按照前面规定,说明项中已用简化的字串:
SND-传送 RCV-接收 LET-左
RGT-右 VER-直 HOR-横
1-2 程式师代号为''C''。
1-3 段名省略。
1: CSND0:
2: MOV DX,03FDH ; 输出埠
3: MOV AL,80H
4: OUT DX,AL ; 输出指令
5: MOV DX,03F8H ; LSB 速度控制
6: MOV AL,06H ; 速度=19200/秒
7: OUT DX,AL
8: MOV DX,03F9H ; MSB 速度控制
9: MOV AL,0 ; 速度=19200/秒
10: OUT DX,AL
11: MOV DX,03FBH ; 行控制暂存器
12: MOV AL,03H ; NO PARITY,1
; STOP,8
13: OUT DX,AL
14: MOV DX,03FCH ; 通讯控制
15: OUT DX,AL
16: MOV DX,03F9H ; 中断有效
17: MOV AL,0
18: OUT DX,AL
19: CSND1:
20: MOV DX,03FDH ; 状态暂存器
21: IN AL,DX
22: TEST AL,10H ; 是否可接收?
23: JNZ CRCV0 ; 可
24: TEST AL,20H ; 通道已清否?
25: JZ CSND1 ; 8250未清
26: MOV AH,1 ; 键盘有输入?
27: INT 16H
28: CMP AL,07H ; =''CTRL+G''
29: JE CEND ; 是,完毕
30: MOV DX,03F8H
31: OUT DX,AL ; 送输入字符
32: JMP CSND1
33: CRCV0: ; 接收
34: MOV DX,03FCH ; 通讯控制
35: MOV AL,08H ; 暂停中断
36: OUT DX,AL
37: MOV DX,3F8H
38: IN AL,DX ; 收字符
39: MOV AH,0EH
40: INT 10H ; 萤屏显示
41: MOV DX,03FCH
42: MOV AL,0BH
43: OUT DX,AL ; 继续接受
44: JMP CSND1 ; 循环工作
45: CEND:
46: RET ; 完成
本段程式共 84 个字元,非常精简,但仍然有节省的余地,要点在DX的数值上。
DX值由 03F8H到 03FDH,可知 DH 之值不变,只需改变 DL 即可。每改变DX一次,需要三个字