You are on page 1of 16

I.

PRESENTACIN
MATERIA: Lenguajes de Interfaz
CLAVE: SCC-1014
EQUIPO NO:
TTULO: Programacin en Lenguaje Ensamblador
PROFESOR:
FECHA:
PRCTICA : 4
COMPETENCIA(S): Comprender las caractersticas de la arquitectura bsica de los circuitos procesadores ;
Potenciar las habilidades para el uso de las tecnologas de la informacin; Identificar los elementos que
integran un programa en Lenguaje Ensamblador; Analizar la accin que realiza cada instruccin en un
programa; Evaluar los efectos de cada instruccin en los registros de propsito general y en el registro de
banderas del procesador. Identificar las funciones y el trabajo de la interrupcin 21.
II.INSTRUMENTACIN
MATERIAL:
EQUIPO:
Computadora Personal compatible con IBM-PC
HERRAMIENTAS COMPUTACIONALES:
WordPad, TurboAssembler, TurboLinker, TurboDebugger
III. ASPECTOS TERICOS
INTRODUCCIN: Deber de contener los modos de direccionamiento del procesador.
DIAGRAMAS:
Diagrama de flujo de los programas de COMPARA y de OPERA
BIBLIOGRAFA:
Christopher L. Morgan & Mitchell Waite.
Introduccin al Microprocesador 8086/8088 (16 bits).
Ed. Mc Graw Hill.
2. Willian H. Murray III && Chris H Pappas.
80386/80286 Programacin en Lenguaje Ensamblador.
Ed. Mc Graw Hill.
3. J. Terry Godfrey.
Lenguaje Ensamblador para Microcomputadoras IBM para principiantes y avanzados.
Ed. Prentice Hall.
4. Barry B. Brey.
Los Microprocesadores de Intel.
Ed. Prentice Hall
5. Abel, Peter
Lenguaje Ensamblador y Programacin para PC IBM y Compatibles.
Ed. Pearson Educacin.
6. Brey, Barry
Intel Microprocessors 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro
Processor, Pentium II, Pentium III and Pentium IV:
Architecture, Programming and Interfacing. 6/ed.
Ed. Prentice-Hall. USA

IV. DESARROLLO

COMPETENCIAS ESPECFICAS:
Identificar los elementos que integran un programa en Lenguaje Ensamblador.
Analizar la accin que realiza cada instruccin en un programa.
Evaluar los efectos de cada instruccin en los registros y banderas del procesador.
Identificar las funciones de la interrupcin 21
ACTIVIDADES A DESARROLLAR:
a) Capture los siguientes programas utilizando Wordpad y gurdelos con formato de texto MS-DOS.
b) Ensamble (Tasm), enlace (Tlink) y pruebe (*.exe).
c) Identifique los mensajes de error.
d) Corrija cada programa, tomando en consideracin que pueden existir errores.
e) Verifique cada programa lnea por lnea, utilizando el archivo *.LST y el debugger (Td).
f) Elabore el diagrama de flujo de cada programa.
g) Elabore un Reporte de la Prctica.

PROGRAMAS EN LENGUAJE ENSAMBLADOR


;******************************************************************************
; Nombre del programa: COMPARA.ASM
; Objetivo : Captura dos cadenas y las compara, reportando si
; son iguales o no. La cantidad de caracteres a
; comparar est dada por los caracteres realmente
; ledos de la cadena 1. Es decir, para que se
; consideren iguales, las dos cadenas deben ser de
; la misma longitud. El programa distingue entre
; maysculas y minsculas. La "A" es diferente de "a".
;******************************************************************************
; COMANDO DE ENSAMBLE: Tasm COMPARA
; COMANDO DE ENLACE: TLink COMPARA
; COMANDO DE EJECUCION: COMPARA [Enter]
;******************************************************************************
; NOTA : El procedimiento aqu escrito es con fines educativos y NO de
; optimizacin o eficiencia. Por favor, NO SE DESESPERE y estdielo.
;******************************************************************************
;-----------------------------------------------------------------------------; Define el modelo de memoria
;-----------------------------------------------------------------------------.MODEL SMAL
;-----------------------------------------------------------------------------; Define el rea de datos
;-----------------------------------------------------------------------------.Data
Cadena1 DB 15,0,15 DUP(?)
;Variable que almacena cadena 1
Cadena2 DB 15,0,15 DUP(?)
; Variable que almacena cadena 2
Mensaje DB 'Bienvenidos a COMPARA. Programa ejemplo que compara'
DB ' dos cadenas y reporta',13,10
DB 'si son iguales o no. Para terminar digite FIN en
DB 'mayusculas.'
DB 13,10,'$'
Error DB 7,7,7,13,10,'ERROR : cadenas son DIFERENTES !!!'
DB 13,10,13,10,'$'

