例7.34 编制程序作重复读入一字符并在屏幕上回显的操作,直到读入字符为CR(回车符)为止。(DISP为显示AL中字符的子程序)

     .REPEAT
     MOV       AH,1
     INT       21H
     CALL       DISP
     .UNTIL      AL==CR
   汇编程序将产生以下代码:
   RPT: MOV       AH,1
     INT       21H
     CALL       DISP
     CMP       AL,0DH
     JNZ       RPT

  .REPEAT/.UNTILCXZ同样产生UNTIL循环结构程序,但使用CX寄存器作为循环计数器,.UNTILCXZ则产生一条循环指令LOOP。请看下面的例子。

例7.35 测试AX寄存器中的1的个数,并把结果存入DX中。程序采用使AX寄存器左移16次,每次测试符号位是否为1的方法来计数,循环次数则存放在CX中。

     MOV      CX,16
     MOV      DX,0
     .REPEAT
     TEST      AX,0FFFFH
     JNS      NEXT
     INC      DX
  NEXT: SHL      AX,1
     .UNTILCXZ
   汇编程序将产生以下代码:
     MOV      CX,16
     MOV      DX,0
   RPT: TEST      AX,0FFFFH
     JNS      NEXT
     INC      DX
  NEXT: SHL      AX,1
     LOOP      RPT

例7.36 本例的编程要求和例7.35完全相同,只是在程序的算法中再加上一个AX = 0的判断,也就是说每次AX左移后加上(AX)是否为0的判断。如为0,就可提前退出循环,而不必非等AX左移16次后才结束程序。编制程序如下:

     MOV       CX,16
     MOV       DX,0
    .REPEAT
     TEST      AX,0FFFFH
     JNS       NEXT
     INC       DX
  NEXT: SHL       AX,1
    .UNTILCXZ    AX == 0
   可以看出这一程序与例7.35的程序只有末行有差异。汇编程序将产生以下代码:
    MOV       CX,16
    MOV       DX,0
  RPT: TEST       AX,0FFFFH
    JNS       NEXT
    INC       DX
 NEXT: SHL       AX,1
     OR        AX,AX
    LOOPNE      RPT