Está en la página 1de 14

INSTITUTO TECNOLÓGICO DE NUEVO LAREDO

ING. EN SISTEMAS COMPUTACIONALES

MATERIA: UNIDAD: PRÁCTICA:


Lenguajes de Interfaz 2 9

NOMBRE DE LA PRÁCTICA: Programación con Instrucciones Lineales

OBJETIVO: Utilizar las diferentes Instrucciones Aritméticas para comprobar lo visto en clase,
así como visualizar la aplicación en problemas de múltiple precisión.
MATERIAL Y EQUIPO NECESARIO:
 Computadora personal IBM o compatible
 Con cualquiera de los siguientes sistemas operativos
o DOS
o Windows 3.11
o Windows 9x (95 o 98)
o Windows 2000
o Windows XP ó en Windows 7 ( o superior) usar una maquina virtual en Modo XP,
o DosBox
 Instalado el programa DEBUG.EXE
 Instalado el programa TASM.EXE y TLINK.EXE
 Instalado el programa MASM y LINK

Introducción:
La Programación con Instrucciones Lineales en el ambiente de programación en
Lenguaje Ensamblador, es la realización de instrucciones una después de otra
sin que exista alguna condición a considerar para la ejecución de la misma.
La computadora trabaja en binario y a través de la utilización de diferentes
instrucciones aritméticas se puede comprobar que estas cumplen con los
resultados esperados al aplicar las reglas básicas de estas operaciones.

Correlación con los temas y subtemas del programa de estudio


vigente:

2.9 Instrucciones aritméticas


2.11 Obtención de cadena con representación decimal
2.13 Desplazamiento y rotación
Página 1 Práctica No. 4 Programación con Instrucciones Lineales

2.14 Obtención de una cadena con la representación hexadecimal


2.15 Captura y almacenamiento de datos numéricos

Metodología:

Realizar plantear diferentes problemas aritméticos y encontrar los valores


esperados a comprobar en el laboratorio.

Sugerencias Didácticas:
Seleccionar problemas individuales a resolver para cada uno de los equipos de
trabajo a integrar en la clase y verificar con cada equipo los resultados obtenidos
en la computadora.

Interrupciones del DOS


Para comprender mejor esta práctica veremos un ejemplo, donde utilizaremos
Interrupciones del DOS para interactuar con el teclado.

Función ENTRADA AL BUFFER DEL TECLADO ------ Numero 0A Hexadecimal


Entre con:
Reg AH = A
DS:DX = Dirección del Buffer
Ejecute:
INT 21H
Regrese con:
Caracteres tecleados en el Buffer
Comentario: Primer byte del Buffer = Contador del máximo numero de
Caracteres
Segundo byte = Número actual de caracteres tecleados
Página 2 Práctica No. 4 Programación con Instrucciones Lineales

Capture el siguiente un programa en DEBUG:


Usar Maquina Virtual Xp
-a100

La función guarda los caracteres tecleados en un buffer, donde un buffer es una


secuencia de localidades de memoria como se muestra a continuación:

El número máximo de caracteres debe considerar el número de caracteres a


capturar más el carácter return y en el número de caracteres tecleados nos
regresa la longitud del string tecleado, donde este es invariablemente en ASCII
y se encuentra a partir del tercer byte del buffer del teclado especificado.

Haciendo un programa con Turbo Assembler:


Con el programa TASM pasamos un programa guardado con extensión ASM a
uno con extensión OBJ y con el TLINK pasamos un programa con extensión
OBJ a uno con extensión EXE, el cual puede ser ejecutado desde el ambiente
DOS simplemente tecleando su nombre directamente, ya que al tener extensión
EXE se ejecuta directamente, por lo cual analizaremos el siguiente ejemplo
guardado como EJEMPLO2.ASM.
Página 3 Práctica No. 4 Programación con Instrucciones Lineales

code segment ; INICIO DE UN SEGMENTO UNICO


assume cs:code,ds:code,ss:code
org 100h ; LOCALIDAD DE INICIO DEL CONTADOR
main proc ; PROCEDIMIENTO PRINCIPAL
mov ax,cs
mov ds,ax
lea dx,letrero1 ; CAPTURA A
mov ah,9h
int 21h
lea dx,a_ascii
mov ah,0ah
int 21h
lea dx,letrero2 ; CAPTURA B
mov ah,9h
int 21h
lea dx,b_ascii
mov ah,0ah
int 21h