Error1 DB 7,7,7,13,10,'ERROR : cadena no puede ser NULA !!!.'


DB 13,10,13,10,'$'
Final DB 'FIN'
TodoBIEN DB 7,7,7,13,10,'Cadenas son IGUALES.'
DB 13,10,13,10,'$'
CadUnoM DB 13,10,13,10,'Digite primera CADENA: $'
CadDosM DB 13,10,13,10,'Digite Segunda CADENA: $'
;-----------------------------------------------------------------------------; Define el rea del Stack
;-----------------------------------------------------------------------------.STACK
;-----------------------------------------------------------------------------; Define el rea de cdigo
;-----------------------------------------------------------------------------.CODE
; rea de cdigo
Empieza:
; Etiqueta de comienzo de programa
;-----------------------------------------------------------------------------; BORRA LA PANTALLA CAMBIANDO LA MODALIDAD DE VIDEO. ESTA FORMA DE BORRAR
; LA PANTALLA ES MUY PECULIAR Y ES CONSIDERADA COMO UN "TRUCO". SE BASA EN
; EL HECHO DE QUE AL CAMBIAR LA MODALIDAD DE VIDEO, EL PROPIO BIOS
; (HARDWARE) BORRA LA PANTALLA POR NOSOTROS. ES UN MTODO BURDO PERO MUY
; EFICIENTE.
;-----------------------------------------------------------------------------Mov Ah, 0Fh
Int 10h
Mov Ah, 0
Int 10h
mov Ax,@Data
mov Ds, Ax
mov Dx, Offset Mensaje
Mov Ah, 9
Int 21h
Push Ds
Pop Es

;Obtiene modalidad de video actual


;Cambia a la modalidad de video que se obtuvo
;Inicializa DS con la direccin de @Data
;Despliega el mensaje de bienvenida

; ES = DS

;-----------------------------------------------------------------------------; SE CAPTURAN LAS CADENAS Y SE GUARDAN EN SUS RESPECTIVAS VARIABLES PARA


; PODER TRABAJAR CON ELLAS MAS ADELANTE. LA CAPTURA SE BASA EN LA FUNCIN
; 09 DE LA INT 21H. DICHA FUNCIN ESTABLECE QUE EL REGISTRO AH CONTENGA 09
; Y EL REGISTRO PAR DS:DX APUNTE A LA DIRECCIN DE LA VARIABLE QUE
; ALMACENAR LA ESTRUCTURA DEL BUFFER. STE DEBE DE ESTAR CONSTRUIDO DE LA
; SIGUIENTE MANERA:
; BYTE 1 = CANTIDAD DE BYTES A LEER
; BYTE 2 = (LLENADO POR MS-DOS) ES LA CANTIDAD DE BYTES REALMENTE LEDOS.
; BYTE 3 = BUFFER DONDE SE ALMACENA EL RESULTADO. DEBE ENCONTRARSE
; INICIALIZADO CON LA MISMA CANTIDAD DE BYTES ESPECIFICADOS POR EL BYTE 1.
; LAS CANTIDADES CAPTURADAS REPRESENTAN UNA CADENA QUE ES NECESARIO

; CONVERTIR A BINARIO ANTES DE PODER OPERAR SOBRE ELLA. MAS ADELANTE


; QUEDAR CLARO LO ANTERIOR.
;-----------------------------------------------------------------------------;-----------------------------------------------------------------------------; CAPTURA LA PRIMER CADENA
;-----------------------------------------------------------------------------CAPCAD01:
Mov Dx, Offset CadUnoM
Mov Ah, 9
Int 21h
Mov Ah, 0Ah
Mov Dx, Offset Cadena1
Push Dx
Int 21h
Pop Dx
Inc Dx
Mov Si, Dx
Cmp Byte ptr [Si], 0
Jnz CAPCAD02
Mov Dx, Offset Error1
Mov Ah, 9
Int 21h
Jpm CAPCAD01

; Mensaje de captura de cadena 1

; Captura la cantidad (hasta 15 bytes)


; Guarda direccin de variable

; Obtiene cantidad de bytes realmente ledos


