Está en la página 1de 24

Arquitectura de Procesadores I Ing.

Ral Hinojosa

Descripcin del Lenguaje Ensamblador

Los programas fuente escritos utilizan un formato para su escritura.


El formato que utiliza INTEL, divide cada lnea del lenguaje ensamblador en los siguientes
campos:

ETIQUETA COD. DE OP. OPERANDO COMENTARIOS

El campo de etiqueta es opcional y representa el nombre de la lnea.


Generalmente las lneas que son el destino de salto o bifurcaciones tendrn entradas
en el campo de etiqueta.
El campo de cdigo de Operacin, contiene el nemotcnico del cdigo de operacin
de la instruccin que se va a ejecutar.
El campo de operando, da el dato con el que se va a operar el cdigo de operacin
especificado. El campo de operando, a veces se denomina argumento.
El campo de comentarios puede contener informacin til para explicar la funcin
de la instruccin . Los comentarios son opcionales, pero su uso documenta el
programa.

Ejemplo:
DATA MOV A, M ; ENTRAR DATO AL ACUMULADOR

1. Etiqueta: Contiene la entrada DATA. Este es el <<nombre>> de esta lnea.


Probablemente es el destino de una instruccin de bifurcacin posterior o anterior.
2. Cdigo de operacin. Contiene la entrada MOV, esta dice a la CPU que es una
instruccin de transferencia de datos. La CPU entonces busca el siguiente campo de
operando para encontrar la fuente y destino de la transferencia del dato.

1
Arquitectura de Procesadores I Ing. Ral Hinojosa

3. Campo de operando. Contiene la entrada A, es (acumulador) el destino del dato


mientras que la memoria M es la fuente. La posicin esta indicada por el registro
par HL de esta instruccin de registro directo.
4. Campo comentario. Contiene la entrada <<entrar datos al acumulador>>, este
campo describe que ocurre cuando se ejecuta la instruccin. En este caso, el dato es
introducido en el acumulador desde una posicin de MEM sealada por el registro
par HL. El punto y coma (;) se utiliza como delimitador para separar el campo del
operando del campo de comentario.

Escritura de un Programa en Assembler

Los puntos para desarrollar un programa pueden resumirse como sigue:

1. Definir y analizar el problema.


2. Dibujar el diagrama de flujo de la solucin del problema.
3. Escribir el programa en lenguaje ensamblador
4. Generar la versin en lenguaje maquina del programa
5. Depurar el programa
6. Documentar el programa.

Procedimientos para crear un programa en ensamblador

Son varios los procedimientos que pueden seguir en la creacin de un programa en


ensamblador, uno de ellos puede ser como se indica.

1. Se elige un editor de textos sin formato ( Edit del D.O.S. por ejemplo, con el Word
pero se graba como TEXTO modo D.O.S.)
2. Se crea un archivo con <<nombre>> con una extensin ASM.
Ejem1.asm

2
Arquitectura de Procesadores I Ing. Ral Hinojosa

3. Se escribe en el archivo todo el programa en formato ensamblador y posteriormente


se graba con el mismo nombre.
4. Se copia el archivo creado (ejem1.asm) en la carpeta BIN del programa MASM.
5. Se ensambla el programa de la siguiente manera.
C:\MASM <<nombre del archivo>>
C:\MASM ejem1.asm
Al ejecutarse el MASM, esta va a ensamblar el cdigo fuente y generar el cdigo
objeto.
6. Si la compilacin fue realizada sin problemas, se tendr un mensaje como el
siguiente:

Mircrosoft Compatibility Driver


Copyright Microsoft Corp 1984 1992. All rights reserved
Invoking: ML.exe /I. /Zm /c /Ta ejem1.asm
Microsoft macro Assembler Versin 6.10
Invoking: ML.exe /I. /Zm /c /Ta ejemplo.asm
Copyright Microsoft Corp 1984 1992. All rights reserved

Assembling: ejem1.asm

7. En el siguiente paso, se hace el enlace con las libreras internas y se crea el archivo
ejecutable, de la siguiente manera:

C:\MASM\BIN> LINK ejem1 <enter>


El linker se encarga de asignar localidades de memoria absolutas para relocalizar al
cdigo objeto. Tambin permite el desarrollo de cdigos modulares ya que con l es
posible cambiar mdulos individuales y para producir un programa completo.

3
Arquitectura de Procesadores I Ing. Ral Hinojosa

