例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