; que se encuentra en el byte 1 del buffer
; Es 0?
; No,, as que prosigue
; Despliega mensaje de error y captura la
; cadena de nuevo

;-----------------------------------------------------------------------------; PRIMERO COMPRUEBA SI LA CADENA 1 TIENE LA CADENA "FIN" QUE ESPECIFICA


; TERMINAR ESTE PROGRAMA. SI LO ANTERIOR ES VERDADERO EL PROGRAMA TERMINA,
; DE LO CONTRARIO CAPTURA LA SEGUNDA CADENA Y PROSIGUE. "FIN" DEBE DE ESTAR
; EN MAYSCULAS.
;-----------------------------------------------------------------------------CAPCAD02:
Inc Dx
Mov Cx, 3
Mov Si, Dx
Mov Di, Offset Final
Repe Cmpsb
Jcxz TERMINA

; Primer byte del buffer de CADENA 1


; Vamos a revisar 3 bytes.
; Cadena capturada
; Mensaje de final
; Digitaron "FIN"?
; Si, s, termina este programa

CAPCAD03:
Mov Dx, Offset CadDosM ; Mensaje de captura de cadena 2
Mov Ah, 9
Int 21h
Mov Ah, 0Ah
; Captura la segunda cadena
Mov Dx, Offset Cadena2
Push Dx
; Guarda direccin de variable
Int 21h

Pop Dx
Inc Dx
Mov Si, Dx
Cmp Byte ptr [Si], 0
Jnz CAPCAD04
Mov Dx, Offset Error1
Mov Ah, 9
Int 21h
Jpm CAPCAD03

; Obtiene cantidad de bytes realmente ledos


; que se encuentra en el byte 1 del buffer
; Es 0?
; No,, as que prosigue
; Despliega mensaje de error y captura la
; cadena de nuevo

;-----------------------------------------------------------------------------; YA SE TIENEN LAS DOS CADENAS CAPTURADAS, AHORA PROCEDEMOS A COMPARARLAS Y


; DESPLEGAR EL MENSAJE ADECUADO.
;-----------------------------------------------------------------------------CAPCAD04:
Xor Ch, Ch
Mov Si, Offset Cadena1 + 1
Mov Cl, byte ptr [Si]
Inc Cl

Inc Si
Mov Di, Offset Cadena2 + 2
Cld
Repe Cmpsb
Jcxz CAPCAD05
Mov Dx, Offset Error
Mov Ah, 9
Int 21h
Jpm CAPCAD01

; CH = 0 por si acaso.
; Bytes realmente ledos de cadena 1
; CX tiene bytes ledos de cadena 1
; Ajusta CL debido a la naturaleza de
; la instruccin de comparacin, y a
; manera en que se comporta
; la funcin 9 de la INT 21H.
; Regresa a direccin de cadena 1
; Direccin de cadena 2
; Compara cadenas
; Son iguales?
; No,, despliega mensaje

CAPCAD05:
Mov Dx, Offset TodoBIEN
; Cadenas son iguales
Mov Ah, 9
Int 21h
Jpm CAPCAD01
;-----------------------------------------------------------------------------; TERMINA EL PROGRAMA
;-----------------------------------------------------------------------------TERMINA:
Mov Ax, 4C00h
Int 21h
End Empieza

; Termina el programa sin errores.