8. Si al crear el enlace no hubo problemas, se tendr un mensaje como el siguiente:

Mircrosoft Segmented Executable Linker Versin 5.31.009 Jul 13 1992


Copyright Microsoft Corp 1984 1992. All rights reserved

Run File [ejem1.exe]:


List File [nul.map]:
Libraries [.lib]:
Definitions Files [nul.def]:

9. De esta manera se ha creado un archivo ejecutable con extensin EXE, el cual


ejecutar el programa que se escribio.

10. Despus que se tiene el programa se puede emplear el DEBUG.


Este programa es til durante la fase de desarrollo de programas. Tiene
caractersticas que permiten al usuario ejecutar, por ejemplo un programa paso a
paso y examinar dinmicamente como cambia la memoria, tambin permite
observar las banderas y la ejecucin del programa desde un punto determinado
(break point) monitorenado los registros.
Emplee DEBUG /? Para ver los comandos adicionales que se pueden escribir

11. El MASM, tiene incorporado un programa PWB.exe que permite tambien hacer el
seguimiento de un programa al igual que el DEBUG. Ejecute el programa PWB y abra un
archivo, y emplee la barra del menu para ejecutar el programa seleccionado (ejem1.asm)

El siguiente es el programa ejem1.asm, escrito en forma de texto sin formato:

4
Arquitectura de Procesadores I Ing. Ral Hinojosa

;************************************************************************
; Objetivo : Desplegar una cadena
;************************************************************************
; COMANDO DE ENSAMBLE : MASM EJEM1;
; COMANDO DE ENLACE : LINK EJEM1;
; COMANDO DE EJECUCION : EJEM1 [Enter]
;************************************************************************
;
; Define el modelo de memoria
;
CODE SEGMENT PUBLIC 'CODE'
ORG 100H
ASSUME CS:CODE, ES:CODE, DS:CODE, SS:CODE

Empieza: ; Etiqueta de comienzo de programa

Jmp Codigo

Mensaje Db 'BIENVENIDOS AL LENGUAJE ENSAMBLADOR !!!!!.$'

Codigo:
mov Dx, offset Mensaje ; Direccion de Mensaje
mov Ah, 9 ; en Dx para poder desplegarlo
Int 21h ; a traves de la Int 21 de MS-DOS.
mov ax,4c00h ; Regresa a MS-DOS por medio de la
int 21h ; funcion 4c.
CODE ENDS
END Empieza ; Fin del programa

Al compilarlo y enlazarlo dar un mensaje en la pantalla de:

BIENVENIDOS AL LENGUAJE ENSAMBLADOR !!!!!.

.............................

Escribir cada uno de los ejemplos proporcionados y estudiarlos para ver su funcionamiento.

Ejem2.asm
Ejem3.asm
Ejem4.asm
Ejem5.asm

Ejemplo 2

5
Arquitectura de Procesadores I Ing. Ral Hinojosa

;*************************************************************************
; Objetivo : Programa sin DIRECTIVAS SIMPLIFICADAS
;*************************************************************************
; COMANDO DE ENSAMBLE : MASM EJEM2.ASM;
; COMANDO DE ENLACE : LINK EJEM2;
; COMANDO DE EJECUCION : EJEM2 [Enter]
;*************************************************************************

;--------------------------------------------------------------------------
; La siguiente linea especifica el segmento que contendra
; el bloque codigo.
;--------------------------------------------------------------------------

CODE SEGMENT PUBLIC 'CODE' ; Segmento de codigo

;--------------------------------------------------------------------------
; La siguiente linea le indica al ensamblador el nombre del
; segmento que cada registro de segmentos debe direccionar.
;--------------------------------------------------------------------------

ASSUME CS:CODE, DS:CODE, ES:CODE, SS:STACK

; Empieza el codigo.

Empieza:

Mov Ax, 4C00h


Int 21h

;--------------------------------------------------------------------------
; La siguiente linea le indica al ensamblador que termina
; el segmento de codigo 'CODE'.
;--------------------------------------------------------------------------

CODE ENDS

;--------------------------------------------------------------------------
; El segmento STACK es el rea que usar la pila .
;--------------------------------------------------------------------------

STACK SEGMENT PARA STACK 'STACK'


Dw 64 DUP (?)
STACK ENDS

;--------------------------------------------------------------------------
; Se cierra el bloque de codigo. Es decir, termina el programa.
;--------------------------------------------------------------------------