lea si,a_ascii ; CONVIERTE A BINARIO LA VARIABLE A


mov ax,[si+2]
sub ax,3030h
cmp ah,9
jbe numero
sub ah,7
numero:
cmp al,9
jbe numero1
sub al,7
numero1:
xchg ah,al
mov cl,4
shl al,cl
shr ax,cl
mov a,al
lea si,b_ascii ; CONVIERTE A BINARIO LA VARIABLE B
mov ax,[si+2]
sub ax,3030h
cmp ah,9
jbe numero2
sub ah,7
numero2:
cmp al,9
jbe numero3
sub al,7
numero3:
xchg ah,al
mov cl,4
shl al,cl
shr ax,cl
mov b,al
Página 4 Práctica No. 4 Programación con Instrucciones Lineales

mov al,a ; INICIO DEL PROGRAMA


mov bl,b
add al,bl
mov resultado,al

lea dx,letrero ; IMPRIME EN PANTALLA LOS RESULTADOS


mov ah,09
int 21h

mov dl,resultado ; CONVIERTE A ASCII LA PARTE ALTA DEL RESULTADO


mov cl,4
shr dl,cl
cmp dl,9
jbe numero4
add dl,7
numero4:
add dl,30h
mov ah,02h
int 21h

mov dl,resultado ; CONVIERTE A ASCII LA PARTE BAJA DEL RESULTADO


mov cl,4
shl dl,cl
shr dl,cl
cmp dl,9
jbe numero5
add dl,7
numero5:
add dl,30h
mov ah,02h
int 21h
mov ah,4ch ; FIN DEL PROGRAMA
int 21h
main endp

a_ascii db 3,0,0,0,0; VARIABLES AQUI


b_ascii db 3,0,0,0,0
a db 0
b db 0
resultado db 0
letrero db 0dh,0ah,'El resultado es : $'
letrero1 db'Teclee el valor de A : $'
letrero2 db 0dh,0ah,'Teclee el valor de B : $'

code ends ; TERMINA EL SEGMENTO DE CODIGO

end main ; FIN DEL ENSAMBLE


Página 5 Práctica No. 4 Programación con Instrucciones Lineales

En este ejemplo se utiliza la instrucción lea (load efective address), la cual


regresa en el registro destino utilizado la dirección del letrero o variable
requerida para substituir el suministro de la dirección capturada directamente en
el DEBUG, al utilizar la opción 0AH del INT 21h, los datos capturados están a
partir de esta localidad, como lo establece la descripción del buffer mencionado
anteriormente, se utiliza en este ejemplo como registro apuntador a SI y de esta
manera obtenemos la dirección de la localidad de inicio de la variable y si se le
suma un dos a SI podemos acceder a la dirección donde se encuentran
almacenados los datos y como el procesador utiliza lógica de memoria inversa
para traer datos de la memoria a un registro de 16 bits (AX), entonces AL
contiene la parte alta y AH la parte baja ya que la opción OAH del INT 21H así
los captura del teclado, capturando primero parte alta y después parte baja, por
lo cual se utiliza la instrucción XCHG para dejar en AH la parte alta y en AL la
parte baja como requerimos para las operaciones aritméticas.
En la conversión de ASCII a binario no se hace el filtro de mayúsculas y
minúsculas del código ASCII, ni si son solamente números hexadecimales
validos, por lo tanto se requiere que los datos capturados del teclado sean de 2
caracteres únicamente y estos deben ser letras mayúsculas de la A a la F y
números del 0 al 9, todo esto para simplificar su comprensión y realización.
En el código ASCII los números hexadecimales a capturar que son del 0,1,2 ..,9
se convierten en 30h,31h,32h,..,39h y las letras A,B,C,..,F (el programa diseñado
requiere mayúsculas ) en 41h,42h,43h,..,46h, siendo en el caso de los números
el 30h una constante que restándola al dato capturado se convierte en la
información binaria requerida ( 0,1,2 ,..,9 ) y si el 30h se le resta a una letra
quedaría un 11h,12h,13h,..,16h lo cual en binario seria un 17,18,19,..,22 en
decimal, y para que se conviertan en un 10,11,12,…,15 decimal se requiere
restar posteriormente un 7 decimal y quedaría como A,B,..,F en hexadecimal o
sea binario, siendo esta lógica aplicada en la conversión y posteriormente al
estar los 8 bits de datos en 2 bytes conteniendo cada uno 4 bits de datos se
empacan utilizando instrucciones de desplazamiento y de esta manera esta lista
la información para ser utilizada en el programa analizado en la práctica 2.
La salida de información al monitor requiere que esta se encuentre en formato
ASCII, por lo cual al estar la información a mostrar empacada, se desempaca
primero y se muestra de mayor a menor con la conversión al revés o sea se le
suma un 30h o 37h si es numero o letra para lo cual se compara con un nueve
que es el límite de los números decimales y el siguiente (10 decimal = A
hexadecimal) es el inicio de las letras hexadecimales.
Página 6 Práctica No. 4 Programación con Instrucciones Lineales
Ejecución del programa EJEMPLO2.ASM