;******************************************************************************
; Nombre del programa: OPERA.ASM
; Objetivo: Realizar operaciones de suma, resta, multiplicacin y divisin sobre dos cantidades
; enteras sin signo y no mayores de 65535.
;******************************************************************************
; COMANDO DE ENSAMBLE: Tasm OPERA;
; COMANDO DE ENLACE: TLink OPERA;
; COMANDO DE EJECUCION: OPERA [Enter]
;******************************************************************************
; NOTA: El objetivo es educativo y NO de optimizacin o de
; eficientar. Por favor, NO SE DESESPERE y estdielo.
;******************************************************************************
;-----------------------------------------------------------------------------; Define el MODELO DE MEMORIA
;-----------------------------------------------------------------------------.MODEL SMAL
;-----------------------------------------------------------------------------; Define el rea DE DATOS
;-----------------------------------------------------------------------------.Data
ErrorCAP DB 0 ; Bandera de error en la captura de las cantidades
Cantidad DB 0 ; La cantidad sobre la que se opera. Si es 0 se opera
; sobre la cantidad 1, si es 1 se opera sobre la
; cantidad 2.
CantUnoR DW 0
; Variable que guarda la cantidad 1 convertida a binario.
CantDosR DW 0
; Variable que guarda la cantidad 2 convertida a binario.
CantUnoN DB 6,0,6 DUP(?) ; Variable que almacena la cantidad 1
CantDosN DB 6,0,6 DUP(?)
; Variable que almacena la cantidad 2
Funcion DB 0
; Variable que guarda la funcin a realizar
Resulta DB 13,10,13,10,'El resultado es: $'
ResultaR DB 11 DUP('?')
Mensaje DB 'Bienvenidos a Opera, que le permite realizar las'
DB 13,10
DB 'operaciones BASICAS de MULTIPLICACION, DIVISION, SUMA'
DB 13,10,'y RESTA sobre dos cantidades enteras.' DB 13,10,13,10,'$'
Pregunta DB 13,10,13,10,'DIGITE:',13,10,13,10 DB ' (1) para MULTIPLICAR.',13,10 DB ' (2) para DIVIDIR.',13,10
DB ' (3) para SUMAR.',13,10
DB ' (4) para RESTAR.',13,10
DB ' (5) para TERMINAR.',13,10,'$'
Error DB 7,7,7,13,10,'ERROR : en la seleccion de las opciones.'
DB 13,10,13,10,'$'
Error1 DB 7,7,7,13,10,'ERROR : digito INVALIDO en CANTIDAD 1.'
DB 13,10,13,10,'$'
Error2 DB 7,7,7,13,10,'ERROR : digito INVALIDO en CANTIDAD 2.'
DB 13,10,13,10,'$'
Error3 DB 7,7,7,13,10,'ERROR : cantidad fuera de RANGO ( 65535).'
DB ' !!!.' DB 13,10,13,10,'$'
Error4 DB 7,7,7,13,10,'ERROR : intento de DIVISION por CERO.' DB 13,10,13,10,'$'
CantunoM DB 13,10,13,10,'Digite primer CANTIDAD (debe ser < a 65535)'

DB ' : $'
CantDosM DB 13,10,13,10,'Digite Segunda CANTIDAD (debe ser < a 65535)'
DB ' : $'
;-----------------------------------------------------------------------------; TABLA DE POTENCIAS USADA PARA CONVERTIR EL RESULTADO BINARIO DE LA
; OPERACIN EN FORMATO ASCII. SE USAN LAS POTENCIAS DE 10 (1, 10, 100, 1000
; y 10000), PORQUE EL NMERO MS GRANDE ES 65535. EN CASO DE QUE QUIERA
; OPERAR SOBRE NMEROS MS GRANDES, AMPLIE LA TABLA.
;-----------------------------------------------------------------------------Potencia DW 0001h, 000ah, 0064h, 03E8h, 2710h
PotenciaF DW $
;-----------------------------------------------------------------------------; Define el rea del Stack
;-----------------------------------------------------------------------------.STACK
;-----------------------------------------------------------------------------; Define el rea de cdigo
;-----------------------------------------------------------------------------.CODE
; rea de cdigo
;-----------------------------------------------------------------------------; Inicia programa
;-----------------------------------------------------------------------------Empieza:
; Etiqueta de comienzo de programa
;-----------------------------------------------------------------------------; BORRA LA PANTALLA CAMBIANDO LA MODALIDAD DE VIDEO. ESTA FORMA DE BORRAR
; LA PANTALLA ES MUY PECULIAR Y SE CONSIDERA COMO "TRUCO". SE BASA EN EL
; HECHO DE QUE AL CAMBIAR LA MODALIDAD DE VIDEO, EL PROPIO BIOS (HARDWARE)
; BORRA LA PANTALLA POR NOSOTROS. ES UN MTODO BURDO PERO MUY EFICIENTE.
;-----------------------------------------------------------------------------Mov Ah, 0Fh
; Obtiene la modalidad de video actual
Int 10h
Mov Ah, 0
; Cambia la modalidad de video que se obtuvo
Int 10h
Mov Ax,@Data
; Inicializa DS con la direccin de @Data
Mov Ds, Ax
Mov Dx, Offset Mensaje ; Despliega el mensaje de bienvenida
Call Imprime
Mov Si, Offset ResultaR ; Inicializa la variable ResultaR
Add Si, 11
Mov Al, '$'
Mov [Si], Al
;-----------------------------------------------------------------------------; SE DESPLIEGA EL MEN DE OPCIONES A ELEGIR. LA OPCIN ELEGIDA DEBE DE ESTAR
; COMPRENDIDA ENTRE 1 Y 5. ESTO ES VERIFICADO POR LAS INSTRUCCIONES CMP Y
; JAE (SALTA SI MAYOR O IGUAL A) Y JBE (SALTA SI MENOR O IGUAL A).
; NOTE QUE LA SELECCIN "NO ES DESPLEGADA A LA PANTALLA", ESO SE DEJA A SU
; CREATIVIDAD. SI EXISTE ALGUN ERROR, SE DESPLEGAR EL MENSAJE APROPIADO.
;-----------------------------------------------------------------------------OTRA:

