例7.37 编写一程序:计算BUFFER缓冲区中除'空格'外的字符个数,把它存放在DX寄存器中。该缓冲区以$字符结束。程序如下:

      SUB      DX,DX
      LEA      BX,BUFFER
     .REPEAT
      MOV      AL,[BX]
      INC      BX
     .CONTINUE .IF AL ==''
      INC      DX
     .UNTIL     AL == '$'
   汇编程序将产生以下代码:
      SUB      DX,DX
      LEA      BX,BUFFER
   RPT: MOV      AL,[BX]
      INC      BX
      CMP      AL, ''
      JZ       NOCOUNT
      INC      DX
 NOCOUNT: CMP      AL,'$'
      JNZ      RPT
  可见程序能正常运行,但计数时会把$计算在内。为解决这一问题,可修改程序如下:
      SUB      DX,DX
      LEA      BX,BUFFER
     .REPEAT
      MOV      AL,[BX]
      INC      BX
     .BREAK .IF   AL == '$'
     .CONTINUE .IF AL == ''
      INC      DX
     .UNTIL 0
  汇编程序产生的代码如下:
      SUB      DX,DX
      LEA      BX,BUFFER
   RPT: MOV      AL,[BX]
      INC      BX
      CMP      AL, '$'
      JZ       EXIT
      CMP      AL, ' '
      JZ       NOCOUNT
      INC      DX
 NOCOUNT: JMP      RPT
   EXIT:

  在这里,.BREAK的加入保证了程序的正确退出。这样一来 .UNTIL可以不再测试循环的结束条件,用 .UNTIL 0表示 .REPEAT/.UNTIL循环可以无穷尽地进行(亦即.UNTIL用一条JMP指令取代),这样该程序执行的结果便可以正确地计算BUFFER中除'空格'以外且不包括$在内的字符个数。