Ejemplo de multiplicación de dos números de 2 dígitos.


Considerar que ( A ) = 34 Y ( B ) = 56

a1 a0
x Variables a
b1 b0 utilizar
-----------------
c02 c01 c00
c12 c11 c10 ----------+
----------------------- ¦
c3 c2 c1 c0 ¦
¦
3 4 Proceso¦ Manual
x ¦
5 6 ¦
----------- ¦
2 4 ¦
+ ¦
1 8 ¦
----------- v
2 0 4 2 0 4
+
1 7 0
2 0 ---------------
+
1 5 1 9 0 4
---------
1 7 0

code segment ; INICIO DE UN SEGMENTO UNICO


assume cs:code,ds:code,ss:code
org 100h ; LOCALIDAD DE INICIO DEL CONTADOR
main proc ; PROCEDIMIENTO PRINCIPAL
mov ax,cs
mov ds,ax
lea dx,letrero1 ; CAPTURA A
mov ah,9h
int 21h

Página 7 Práctica No. 4 Programación con Instrucciones Lineales


lea dx,valor1
mov ah,0ah
int 21h
lea dx,letrero2 ; CAPTURA B
mov ah,9h
int 21h
lea dx,valor2
mov ah,0ah
int 21h
lea si,valor1 ; CONVIERTE A BCD SIN EMPACAR A
mov ax,[si+2]
sub ax,3030h
mov a,ah
mov a+1,al
lea si,valor2 ; CONVIERTE A BCD SIN EMPACAR B
mov ax,[si+2]
sub ax,3030h
mov b,ah
mov b+1,al
mov al,a ; INICIO DEL PROGRAMA
mul b
aam
mov word ptr co,ax
mov al,a+1
mul b
aam
add al,co+1
aaa
mov word ptr co+1,ax
mov al,a
mul b+1
aam
mov word ptr c1,ax
mov al,a+1
mul b+1
aam
add al,c1+1
aaa
mov word ptr c1+1,ax
mov al,co
mov c,al
mov al,co+1
add al,c1
aaa
mov c+1,al
mov al,co+2
adc al,c1+1
aaa
mov c+2,al
mov al,0
adc al,c1+2
aaa
mov c+3,al
Página 8 Práctica No. 4 Programación con Instrucciones Lineales
lea dx,letrero
mov ah,09
int 21h
mov dl,c+3

add dl,30h
mov ah,02h
int 21h
mov dl,c+2
add dl,30h
mov ah,02h
int 21h
mov dl,c+1
add dl,30h
mov ah,02h
int 21h
mov dl,c+0
add dl,30h
mov ah,02h
int 21h
mov ah,4ch
int 21h ; FIN DEL PROGRAMA
main endp

a db 0h,0h ; VARIABLES AQUI


b db 0h,0h
co db 0,0,0,0
c1 db 0,0,0,0
c db 0,0,0,0
letrero db 0dh,0ah,'El resultado es : $'
letrero1 db'Teclee el valor de A : $'
letrero2 db 0dh,0ah,'Teclee el valor de B : $'
valor1 db 3,0,0,0,0
valor2 db 3,0,0,0,0

;Inicia

code ends ; TERMINA EL SEGMENTO DE CODIGO

end main ; FIN DEL ENSAMBLE