Mov Dx, Offset Pregunta


Call Imprime
Call ObtenTecla
Cmp Al, 49
Jae SIGUE
Mov Dx, Offset Error
Call Imprime
Jmp OTRA
SIGUE:
Cmp Al, 53
Jbe TODOBIEN
Mov Dx, Offset Error
Call Imprime
Jmp OTRA

; Despliega men de opciones


; Espera a que el usuario seleccione la
; funcin a realizar (1 a 5)
; La seleccin del usuario es mayor o igual
; a 1 ?.
; NO, despliega mensaje de error

; La seleccin del usuario es menor o igual


; a 5?.
; NO, despliega mensaje de error

TODOBIEN:
Cmp Al, 53
Jnz CHECATODO
Jmp FUNCION5
CHECATODO:
Mov Funcion, Al
; Guarda la funcin a realizar
;-----------------------------------------------------------------------------; SE CAPTURAN LAS CANTIDADES Y SE GUARDAN EN SUS RESPECTIVAS VARIABLES PARA
; PODER TRABAJAR SOBRE ELLAS MAS ADELANTE. LA CAPTURA SE BASA EN LA FUNCIN
; 09 DE LA INT 21H. DICHA FUNCIN ESTABLECE QUE EL REGISTRO AH CONTENGA 09
; Y EL REGISTRO PAR DS:DX APUNTE A LA DIRECCIN DE LA VARIABLE QUE
; ALMACENAR LA ESTRUCTURA DEL BUFFER, EL CUAL DEBE ESTAR CONSTRUIDO DE LA
; SIGUIENTE MANERA:
;
; BYTE 1 = CANTIDAD DE BYTES POR LEER
; BYTE 2 = (LLENADO POR MS-DOS) ES LA CANTIDAD DE BYTES REALMENTE LEDOS.
; BYTE 3 = BUFFER DONDE SE ALMACENA EL RESULTADO; DEBE ENCONTRARSE
; INICIALIZADO CON LA MISMA CANTIDAD DE BYTES ESPECIFICADOS
; POR EL BYTE 1.
;
; LAS CANTIDADES CAPTURADAS REPRESENTAN UNA CADENA QUE ES NECESARIO
; CONVERTIR EN BINARIO ANTES DE QUE SE PUEDA OPERAR SOBRE ELLA. MS
; ADELANTE SER EVIDENTE LO ANTERIOR.
;-----------------------------------------------------------------------------;-----------------------------------------------------------------------------; CAPTURA PRIMER CANTIDAD.
;-----------------------------------------------------------------------------CAPCANT01:
Mov Dx, Offset CantUnoM
Call Imprime

; Mensaje de captura de cantidad 1

Mov Ah, 0Ah


Mov Dx, Offset CantUnoN
Int 21h
Mov ErrorCAP, 0
Mov Cantidad, 0
Call ConvNUM
Cmp ErrorCAP, 1
Jz CAPCANT01
Mov CantUnoR, Bx

; Captura la cantidad (hasta 8 dgitos)

; Supone que no hay errores y que se est


; operando sobre la cantidad 1.
; Convierte cantidad 1 a binario
; Hubo error?
; S, s, regresa a la captura
; Guarda resultado de conversin

;-----------------------------------------------------------------------------; CAPTURA SEGUNDA CANTIDAD.


