CAPTURA
En este programa utilizaremos por primera vez el BLOQUE PARA CAPTURAR UNA CADENA DE CARACTERES, su uso es muy sencillo pero hay que dar algo de teoría.
Para empezar las cadenas de caracteres empleadas con este bloque son diferentes a las que normalmente usamos (como "Mensaje$") y tienen un formato propio el cual esta organizado de la siguiente manera:
Debido a esto no podremos imprimirla como las demás cadenas de caracteres, si no que imprimiremos cada caracter por separado.
Eso lo logramos con un BLOQUE "ESPECIAL" (Ver CONCEPTOS BASICOS) el cual explicare a continuación:
MOV SI, OFFSET Cadena_de_caracteres
ADD SI, 2
MOV CX, 00H
MOV CL, Cadena_de_caracteres(1)
Etiqueta_nueva:
MOV Respaldo, CX
MOV DH, Fila
MOV DL, Columna
ADD DL, Cadena_de_caracteres(1)
SUB DL, CL
MOV AH, 02H
INT 10H
LODSB
MOV AH, 0AH
MOV BH, 00H
MOV BL, 07H
MOV CX, 01H
INT 10H
MOV CX, Respaldo
LOOP Etiqueta_nueva
Donde:
Fila = Fila donde queremos colocar el cursor
Columna = Columna donde queremos colocar el cursor
Cadena_de_caracteres = Variable donde guardamos la cadena de caracteres.
Etiqueta_nueva = Una etiqueta que no ayas usado antes.
Notaran varias cosas en el codigo como el posicionar el cursor en la Columna Columna+Cadena_de_caracteres(1) - CL, esto es para colocar, esto lo hacemos para colocar en el lugra correcto, ejemplo: para imprimir PEDRO en la posicion 3,3 Columna vale 3, Cadena_de_caracteres(1) vale 5 y CL 5 (CL al inicio vale lo mismo que Cadena_de_caracteres(1) ). Todo esto para imprimir la letra P nos queda: 3 + 5 - 5 = 3, si contimuamos con el LOOP CX se decrementa y ahora vale 4, con lo cual la letra E se posiciona en: 3 + 5 - 4= 4, un espacio delante de la P.
Otra cosa es el empleo de la variable Respaldo, lo que pasa es que en el BLOQUE PARA IMPRIMIR UN CARACTER se modifica el valor de CX con lo cual el LOOP perderia la cuenta que lleva, para evitar eso justo despues de la etiqueta guardamos el valor de CX en respaldo y justo antes del comando LOOP movemos Respaldo a CX para no perder la cuenta.
Entendido esto pasemos al código:
.MODEL SMALL
.STACK
.DATA
PREGUNTA DB "Texto a desplegar:$"
RESPUESTA DB 18 DUP(?)
MENSAJE DB "Presione una tecla para continuar...$"
RESPALDO DW ?
.CODE
CAPTURA:
MOV AX,@DATA
MOV DS,AX
MOV AH,00H
MOV AL,02H
INT 10H
MOV DH,3
MOV DL,3
MOV BH,00H
MOV AH,02H
INT 10H
MOV DX,OFFSET PREGUNTA
MOV AH,09H
INT 21H
MOV RESPUESTA(0),16
MOV DX,OFFSET RESPUESTA
MOV AH,0AH
INT 21H
MOV SI,OFFSET RESPUESTA
ADD SI,2
MOV CX,00H
MOV CL,RESPUESTA(1)
RETORNO1:
MOV RESPALDO,CX
MOV DH,5
MOV DL,3
ADD DL,RESPUESTA(1)
SUB DL,CL
MOV BH,00H
MOV AH,02H
INT 10H
LODSB
MOV AH,0AH
MOV BH,00H
MOV BL,07H
MOV CX,1
INT 10H
MOV CX,RESPALDO
LOOP RETORNO1
MOV DH,7
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
END CAPTURA