例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中除'空格'以外且不包括$在内的字符个数。