;-----------------------------------------------------------------------------CAPCANT02:
Mov ErrorCAP, 0
; Supone que no hay error
Mov Cantidad, 1
; Indica a ConvNUM que es la segunda cantidad
Mov Dx, Offset CantDosM
; Mensaje de captura de cantidad 2
Call Imprime
Mov Ah, 0Ah
; Captura la segunda cantidad
Mov Dx, Offset CantDosN
Int 21h
Call ConvNUM
; Convierte cantidad 2 a binario
Cmp ErrorCAP, 1
; Hay error?
Jz CAPCANT02
; S, s, regresa a capturar la cantidad
Mov CantDosR, Bx
; Guarda conversin de cantidad 2
;-----------------------------------------------------------------------------; DESPUS DE CAPTURAR LAS DOS CANTIDADES SOBRE LAS CUALES SE VA A OPERAR,
; SE DEFINE CUL ES LA FUNCIN POR REALIZAR (MULTIPLICACIN, DIVISN, SUMA
; O RESTA).
;-----------------------------------------------------------------------------Mov Al, Funcion
; Funcin que seleccion el usuario
Cmp Al, 31h
; Es 1?
Jne FUNCION2
; No.
Call Multiplica
; Multiplica las dos cantidades
Jmp OTRA
FUNCION2:
Cmp Al, 32h
; Es 2?
Jne FUNCION3
; No.
Call Divide
; Divide las dos cantidades
Jmp OTRA
FUNCION3:
Cmp Al, 33h
Jne FUNCION4
Call Suma
Jmp OTRA
FUNCION4:
Cmp Al. 34h
Jne FUNCION5

; Es 3?
; No.
; Suma las dos cantidades

; Es 4?
; No.

Call Resta
; Resta las dos cantidades
Jmp OTRA
FUNCION5:
;-----------------------------------------------------------------------------; TERMINA EL PROGRAMA
;-----------------------------------------------------------------------------Mov Ax, 4C00h
; Termina el programa sin errores.
Int 21h
;******************************************************************************
;R UT I N A S DE S OP ORT E
;******************************************************************************
;-----------------------------------------------------------------------------; Rutina: Multiplica
; Propsito: Multiplica dos nmeros enteros sin signo
; Parmetros: En el registro AX el multiplicando y en BX el multiplicador
; Regresa: El resultado en el registro par DX:AX, que es desplegado en
; la pantalla.
;-----------------------------------------------------------------------------Multiplica Proc Near
Xor Dx, Dx
; Dx = 0 por si acaso
Mov Ax, CantUnoR
; Primera cantidad (multiplicando)
Mov Bx, CantDosR
; Segunda cantidad (multiplicador)
Mul Bx
; Multiplica
Call ConvASCII
; Convierte en ASCII
Mov Dx, Offset Resulta ; Prepara para desplegar la cadena del resultado
Call Imprime
;
Mov Dx, Offset ResultaR ; Despliega el resultado.
Call Imprime
Ret
Multiplica Endp
;-----------------------------------------------------------------------------; Rutina: Divide
; Propsito: Divide dos nmeros enteros sin signo
; Parmetros: En el registro AX el dividendo y en BX el divisor
; Regresa: El resultado en el registro par DX:AX, que es desplegado en
; la pantalla.
;-----------------------------------------------------------------------------Divide Proc Near
Mov Ax, CantUnoR
Mov Bx, CantDosR
Cmp Bx, 0
Jnz DIVIDE01
Mov Cantidad, 3
Call HuboERROR
Ret
DIVIDE01:
Div Bx

; Carga la cantidad 1 (dividendo)


; Carga la cantidad 2 (divisor)
; Revisa si el divisor es 0 para evitar un
; error de divisin por cero.
; Hubo error, as que despliega el mensaje y
; salta

; Divide

Xor Dx, Dx

; DX = 0. No se usa el residuo para simplificar


; las operaciones
; Convierte en ASCII
; Despliega la cadena del resultado