Página 9 Práctica No. 4 Programación con Instrucciones Lineales
Ejecución del programa MULTIP2.ASM

Al comparar el programa MULTIP2.EXE y MULTIP2.ASM vemos como las


etiquetas cambian por direcciones físicas y para observar los datos solamente
hay que igualas el valor de RDS al de RCS.

A continuación se muestran los letreros de la dirección 1EE16 a la 23416 que


terminan cada uno con un 2416('$') y las variables capturadas de la dirección
23516 a la 23E16 que terminan cada una con el 0D16(ENTER) y las variables
intermedias de la dirección 1DE16 a la 1E816 y la variable de salida de la
dirección 1EA16 a la 1ED16.
Página 10 Práctica No. 4 Programación con Instrucciones Lineales

Procedimiento(Tareas) a realizar por los alumnos:


Realizar la operación indicada para cada equipo (está resuelto en el libro de
Lenguaje Ensamblador).

1.- Comprobar el programa visto en clase con el DEBUG guardando los datos de
prueba suministrados para las variables y los resultados en la memoria.
(Asignar direcciones físicas a las variables, preferentemente en las
localidades 200,210,220,…).

2.- Realizar el programa con TASM que incluya:

a).- Mensaje con la operación a realizar.

b).-Mensajes previos a la captura de información desde el teclado.

c).-Una vez realizada la captura en ASCII, convertirla al formato requerido


para realizar la operación (Hexadecimal (Binario) o BCD Empacado).

d).- Realice la operación.

e).-Convierta los datos a ASCII.

f).-Muestre un letrero apropiado y el resultado en la pantalla.

Equipo No. 1 Suma de Múltiple Precisión (32 bits)

Pruebe con los siguientes datos (en hexadecimal)

CARRY = 0 CARRY = 1
0015 25AO 0015 65AO
+ 0021 B79E 0021 B79E
------ ------ ------ ------
0036 DD3E 0037 1D3E
Página 11 Práctica No. 4 Programación con Instrucciones Lineales
Equipo No. 2 Substracción de Múltiple Precisión (32 bits)

Pruebe con los siguientes datos (en hexadecimal)

0 0 0 6 A 9 2 F 0 0 0 6 A 9 2 F
- -
0 0 0 4 9 8 3 7 0 0 0 4 B 8 3 7
------------------- -------------------
0 0 0 2 1 0 F 8 0 0 0 2 F 0 F 8
- -
BORROW 0 BORROW 1
------------------- ------------------
0 0 0 2 1 0 F 8 0 0 0 1 F 0 F 8

Equipo No. 3 Suma y Resta en Simple Precisión (16 bits)


W <--- X + Y + 24 – Z

Pruebe con los siguientes datos (en hexadecimal)

X = A92F
+
Y = 9837
-------
C=1 4166
+
0024
-------
418A
-
Z = 3A2F
-------
075B

Equipo No. 4 Suma y Resta en Doble Precisión (32 bits)


W <--- X + Y + 24 – Z

X = 0006 A92F
+
Y = 0004 9837
------------
000B 4166
+
0000 0024
------------
000B 418A
-
Z = 0003 6A2F
------------
0007 D75B

Página 12 Práctica No. 4 Programación con Instrucciones Lineales


Equipo No. 5 Suma de Números BCD Empacados
BCD3<----- BCD1 + BCD2

1<-- CF
BCD1 = 1834 1 8 3 4
+
BCD2 = 2789 2 7 8 9
----- -----
4 0 B D
+ +
0 6 6 6 <-- AJUSTE
----- -----
4 6 2 3

Equipo No. 6 Resta de Números BCD Empacados


BCD3<----- BCD1 - BCD2

1<-CF 0<-- CF

BCD1 = 1234 1 2 3 4
-
BCD2 = 4612 4 6 1 2
----- -----
C C 2 2
-
6 6 0 0 <-- AJUSTE
----- -----
6 6 2 2

Reporte del alumno:

Reportar por escrito los programas realizados en la Computadora en ambiente


DEBUG y TASM, incluyendo resultados y conclusiones.

Bibliografía:
Assembly Language Primer
for the IBM PC & XT
Robert Lafore
Plume/Waite Book
Página 13 Práctica No. 4 Programación con Instrucciones Lineales

También podría gustarte