6
Arquitectura de Procesadores I Ing. Ral Hinojosa

END Empieza

Ejemplo 03
;*************************************************************************
; Objetivo : Despliega el titulo del programa y los numeros
; hexadecimales correspondientes del 15 al 1 en
; forma de escalera.
;*************************************************************************
; COMANDO DE ENSAMBLE : Masm EJEM3;
; COMANDO DE ENLACE : Link EJEM3;
; COMANDO DE EJECUCION : EJEM3 [Enter]
;*************************************************************************

; --------------------------------------------------------------------
; INICIA EL PROGRAMA. SE DEFINE EL MODELO DE MEMORIA A USAR Y EL
; SEGMENTO DE CODIGO
; --------------------------------------------------------------------

.MODEL SMALL ; Modelo de memoria


.CODE ; Area de codigo

Empieza: ; Etiqueta de comienzo de programa

Mov Ax, @Data ; Permite el acceso a los datos inicializando


Mov Ds, Ax ; el registro DS con la direccion adecuada.
Mov Dx, OFFSET Mensaje ; Carga la direccion de mensaje a DX para
Mov Ah, 9 ; poder desplegarlo con la funcion 9 de la
Int 21h ; Int 21h (DS:DX contiene la direccion de
; la cadena que se desplegar ).
Mov Cx, 15 ; Contador de los numeros (van a ser 15).
Mov Bx, OFFSET Tabla ; Permite el acceso a la tabla de equivalencias
; hexadecimales inicializando su direccion
; y apuntando al primer elemento.
Itera: ; Etiqueta controladora de las iteraciones
Mov Al, Cl ; Pone en Al el numero a traducir
Xlat ; (empezando desde 15) y lo traduce.
Mov Dl, Al ; Prepara para desplegar el numero usando la
Mov Ah, 2 ; funcion 2 de la Int 21h. Dl debe de tener
Int 21h ; el caracter a ser desplegado.
Mov Dl, 10 ; Salta una linea dando un efecto de
Int 21h ; escalera. De nuevo se usa la funcion 2.
Loop Itera ; Itera hasta llegar a 0 (de 15 a 0). El
; registro CX mantiene una cuenta activa de
; las veces que se ha iterado, y al completar

7
Arquitectura de Procesadores I Ing. Ral Hinojosa

; un ciclo se decrementa en uno hasta llegar


; a cero.
Mov ax,4c00h ; Regresa a MS-DOS por medio de la funcion
; 4c de la interrupcion 21h.
int 21h ; El codigo de regreso es 0 porque no hubo
; error. En caso de existir se podria pasar
; un codigo diferente a 0 (ej. 4c01h).

; --------------------------------------------------------------------
; INICIA SEGMENTO DE DATOS
; --------------------------------------------------------------------

.DATA ; Segmento de datos

Mensaje DB 13,10,13,10
DB 'Desplegando los numeros hexadecimales del 15 al 1'
DB 13,10,13,10,'$' ; Cadena a desplegar
Tabla DB '0123456789ABCDEF'; Tabla de traduccion

; --------------------------------------------------------------------
; INICIA SEGMENTO DE PILA
; --------------------------------------------------------------------

.STACK ; Se necesita una PILA.


END Empieza ; Fin del programa

Ejemplo 04
;*************************************************************************
; Objetivo : Captura dos cadenas y las compara, reportando si
; son iguales o no. La cantidad de caracteres a
; comparar esta dada por los caracteres realmente
; leidos de la cadena 1. Es decir, para que se
; consideren iguales, las dos cadenas deben ser de
; la misma longitud. El programa distingue entre
; mayusculas y minusculas. La "A" es diferente de "a".
; Con un poco m s de creatividad, este programa se
; puede ampliar para que busque una cadena dentro de
; otra y reporte si existe o no.
;*************************************************************************
; COMANDO DE ENSAMBLE : Masm EJEM4;
; COMANDO DE ENLACE : Link EJEM4;
; COMANDO DE EJECUCION : EJEM4 [Enter]
;*************************************************************************
;
; NOTA : procure usar SOLO las instrucciones que se han visto o explicado.

8
Arquitectura de Procesadores I Ing. Ral Hinojosa

; El procedimiento (objetivo) es con fines educativos y NO de


; optimizacin o eficiencia. Por favor, NO SE DESESPERE y estdielo.
;*************************************************************************

; Define el modelo de memoria

.MODEL SMALL