Call ConvASCII
Mov Dx, Offset Resulta
Call Imprime
Mov Dx, Offset ResultaR ; Despliega el resultado
Call Imprime
Ret
Divide Endp
;-----------------------------------------------------------------------------; Rutina: Suma
; Propsito: Suma dos nmeros enteros sin signo
; Parmetros: En el registro AX el primer nmero y en BX el segundo
; Regresa: El resultado en el registro par DX:AX, que es desplegado en
; la pantalla.
;-----------------------------------------------------------------------------Suma Proc Near
Xor Dx, Dx
; DX = 0 por si acaso existe acarreo
Mov Ax, CantUnoR
; Primera cantidad
Mov Bx, CantDosR
; Segunda cantidad
Add Ax, Bx
; suma
Jnc SUMACONV
; Hubo acarreo?
Adc Dx, 0
; Si.
SUMACONV:
Call ConvASCII
; Convierte resultado en ASCII
Mov Dx, Offset Resulta
; Despliega cadena del resultado
Call Imprime
Mov Dx, Offset ResultaR
; Despliega el resultado
Call Imprime
Ret
Suma Endp
;-----------------------------------------------------------------------------; Rutina: Resta
; Propsito: Resta dos nmeros enteros sin signo
; Parmetros : En el registro AX el primer nmero y en BX el segundo
; Regresa: El resultado en el registro par DX:AX, que es desplegado en la pantalla.
;-----------------------------------------------------------------------------Resta Proc Near
Xor Dx, Dx
; DX = 0 por si acaso existe acarreo
Mov Ax, CantUnoR
; Primera cantidad
Mov Bx, CantDosR
; Segunda cantidad
Sub Ax, Bx
; Resta cantidades
Jnc RESTACONV
; Hubo acarreo?
Sbb Dx, 0
; Si.
RESTACONV:
Call ConvASCII
; Convierte en ASCII
Mov Dx, Offset Resulta
; Despliega cadena del resultado
Call Imprime
Mov Dx, Offset ResultaR ; Despliega el resultado
Call Imprime

Ret
Resta Endp
;-----------------------------------------------------------------------------; Rutina: Imprime
; Propsito: Despliega una cadena
; Parmetros: El registro DX contiene el desplazamiento de la cadena
; Regresa: Nada
;-----------------------------------------------------------------------------Imprime Proc Near
Mov Ah, 9
Int 21h
Ret
Imprime Endp

; Prepara para desplegar la cadena a travs de la


; INT 21h.

;-----------------------------------------------------------------------------; Rutina: ObtnTecla


; Propsito: Espera a que el usuario digite una tecla
; Parmetros: Ninguno
; Regresa: En el registro AL el cdigo ASCII de la tecla
;-----------------------------------------------------------------------------ObtenTecla Proc Near
Mov Ah, 0
; Lee una tecla del teclado a travs de la INT 16h
Int 16h
Ret
ObtenTecla Endp
;-----------------------------------------------------------------------------; Rutina: ConvNUM
; Propsito: Convertir una cadena a un entero largo
; Parmetros: La longitud de la cadena y la direccin de la misma, y se
; pasan a la pila.
; Regresa: En el registro BX la cadena convertida en un entero
;-----------------------------------------------------------------------------ConvNUM Proc Near
Mov Dx, 0Ah
; Multiplicador es 10
Cmp Cantidad, 0
; Es la cantidad 1?
Jnz CONVNUM01
; NO, as que es la cantidad 2
Mov Di, Offset CantUnoN + 1
; Bytes ledos de la cantidad 1
Mov Cx, [Di]
Mov Si, Offset CantUnoN + 2
; La cantidad 1
Jmp CONVNUM02
CONVNUM01:
Mov Di, Offset CantDosN + 1
Mov Cx, [Di]
Mov Si, Offset CantDosN + 2
CONVNUM02:

; Bytes ledos de la cantidad 2


; La cantidad 2

Xor Ch, Ch
Mov Di, Offset Potencia
Dec Si
Add Si, Cx
Xor Bx, Bx
Std

CONVNUM03:
Lodsb

Cmp AL,"0"
Jb CONVNUM04
Cmp AL,"9"
Ja CONVNUM04
Sub Al, 30h
Cbw
Mov Dx, [Di]
Mul Dx
Jc CONVNUM05
Add Bx, Ax
Jc CONVNUM05
Add Di, 2
Loop CONVNUM03
Jpm CONVNUM06
CONVNUM04:
Call HuboERROR
Jpm CONVNUM06
CONVNUM05:
Mov Cantidad, 2
Call HuboERROR
CONVNUM06:
Cld
Ret
ConvNum Endp

; CH = 0
; Direccin de la tabla de potencias
; Posiciona SI en el primer byte de la
; cadena capturada y le suma el
; desplazamiento de bytes ledos
; para que podamos posicionarnos en el
; final de la misma (apunta al ltimo
; dgito capturado). BX = 0 y lee la
; cadena en forma inversa; es decir, de
; atrs hacia adelante.

