三、指令应用要灵活
有一段很简单的程式,其写作的方法甚多,但是指令应用的良窳,会使得程式的效率相去天上地下,难以估计。
这段程式的用途,是要将一段资料中,英文字符大、小写相互转换。当然,转换的选择要由使用者决定,在下面程式且略去使用介面,假设已得知转换的方式。
设资料在 DS:SI中,资料长度=CX ,大写转小写时BL=0,反之,则BL=1。
我见过一种写法,简直无法原谅: 
  1: LOOP1: 
  2:      CALL  CHANGE 
  3:      JC  LOOP11 
  4:      ADD  AL,20H 
  5:      JMP  SHORT LOOP12 
  6: LOOP11: 
  7:      SUB  AL,20H 
  8: LOOP12: 
  9:      MOV  [SI-1],AL 
   10:      LOOP  LOOP1 
   11:      RET 
   12: CHANGE: 
   13:      LODSB 
   14:      OR  BL,BL 
   15:      JZ  CHANGS 
   16:      CMP  AL,61H 
   17:      JB  CHARET 
   18:      CMP  AL,7AH 
   19:      JA  CHARET 
   20:      STC 
   21: CHARET: 
   22:      RET 
   23: CHANGS: 
   24:      CMP  AL,41H 
   25:      JB  CHARET 
   26:      CMP  AL,5AH 
   27:      JA  CHARET 
   28:      CLC 
   29:      RET
这种程式错在把由12到29的程式写得太长,共 25B,有共用的价值,于是作为子程式调用。
试想一下,每一笔资料,都要调用一次,浪费四个字元事小,但每次要费 23+20个时钟脉冲,资料多时,不啻为天文数字。更何况这段程式写得极差,在回路中,又多浪费了几十个时钟。关于这一点,下面会继续讨论。
照上面这段程式,略加改进,写法如下:
1: CHANGE: 
  2:      LODSB 
  3:      OR  BL,BL 
  4:      JZ  CHANGS 
  5:      CMP  AL,61H 
  6:      JB  CHARET 
  7:      CMP  AL,7AH 
  8:      JA  CHARET 
  9:      SUB  AL,20H 
   10: CHANG0: 
   11:      MOV  [SI-1],AL 
   12: CHANG1: 
   13:      LOOP  CHANGE 
   14:   RET 
   15: CHANGS: 
   16:      CMP  AL,41H 
   17:      JB  CHANG1 
   18:      CMP  AL,5AH 
   19:      JA  CHANG1 
   20:      ADD  AL,20H 
   21:      JMP  CHANG1
这样的写法还是不佳,因为在回路中,用常数与暂存器比较,速度较暂存器相比为慢。应该先将需要比较的值,放在暂存器DH,DL 中,改进如次:
1:      MOV  AH,20H 
  2:      MOV  DX,7A61H 
  3:      OR  BL,BL 
  4:      JZ  CHANGE 
  5:      MOV  DX,5A41H 
  6: CHANGE: 
  7:      LODSB 
  8:      CMP  AL,DL 
  9:      JB  CHANG1 
   10:      CMP  AL,DH
   11:      JA  CHANG1 
   12:      XOR  AL,AH 
   13:      MOV  [SI-1],AL 
   14: CHANG1: 
   15:      LOOP  CHANGE 
   16:   RET
以上这段程式,空间小,速度快,每笔资料,平均仅需不到40个时钟值,以10 MHZ计,十万笔资料,约需半秒钟! 
 请注意程式中所用的技巧,由2至6的分支法,就比下面这种写法为佳:
1:      OR  BL,BL 
  2:      JZ  CHAN1  
  3:      MOV  DX,5A41H 
  4:    JMP  SHORT CHANGE 
  5: CHAN1: 
  6:      MOV  DX,7A61H 
  7: CHANGE:
这种分支也可以由另一种技巧所取代,即预设法。事先将所需用的参数放在固定的缓冲区中,此时取用即可: 
         MOV  DX,BWCOM   ; 比较之预设值  
  这样程式又简单些了:
1:     MOV  AH,20H 
  2:      MOV  DX,BWCOM 
  3: CHANGE: 
  4:      LODSB 
  5:      CMP  AL,DL 
  6:      JB  CHANG1 
  7:      CMP  AL,DH 
  8:      JA  CHANG1 
  9:      XOR  AL,AH 
   10:      MOV  [SI-1],AL 
   11: CHANG1: 
   12:      LOOP  CHANGE 
   13:   RET
以上介绍为变数法技巧,即将所要比较的值,放在暂存器中。由于暂存器快速、节省空间,因此程式效率高。更重要的一点,是程式本身的弹性大,只要应用方式统一,事先把参数设妥,即可共用。