.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 al EJEM4.'
DB ' Programa ejemplo que compara'
DB ' dos cadenas y reporta si son iguales o no.'
DB ' Para terminar digite FIN en maysculas.'
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: $'

.CODE ; Area 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 METODO BURDO
PERO MUY
; EFICIENTE.
;------------------------------------------------------------------------------

Mov Ah, 0Fh ; Obtiene modalidad de video actual


Int 10h
Mov Ah, 0 ; Cambia a la modalidad de video que se obtuvo
Int 10h

9
Arquitectura de Procesadores I Ing. Ral Hinojosa

mov Ax,@Data ; Inicializa DS con la direccin de @Data


mov Ds, Ax
mov Dx, Offset Mensaje ; Despliega el mensaje de bienvenida
Mov Ah, 9
Int 21h
Push Ds
Pop Es ; 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 FUNCION
; 09 DE LA INT 21H. DICHA FUNCION ESTABLECE QUE EL REGISTRO AH
CONTENGA 09
; Y EL REGISTRO PAR DS:DX APUNTE A LA DIRECCION DE LA VARIABLE QUE
; ALMACENARA LA ESTRUCTURA DEL BUFFER. ESTE 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
; LEIDOS.
; 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
; QUEDARA CLARO LO ANTERIOR.
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; CAPTURA PRIMER CADENA
;------------------------------------------------------------------------------

CAPCAD01:
Mov Dx, Offset CadUnoM ; Mensaje de captura de cadena 1
Mov Ah, 9
Int 21h
Mov Ah, 0Ah ; Captura la cantidad (hasta 15 bytes)
Mov Dx, Offset Cadena1
Push Dx ; Guarda direccion de variable
Int 21h

10
Arquitectura de Procesadores I Ing. Ral Hinojosa

Pop Dx
Inc Dx ; Obtiene cantidad de bytes realmente leidos
; que se encuentra en el byte 1 del buffer
Mov Si, Dx
Cmp Byte ptr [Si], 0 ; Es 0?
Jnz CAPCAD02 ; No, asi que prosigue
Mov Dx, Offset Error1 ; Despliega mensaje de error y captura la
Mov Ah, 9 ; cadena de nuevo
Int 21h
Jmp CAPCAD01

;------------------------------------------------------------------------------
; 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 MAYUSCULAS.
;------------------------------------------------------------------------------

CAPCAD02:
Inc Dx ; Primer byte del buffer de CADENA 1
Mov Cx, 3 ; Vamos a revisar 3 bytes.
Mov Si, Dx ; Cadena capturada
Mov Di, Offset Final ; Mensaje de final
Repe Cmpsb ; Digitaron "FIN"?
Jcxz TERMINA ; Si; asi que 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 direccion de variable
Int 21h
Pop Dx
Inc Dx ; Obtiene cantidad de bytes realmente leidos
; que se encuentra en el byte 1 del buffer
Mov Si, Dx
Cmp Byte ptr [Si], 0 ; Es 0?
Jnz CAPCAD04 ; No, as que prosigue
Mov Dx, Offset Error1 ; Despliega mensaje de error y captura la
Mov Ah, 9 ; cadena de nuevo
Int 21h
Jmp CAPCAD03

11
Arquitectura de Procesadores I Ing. Ral Hinojosa

;------------------------------------------------------------------------------
; YA SE TIENEN LAS DOS CADENAS CAPTURADAS, AHORA PROCEDEMOS A
COMPARARLAS Y
; DESPLEGAR EL MENSAJE ADECUADO.
;------------------------------------------------------------------------------

CAPCAD04:
Xor Ch, Ch ; CH = 0 por si acaso.
Mov Si, Offset Cadena1 + 1 ; Bytes realmente ledos de cadena 1
Mov Cl, byte ptr [Si] ; Cx tiene bytes ledos de cadena 1
Inc Cl ; 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.
Inc Si ; Regresa a direccin de cadena 1
Mov Di, Offset Cadena2 + 2 ; Direccin de cadena 2
Cld
Repe Cmpsb ; Compara cadenas
Jcxz CAPCAD05 ; Son iguales?
Mov Dx, Offset Error ; No, despliega mensaje
Mov Ah, 9
Int 21h
Jmp CAPCAD01

CAPCAD05:
Mov Dx, Offset TodoBIEN ; Cadenas son iguales
Mov Ah, 9
Int 21h
Jmp CAPCAD01
;------------------------------------------------------------------------------
; TERMINA EL PROGRAMA
;------------------------------------------------------------------------------

