La captura y almacenamiento de datos numéricos en el
lenguaje ensamblador nos permite la opción de meter o introducir algún numero
en un programa deceado , en el cual dando las instrucciones necesarias se
pueden además de ser capturadas almacenarlas dentro del programa.
Para la introducción de los datos ya sea numéricos o
carácter es necesario la interaccion a través de un dispositivo como : teclado,
raton, monitor,etc.
Cuando un programa tiene mas variables que registros, el
compilador almacena las variables mas utilizadas en los registros, y las
restantes en memoria: derramar registros (spilling)
Solo las instrucciones de carga y almacenamiento acceden a
memoria , según los cálculos efectuados sobre valores en los registros.
alineación: una cantidad esta alineada si su dirección de memoria es un
múltiplo de su tamaño en bytes.
casi todas las instrucciones de carga y almacenamiento operan solo sobre datos
alineados.
instrucciones para alinear datos o alineados son : lwl , lwr, swl y swr.
El ensamblador permite definir elementos para datos de
diferentes longitudes de acuerdo con un conjunto de directivas especificas para
ello. El formato general es el siguiente:
Donde dn es una de las directivas de la siguiente tabla:
Los datos se almacenan en memoria en el orden en que han
sido declarados y podemos
acceder a ellos usando el nombre dado en la declaración. Por ejemplo, si
declaramos los siguientes
datos:
Numero dw 5
Tabla 3, 4, 5
cadena db ‘hola’
El aspecto de la memoria sería el siguiente:
Asimismo, al igual que cuando operamos con dos registros, el
“tamaño de la variable” debe
ser el mismo que el del otro operando, esto es, operaciones
como las siguientes darían un error al
ensamblar:
MOV AL, Numero
MOV AX, Tabla
Las constantes numéricas
se usan para definir valores aritméticos y direcciones de
memoria.
Las constantes numéricas no llevan comillas, como sucede con las cadenas de
caracteres, y van seguidas de un indicador de la base utilizada. Si se omite
éste, se supone el sistema decimal.
Si el primer dígito de una constante hexadecimal es una
letra (A..F), debe anteponerse un cero,
para que el ensamblador pueda distinguir que se trata de una constante numérica
y no una cadena de caracteres.
Existe un elemento en ensamblador que es la DIRECTIVA que es la que se encarga
de asociar el nombre de un símbolo con la expresión enterea.
La Directiva EQU.
La directiva EQU no define ningún tipo de dato, sino que
define constantes, o sea, define valores
que el ensamblador puede sustituir en otras instrucciones. Por ejemplo,
VALOR EQU 100
Cada vez que en el programa aparezca VALOR, el ensamblador
lo sustituirá por 100. Así,
MOV AX, VALOR
Es equivalente a
MOV AX, 100
Es muy útil para evitar tener que actualizar en varias
instrucciones una constante que se repite
y que se modifica al depurar el programa
Ejemplos:
1
.MODEL SMALL
.STACK
.DATA
VAL1 DB 'DIGITE VALOR 1: $'
VAL2 DB 'DIGITE VALOR 2: $'
.CODE
inicio:
MOV AX, SEG VAL1
MOV DS, AX
MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
MOV AH, 09h ;imprime mensaje
VAL1 con la
INT 21h ;función 9h
MOV AH, 01h ;captura un
valor del teclado
INT 21h ;y se guarda en
AL
PUSH AX
MOV AX, SEG VAL2
MOV DS, AX
MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
MOV AH, 09h ;imprime mensaje
VAL1 con la
INT 21h ;función 9h
MOV AH, 01h ;captura un
valor del teclado
INT 21h ;y se guarda en
AL
MOV BL, AL
POP AX
ADD BX, AX
MOV AH, 4Ch
INT 21h
END inicio
2
.MODEL SMALL
.STACK
.DATA
VAL1 DB 'DIGITE VALOR 1: $'
VAL2 DB 13, 10, 'DIGITE VALOR 2: $'
numeros DB 0
.CODE
inicio:
MOV AX, SEG VAL1
MOV DS, AX
MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
MOV AH, 09h ;imprime mensaje VAL1 con la
INT 21h ;función 9h
MOV AH, 01h ;captura un valor del teclado
INT 21h ;y se guarda en AL
sub al, 48 ;restamos al caracter el ASCII de 0 para convertirlo en un numero
mov numeros, al
MOV AX, SEG VAL2
MOV DS, AX
MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
MOV AH, 09h ;imprime mensaje VAL1 con la
INT 21h ;función 9h
MOV AH, 01h ;captura un valor del teclado
INT 21h ;y se guarda en AL
sub al, 48 ;restamos al caracter el ASCII de 0 p ara convertirlo en un numero
add numeros, al ;aca tenemos el resultado de la suma
MOV AH, 4Ch
INT 21h
END inicio
3
.MODEL SMALL
.STACK
.DATA
VAL1 DB 'DIGITE VALOR 1: $'
VAL2 DB 13,10,'DIGITE VALOR 2: $'
MSG DB 13,10,'LA SUMA ES: $'
.CODE
inicio:
MOV AX, SEG VAL1
MOV DS, AX
MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
CALL Print
CALL Capt
PUSH AX
MOV AX, SEG VAL2
MOV DS, AX
MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
CALL Print
CALL Capt
MOV BL, AL ;muevo el valor que se capturo en BL
POP AX ;saca el valor introducido a la pila
ADD BX, AX ;suma BX con AX y guarda en AX
MOV AX, SEG MSG
MOV DS, AX
MOV DX, OFFSET MSG ;Envia a DX el mensaje MSG
CALL Print
MOV AH, 02h
MOV DX ,AX
INT 21h
MOV AH, 4Ch
INT 21h
Print Proc Near
MOV AH, 09h ;imprime mensaje con la
INT 21h ;función 9h
RET
Print Endp
Capt Proc Near
MOV AH, 01h ;captura un valor del teclado
INT 21h ;y se guarda en AL
RET
Capt Endp
END inicio
Ejercicio 3
4 PARA PRACTICAR ;)
.MODEL SMALL
.STACK
.DATA
VAL1 DB 'DIGITE VALOR 1: $'
VAL2 DB 13,10,'DIGITE VALOR 2: $'
MSG DB 13,10,'LA SUMA ES: $'
RESU DB 0
.CODE
inicio:
MOV AX, SEG VAL1
MOV DS, AX
MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
CALL Print
CALL Capt
MOV RESU, AL
MOV AX, SEG VAL2
MOV DS, AX
MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
CALL Print
CALL Capt
ADD RESU, AL
MOV AX, SEG MSG
MOV DS, AX
MOV DX, OFFSET MSG ;Envia a DX el mensaje MSG
CALL Print
MOV AH, 02h
MOV DX ,AX
INT 21h
MOV AH, 4Ch
INT 21h
Print Proc Near
MOV AH, 09h ;imprime mensaje con la
INT 21h ;función 9h
SUB AL, 48 ;restamos al caracter el ASCII de 0 para convertirlo en un numero
RET
Print Endp
Capt Proc Near
MOV AH, 01h ;captura un valor del teclado
INT 21h ;y se guarda en AL
RET
Capt Endp
END inicio