好学IT学院:IT信息技术分享交流平台
标签:汇编  来源:互联网  作者:本站整理  发布时间:2009-05-20  ★★★加入收藏〗〖手机版
摘要:第一节 应用工具一、对程式的认识写作程式不难,但要写出好程式却不容易。这就好像画图一样,人人都能画,而画出来的图却可能有天壤之别。想作一个好画家,首先要有观察及分析的能力,面对着杂乱的事物,先整理出头绪,找到主题。再在画布上勾出轮廓,这叫做……

四、回路中的指令

回路最重要的是速度,因为本段程式,将在计数器的范围之内,连续执行下去。如果不小心浪费了几个时钟值,在回路的累积下,很可能使程式成为牛步。

要想把回路写好,一定要记清楚每个指令的执行时钟,以便选择效率最高者。同时,要知道哪些指令可以获得相同的处理效果,才能有更多的选择。

其次,在回路中,最忌讳用缓冲器,不仅占用空间大,处理速度慢,而且不能灵活运用,功能有限。另外也应极力避免常数,尽量设法经由暂存器执行,用得巧妙时,常会将整个程式的效率提高百十倍。

还有便是少用 PUSH,POP,DIV,MUL和 CALL 等浪费时钟的指令。除此之外,小心、谨慎,深思、熟虑,才是把回路写好的不二法门。

在前例中,把比较常数的指令换为比较暂存器,便是很好的证明。如果用常数,两段程式决不可能共用,时、空都无谓地浪费了。

以下再举数例,乍看这似乎有些吹毛求疵,但是仔细计算一下所浪费的时间,可能就笑不出声了。

兹假定以下回路需处理五万字元的资料,频率为 10MHZ,其情况为:
  1: LOOP1:
  2:        LODSB
  3:      XOR  AL,[DI]
  4:      STOSB
  5:      LOOP  LOOP1

本程式计数器等于50,000,每次需
  12T+14T+11T+17T=55T 个时钟脉冲
若以50,000次计,需时 47*50,000/10,000,000 秒,即约四分之一秒。

只要稍稍将指令调整一下,为:
  1: LOOP1:
  2:           LODSW
  3:      XOR  AX,[DI]
  4:      STOSW
  5:      LOOP  LOOP1

这样计数器只要25,000次,每次
  16T+18T+15T+17T=66T
  则25,000次需时 66*25,000/10,000,000 秒,约六分之一秒,比前面的程式快了二分之一。

同理,在回路中加回路,而每个回路需 17T,也是很大的浪费。倘若加调用 CALL 指令,则需 23T+20T=43T,浪费得更多,读者不可不慎。

当某一段程式用得很频繁时,理应视作子程式,例如下面的 LODAX:
  1: LOOP1:
  2:      CALL  LODAX
  3:      LOOP  LOOP1
  4:      RET
  5: LODAX:
  6:      LODSW
  7:      XOR  AX,[DI]
  8:      STOSW
  9:      RET

其实这是贪小失大,仅四个字元的程式,竟用三个字元的调用指令去交换,是绝对得不偿失的。
  再如同下面的程式,颇有值得商榷之处。
  1: LOOP1:
  2:      MOV  DX,NUMBER1
  3:      MOV  CX,NUMBER2
  4:  LOOP2:
  5:   PUSH  CX
  6:      MOV  CX,DX
  7: LOOP3:
  8:      LODSW
  9:      XOR  AX,[DI]
   10:      STOSW
   11:      LOOP  LOOP3
   12:      INC   DI
   13:      INC   DI
   14:      POP  CX
   15:      LOOP  LOOP2
   16:      RET

第二个回路是多余的,这是高阶语言常用的观念,对组合语言完全不适用。
  稍加改动,不损上面程式原有的条件,得到:
  1: LOOP1:
  2:      MOV  DX,NUMBER1
  3: LOOP2:
  4:      MOV  CX,NUMBER2
  5: LOOP3:
  6:      LODSW
  7:      XOR  AX,[DI]
  8:      STOSW
  9:      LOOP  LOOP3
   10:      INC   DI
   11:      INC   DI
   12:      DEC   DX
   13:      JNZ  LOOP2
   14:      RET
这样回路少了一个,程式中将5,6,14,15 各条中原来为15T+2T+12T+17T=46T的时间,省为12,13,14条的2T+16T+17T=35T。