; Levanta un byte del nmero (esta instruccin indica


; que el registro AL ser cargado con el contenido
; de la direccin apuntada por DS:SI).
; Es menor a 0? (entonces NO es un dgito vlido)
; S, despliega el mensaje de error y termina
; Es mayor a 9? (entonces NO es un dgito vlido)
; S, despliega el error y salta
; Convierte el dgito de ASCII a binario
; Convierte a palabra
; Obtiene la potencia de 10 que ser usada para
; multiplicar, multiplica nmero y lo suma
; a BX. Revisa si hubo acarreo, y si lo hubo, esto
; significa que la cantidad es > 65535.
; Si hay acarreo la cantidad es > 65535
; Va a la siguiente potencia de 10
; Itera hasta que CX sea = 0

; Algo ocurri, despliega mensaje y salta

; Hubo acarreo en la conversin, por lo tanto la


; cantidad capturada es mayor a 65535.

; Regresa la bandera de direccin a su estado normal


; y REGRESA.

;-----------------------------------------------------------------------------; Rutina: ConvASCII


; Propsito: Convertir un valor binario en ASCII
; Parmetros: El registro par DX:AX
; Regresa: Nada, pero almacena el resultado en el buffer ResultaR
;------------------------------------------------------------------------------

ConvASCII Proc Near


;-----------------------------------------------------------------------------; Lo primero que se hace es inicializar la variable que contendr el
; resultado de la conversin.
;-----------------------------------------------------------------------------Push Dx
Push Ax
; Guarda el resultado
Mov Si, Offset ResultaR ; Inicializa la variable ResultaR llenndola
Mov Cx, 10
; con asteriscos
Mov Al, '*'
ConvASCII01:
Mov [Si], Al
Inc Si
Loop ConvASCII01
Pop Ax
Pop Dx
Mov Bx, Ax
Mov Ax, Dx
Mov Si,Offset ResultaR
Add Si, 11
Mov CX, 10
OBTENDIGITO:
Dec Si
Xor Dx, Dx
Div Cx
Mov Di, Ax
Mov Ax, Bx
Div Cx
Mov Bx, Ax
Mov Ax, Di
Add Dl,30h
Mov [Si], Dl
Or Ax, Ax
Jnz OBTENDIGITO
Or Bx, Bx
Jnz OBTENDIGITO
Ret
ConvASCII Endp

; Palabra baja de la cantidad


; Palabra alta de la cantidad
; Cadena donde se guardar el resultado
; Divisor = 10

; DX contendr el residuo
; Divide la palabra alta (AX)
; Guarda cociente (AX)
; AX = palabra baja (BX)
; DX tena un residuo de la divisin anterior
; Guarda el cociente
; Regresa la palabra alta
; Convierte residuo en ASCII
; Lo almacena
; Palabra alta es 0?
; No, , sigue procesando
; Palabra baja es 0?
; No,, sigue procesando

;-----------------------------------------------------------------------------; Rutina: HuboERROR


; Propsito: Desplegar el mensaje de error adecuado.
; Parmetros: Nada
; Regresa: Nada
;-----------------------------------------------------------------------------HuboERROR Proc Near
Cmp Cantidad, 0

; Es la cantidad 1?

Jnz HUBOERROR02
Mov Dx, Offset Error1
Call Imprime
Mov ErrorCAP, 1
Jmp HUBOERROR05
HUBOERROR02:
Cmp Cantidad, 1
Jnz HUBOERROR03
Mov Dx, Offset Error2
Call Imprime
Mov ErrorCAP, 1
Jmp HUBOERROR05
HUBOERROR03:
Cmp Cantidad, 2
Jnz HUBOERROR04
Mov Dx, Offset Error3
Call Imprime
Mov ErrorCAP, 1
Jmp HUBOERROR05
HUBOERROR04:
Mov Dx, Offset Error4
Call Imprime
Mov ErrorCAP, 1

; No.

; Enciende la bandera de error

; Es la cantidad 2?
; No.

; Cantidad capturada est fuera de rango?


; No

; Error de intento de divisin por cero

HUBOERROR05:
Ret
HuboERROR Endp
;-----------------------------------------------------------------------------; Termina programa
;-----------------------------------------------------------------------------End Empieza
PRODUCTOS ENTREGABLES:
Reporte de la prctica

V. EVALUACIN
RBRICA:
Programas funcionando ---------------------------------------- 20%
Realizacin de prctica en el laboratorio --------------------- 30%
Elaboracin y entrega del reporte de la prctica ----------- 30%
Entrega de conclusiones personales ------------------------- 20%

VI. FORMATO DEL REPORTE


1. Portada
2. ndice
3. Introduccin
4. Marco terico
5. Desarrollo
6. Resultados
7. Conclusiones
8. Bibliografa

You might also like