汇编语言的艺术之三:基本认识

来源:互联网  作者:本站整理
摘要:第一节 应用工具一、对程式的认识写作程式不难,但要写出好程式却不容易。这就好像画图一样,人人都能画,而画出来的图却可能有天壤之别。想作一个好画家,首先要有观察及分析的能力,面对着杂乱的事物,先整理出头绪,找到主题。再在画布上勾出轮廓,这叫做……

三、指令应用要灵活

有一段很简单的程式,其写作的方法甚多,但是指令应用的良窳,会使得程式的效率相去天上地下,难以估计。

这段程式的用途,是要将一段资料中,英文字符大、小写相互转换。当然,转换的选择要由使用者决定,在下面程式且略去使用介面,假设已得知转换的方式。

设资料在 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

以上介绍为变数法技巧,即将所要比较的值,放在暂存器中。由于暂存器快速、节省空间,因此程式效率高。更重要的一点,是程式本身的弹性大,只要应用方式统一,事先把参数设妥,即可共用。

【相关文章】好搜一下
小方法大作用:如何让网站PR值一路高歌

小方法大作用:如何让网站PR值一路高歌

做网站最痛苦的就是建站之初的那段时间,如长沙厂房出租网站刚建立,只是处于婴幼儿时…