RECUADRO
Para poder entender este programa debemos conocer el funcionamiento de la instrucción LOOP (Loop es muy similar al comando FOR en Lenguaje C).
La función del comando LOOP es realizar un salto a la etiqueta indicada si CX-1 es mayor que 0.
También cabe mencionar que el valor de CX es automáticamente decrementado cada vez que se ejecute LOOP. Esto nos sirve para llevar una cuenta regresiva y poder controlar nuestro programa de esa manera. EJEMPLO:
MOV CX,10
Etiqueta:
MOV DH,CL
MOV DL,3
MOV BH,00H
MOV AH,02H
INT 10H
MOV DX,OFFSET Mensaje
MOV AH,09H
INT 21H
LOOP Etiqueta
Lo que hace el programa anterior es imprimir un mensaje 10 veces (de la fila 1 a la fila 10 son 11 veces). Lo primero que se hace es asignarle al registro CX el valor 10 , después declaramos ETIQUETA. El código entre ETIQUETA y LOOP ETIQUETA será lo que se repita 10 veces. Durante las 10 repeticiones el valor de CX es decrementado cada vez que LOOP salta a ETIQUETA (con lo que CX primero vale 10, en la que sigue 9, luego 8 y así hasta llegar a 1).
La cuenta regresiva que se realiza en CX la podemos aprovechar a nuestro beneficio, si observas los comandos entre ETIQUETA y LOOP ETIQUETA te darás cuenta que son un BLOQUE PARA IMPRIMIR UNA CADENA DE CARACTERES, la única diferencia es que al valor de las Fila (DH) le asignamos el valor que tiene CL, (Recuerda que CL es el byte menos significativo de CX y por lo tanto también vale lo que CX mientras CX sea menor que 256) con lo que desplazaremos el mensaje desde la columna 10 hasta la 0.
Si esto quedo claro no habrá problema con el programa siguiente:
.MODEL SMALL
.STACK
.DATA
CARACTER DB "#$"
MENSAJE DB "Presione una tecla para continuar...$"
.CODE
RECUADRO PROC FAR
MOV AX,@DATA
MOV DS,AX
MOV AH,00H
MOV AL,02H
INT 10H
MOV CX,80
RETORNO1:
MOV DH,0
MOV DL,CL
SUB DL,1
MOV BH,00H
MOV AH,02H
INT 10H
MOV DX,OFFSET CARACTER
MOV AH,09H
INT 21H
MOV DH,23
MOV DL,CL
SUB DL,1
MOV BH,00H
MOV AH,02H
INT 10H
MOV DX,OFFSET CARACTER
MOV AH,09H
INT 21H
LOOP RETORNO1
MOV CX,23
RETORNO2:
MOV DH,CL
SUB DH,1
MOV DL,0
MOV BH,00H
MOV AH,02H
INT 10H
MOV DX,OFFSET CARACTER
MOV AH,09H
INT 21H
MOV DH,CL
SUB DH,1
MOV DL,80
DEC DL
MOV BH,00H
MOV AH,02H
INT 10H
MOV DX,OFFSET CARACTER
MOV AH,09H
INT 21H
LOOP RETORNO2
MOV DH,3
MOV DL,3
MOV BH,00H
MOV AH,02H
INT 10H
MOV DX,OFFSET MENSAJE
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV AX,4C00H
INT 21H
RECUADRO ENDP
END RECUADRO