TERMINA:
Mov Ax, 4C00h ; Termina el programa sin errores.
Int 21h

.STACK
End Empieza

Ejemplo 05
;*************************************************************************
; Objetivo : Realizar operaciones de suma, resta,
; multiplicacion y division sobre dos cantidades

12
Arquitectura de Procesadores I Ing. Ral Hinojosa

; enteras sin signo y no mayores de 65535.


;*************************************************************************
; COMANDO DE ENSAMBLE : Masm EJEM5;
; COMANDO DE ENLACE : Link EJEM5;
; COMANDO DE EJECUCION : EJEM5 [Enter]
;*************************************************************************
; NOTA : se procura usar SOLO las instrucciones que se han visto o explicado.
; El objetivo es educativo y NO de optimizacin o
; eficientar. Por favor, NO SE DESESPERE y estdielo.
;*************************************************************************

; Define el modelo de memoria

.MODEL SMALL

.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 EJEM5, 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 seleccin de las opciones.'
DB 13,10,13,10,'$'
Error1 DB 7,7,7,13,10,'ERROR : dgito INVALIDO en CANTIDAD 1.'
DB 13,10,13,10,'$'
Error2 DB 7,7,7,13,10,'ERROR : dgito INVALIDO en CANTIDAD 2.'
DB 13,10,13,10,'$'
Error3 DB 7,7,7,13,10,'ERROR : cantidad fuera de RANGO ( 65535).'
DB ' !!!.'

13
Arquitectura de Procesadores I Ing. Ral Hinojosa

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
; OPERACION EN FORMATO ASCII. SE USAN LAS POTENCIAS DE 10 (1, 10, 100,
1000
; y 10000), PORQUE EL NUMERO MAS GRANDE ES 65535. EN CASO DE QUE
QUIERA
; OPERAR SOBRE NUMEROS MAS GRANDES AMPLIE LA TABLA.
;------------------------------------------------------------------------------

Potencia DW 0001h, 000ah, 0064h, 03E8h, 2710h


PotenciaF DW $

.CODE ; Area 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 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 METODO 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

14
Arquitectura de Procesadores I Ing. Ral Hinojosa

Add Si, 11
Mov Al, '$'
Mov [Si], Al

;------------------------------------------------------------------------------
; SE DESPLIEGA EL MENU DE OPCIONES A ELEGIR. LA OPCION 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 SELECCION "NO ES DEPLEGADA A LA PANTALLA", ESO SE
DEJA A SU
; CREATIVIDAD. SI EXISTE ALGUN ERROR, SE DESPLEGARA EL MENSAJE
APROPIADO.
;------------------------------------------------------------------------------

OTRA:
Mov Dx, Offset Pregunta ; Despliega men de opciones
Call Imprime
Call ObtenTecla ; Espera a que el usuario seleccione la
; funcin a realizar (1 a 5)
Cmp Al, 49 ; La seleccin del usuario es mayor o igual
Jae SIGUE ; a 1 ?.
Mov Dx, Offset Error ; NO, despliega mensaje de error
Call Imprime
Jmp OTRA

SIGUE:
Cmp Al, 53 ; La seleccin del usuario es menor o igual
Jbe TODOBIEN ; a 5?.
Mov Dx, Offset Error ; NO, despliega mensaje de error
Call Imprime
Jmp OTRA

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 FUNCION

15
Arquitectura de Procesadores I Ing. Ral Hinojosa

; 09 DE LA INT 21H. DICHA FUNCION ESTABLECE QUE EL REGISTRO AH


CONTENGA 09
; Y EL REGISTRO PAR DS:DX APUNTE A LA DIRECCION DE LA VARIABLE QUE
; ALMACENARA 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 LEIDOS.
; BYTE 3 = BUFFER DON DE 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.
MAS
; ADELANTE SERA EVIDENTE LO ANTERIOR.
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; CAPTURA PRIMER CANTIDAD.
;------------------------------------------------------------------------------

CAPCANT01:
Mov Dx, Offset CantUnoM ; Mensaje de captura de cantidad 1
Call Imprime
Mov Ah, 0Ah ; Captura la cantidad (hasta 8 dgitos)
Mov Dx, Offset CantUnoN
Int 21h
Mov ErrorCAP, 0 ; Supone que no hay errores y que se est
Mov Cantidad, 0 ; operando sobre la cantidad 1.
Call ConvNUM ; Convierte cantidad 1 a binario
Cmp ErrorCAP, 1 ; Hubo error?
Jz CAPCANT01 ; S, regresa a la captura
Mov CantUnoR, Bx ; 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

16
Arquitectura de Procesadores I Ing. Ral Hinojosa

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, regresa a capturar la cantidad
Mov CantDosR, Bx ; Guarda conversin de cantidad 2

;------------------------------------------------------------------------------
; DESPUES DE CAPTURAR LAS DOS CANTIDADES SOBRE LAS CUALES SE VA A
OPERAR,
; SE DEFINE CUAL ES LA FUNCION POR REALIZAR (MULTIPLICACION,
DIVISION, 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 ; Es 3?
Jne FUNCION4 ; No.
Call Suma ; Suma las dos cantidades
Jmp OTRA

FUNCION4:
Cmp Al, 34h ; Es 4?
Jne FUNCION5 ; No.
Call Resta ; Resta las dos cantidades
Jmp OTRA
FUNCION5:

;------------------------------------------------------------------------------
; TERMINA EL PROGRAMA
;------------------------------------------------------------------------------

Mov Ax, 4C00h ; Termina el programa sin errores.

17
Arquitectura de Procesadores I Ing. Ral Hinojosa

Int 21h

;*************************************************************************
; RUTINAS DE SOPORTE
;*************************************************************************

;------------------------------------------------------------------------------
; Rutina : Multiplica
; Propsito : Multiplica dos nmeros enteros sin signo
; Par metros : 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
Call Imprime ; resultado
Mov Dx, Offset ResultaR ; Despliega el resultado.
Call Imprime
Ret
Multiplica Endp

;------------------------------------------------------------------------------
; Rutina : Divide
; Propsito : Divide dos nmeros enteros sin signo
; Par metros : 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 ; Carga la cantidad 1 (dividendo)


Mov Bx, CantDosR ; Carga la cantidad 2 (divisor)
Cmp Bx, 0 ; Revisa si el divisor es 0 para evitar un
; error de divisin por cero.
Jnz DIVIDE01
Mov Cantidad, 3 ; Hubo error, as que despliega el mensaje y
; salta
Call HuboERROR
Ret
DIVIDE01:

18
Arquitectura de Procesadores I Ing. Ral Hinojosa

Div Bx ; Divide
Xor Dx, Dx ; Dx = 0. No se usa el residuo para simplificar
; las operaciones
Call ConvASCII ; Convierte en ASCII
Mov Dx, Offset Resulta ; Despliega la cadena del resultado
Call Imprime
Mov Dx, Offset ResultaR ; Despliega el resultado
Call Imprime
Ret
Divide Endp

;------------------------------------------------------------------------------
; Rutina : Suma
; Propsito : Suma dos nmeros enteros sin signo
; Par metros : 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 ; S.
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
; Par metros : 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

19
Arquitectura de Procesadores I Ing. Ral Hinojosa

Sub Ax, Bx ; Resta cantidades


Jnc RESTACONV ; Hubo acarreo?
Sbb Dx, 0 ; S.
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
; Par metros : El registro DX contiene el desplazamiento de la cadena
; Regresa : Nada
;------------------------------------------------------------------------------

Imprime Proc Near


Mov Ah, 9 ; Prepara para desplegar la cadena a travs de la
Int 21h ; INT 21h.
Ret
Imprime Endp

;------------------------------------------------------------------------------
; Rutina : ObtnTecla
; Propsito : Espera a que el usuario digite una tecla
; Par metros : 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
; Par metros : 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

20
Arquitectura de Procesadores I Ing. Ral Hinojosa

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 ; Bytes ledos de la cantidad 2
Mov Cx, [Di]
Mov Si, Offset CantDosN + 2 ; La cantidad 2

CONVNUM02:
Xor Ch, Ch ; CH = 0
Mov Di, Offset Potencia ; Direccin de la tabla de potencias
Dec Si ; Posiciona Si en el primer byte de la
Add Si, Cx ; cadena capturada y le suma el
Xor Bx, Bx ; desplazamiento de bytes ledos
Std ; 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
; atr s hacia adelante.

CONVNUM03:
Lodsb ; Levanta un byte del nmero (esta instruccin indica
; que el registro AL ser cargado con el contenido
; de la direccin apuntada por DS:SI.
Cmp AL,"0" ; Es menor a 0? (entonces NO es un dgito v lido)
Jb CONVNUM04 ; S, despliega el mensaje de error y termina
Cmp AL,"9" ; Es mayor a 9? (entonces NO es un dgito v lido)
Ja CONVNUM04 ; S, despliega el error y salta
Sub Al, 30h ; Convierte el dgito de ASCII a binario
Cbw ; Convierte a palabra
Mov Dx, [Di] ; Obtiene la potencia de 10 que ser usada para
Mul Dx ; multiplicar, multiplica nmero y lo suma
Jc CONVNUM05 ; a BX. Revisa si hubo acarreo, y si lo hubo, sto
Add Bx, Ax ; significa que la cantidad es > 65535.
Jc CONVNUM05 ; Si hay acarreo la cantidad es > 65535
Add Di, 2 ; Va a la siguiente potencia de 10
Loop CONVNUM03 ; Itera hasta que CX sea = 0
Jmp CONVNUM06

CONVNUM04:
Call HuboERROR ; Algo ocurri, despliega mensaje y salta
Jmp CONVNUM06

21
Arquitectura de Procesadores I Ing. Ral Hinojosa

CONVNUM05:
Mov Cantidad, 2 ; Hubo acarreo en la conversin, por lo tanto la
Call HuboERROR ; cantidad capturada es mayor a 65535.

CONVNUM06:
Cld ; Regresa la bandera de direccin a su estado normal
Ret ; y REGRESA.

ConvNum Endp

;------------------------------------------------------------------------------
; Rutina : ConvASCII
; Propsito : Convertir un valor binario en ASCII
; Par metros : 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 llen ndola
Mov Cx, 10 ; con asteriscos
Mov Al, '*'

ConvASCII01:
Mov [Si], Al
Inc Si
Loop ConvASCII01
Pop Ax
Pop Dx
Mov Bx, Ax ; Palabra baja de la cantidad
Mov Ax, Dx ; Palabra alta de la cantidad
Mov Si,Offset ResultaR ; Cadena donde se guardar el resultado
Add Si, 11
Mov CX, 10 ; Divisor = 10

OBTENDIGITO:
Dec Si
Xor Dx, Dx ; DX contendr el residuo
Div Cx ; Divide la palabra alta (AX)

22
Arquitectura de Procesadores I Ing. Ral Hinojosa

Mov Di, Ax ; Guarda cociente (AX)


Mov Ax, Bx ; AX = palabra baja (BX)
Div Cx ; DX tena un residuo de la divisin anterior
Mov Bx, Ax ; Guarda el cociente
Mov Ax, Di ; Regresa la palabra alta
Add Dl,30h ; Convierte residuo en ASCII
Mov [Si], Dl ; Lo almacena
Or Ax, Ax ; Palabra alta es 0?
Jnz OBTENDIGITO ; No, sigue procesando
Or Bx, Bx ; Palabra baja es 0?
Jnz OBTENDIGITO ; No, sigue procesando
Ret

ConvASCII Endp

;------------------------------------------------------------------------------
; Rutina : HuboERROR
; Propsito : Desplegar el mensaje de error adecuado.
; Par metros : Nada
; Regresa : Nada
;------------------------------------------------------------------------------

HuboERROR Proc Near

Cmp Cantidad, 0 ; Es la cantidad 1?


Jnz HUBOERROR02 ; No.
Mov Dx, Offset Error1
Call Imprime
Mov ErrorCAP, 1 ; Enciende la bandera de error
Jmp HUBOERROR05

HUBOERROR02:
Cmp Cantidad, 1 ; Es la cantidad 2?
Jnz HUBOERROR03 ; No.
Mov Dx, Offset Error2
Call Imprime
Mov ErrorCAP, 1
Jmp HUBOERROR05

HUBOERROR03:
Cmp Cantidad, 2 ; Cantidad capturada est fuera de rango ?
Jnz HUBOERROR04 ; No.
Mov Dx, Offset Error3
Call Imprime
Mov ErrorCAP, 1
Jmp HUBOERROR05

23
Arquitectura de Procesadores I Ing. Ral Hinojosa

HUBOERROR04:
Mov Dx, Offset Error4 ; Error de intento de divisin por cero
Call Imprime
Mov ErrorCAP, 1

HUBOERROR05:
Ret

HuboERROR Endp

.STACK
End Empieza

24