Está en la página 1de 16

Universidad de El Salvador.

Facultad de Ingeniería y Arquitectura.


Escuela de Ingeniería Eléctrica.
Sistemas Digitales Programables I.

“Introducción al Macroensamblador 80X86”


Alumno:
Nuñez Cartagena, Reynaldo de Jesús NC16002

Instructores:
Br. Luis Herrera.
Br. Christian Tercero.

Catedrático:
Ing. Ricardo E. Cortez
Ciudad Universitaria,9 de abril del 2021
Porcentaje Nota
1- Introducción (máximo una página) 5%
2- Objetivos (1 general, 2 específicos) 5%
3- Marco teórico (máximo 2 páginas) 10%
4- Desarrollo de la practica 10%
5- Asignaciones 40%
a) 8%
b) 8%
c) 8%
d) 8%
e) 8%
6- Conclusiones 30%
Nota final
Introducción

Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas,


es decir, de almacenar en memoria la información sobre la tarea que iban a ejecutar. Las
primeras se usaban como calculadoras simples; se les indicaban los pasos de cálculo, uno por
uno. Lenguaje Ensamblador es la primera abstracción del Lenguaje de Máquina, consistente en
asociar a los códigos de operación (OPCODES) palabras clave que faciliten su uso por parte del
programador. Como se puede ver, el Lenguaje Ensamblador es directamente traducible al
Lenguaje de Máquina, y viceversa; simplemente, es una abstracción que facilita su uso para los
seres humanos. Por otro lado, la computadora no entiende directamente el Lenguaje
Ensamblador; es necesario traducirle a Lenguaje de Máquina. Originalmente, este proceso se
hacía a mano, usando para ello hojas donde se escribían tablas de programa similares al
ejemplo de la calculadora que vimos anteriormente. Pero, al ser tan directa la traducción,
pronto aparecieron los programas Ensambladores, que son traductores que convierten el
código fuente (en Lenguaje Ensamblador) a código objeto (es decir, a Lenguaje de Máquina).
Objetivos
Objetivo general:

 Conocer cuál es la importancia de aprender macro ensamblador y saber en que se puede


utilizar.
Objetivo específico:

 • Que el estudiante aprenda los procesos de ensamblado y enlazado (link) de


programas en
lenguaje ensamblador para su ejecución en una computadora personal.
• Crear el código fuente de un programa en lenguaje ensamblador.
Marco teórico

El uso del lenguaje ensamblador le permite al programador indicarle al computador


exactamente cómo llevar a cabo una tarea específica usando la menor cantidad de
instrucciones. Aún cuando el código generado por los compiladores con opción de
optimización es eficiente, la optimización manual puede resultar en una mejora sustancial en
términos de rendimiento y consumo de memoria. El lenguaje ensamblador es usualmente
utilizado en las siguientes circunstancias: Mejorar la eficiencia de una rutina específica que se
ha transformado en un cuello de botella. Obtener acceso a funciones de bajo nivel del
procesador para realizar tareas que no son soportadas por los lenguajes de alto nivel. Escribir
manejadores de dispositivos para comunicarse directamente con hardware especial tales
como tarjetas de red. Trabajar en ambientes con recursos limitados puede requerir el uso del
lenguaje ensamblador pues el código ejecutable puede ser menor que el generado por el
compilador. Los lenguajes ensamblador tienen sus aplicaciones muy reducidas, se centran
básicamente en aplicaciones de tiempo real, control de procesos y de dispositivos electrónicos.

El concepto de escalabilidad en telecomunicaciones y en ingeniería informática, es la


propiedad deseable de un sistema, una red o un proceso, que indica su habilidad para
extender el margen de operaciones sin perder calidad, o bien manejar el crecimiento continuo
de trabajo de manera fluida. El Microprocesador es un circuito integrado que contiene algunos
o todos los elementos hardware, y el de CPU, que es un concepto lógico. Una CPU puede estar
soportada por uno o varios microprocesadores, y un microprocesador puede soportar una o
varias CPU. Un núcleo suele referirse a una porción del procesador que realiza todas las
actividades de una CPU real. Un microprocesador escalar solamente puede manejar una
instrucción que a su vez maneja solo un objeto de datos a la vez. Un microprocesador
superescalar puede procesar también solo un objeto de datos por instrucción, pero puede
paralelizar este proceso por su diseño, ejecutando varias instrucciones a la vez.

Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos
clasificarlos de acuerdo a características. Así podemos clasificarlos en: ENSAMBLADORES
CRUZADOS (CROSS-ASSEMBLER). Se denominan así los ensambladores que se utilizan en una
computadora que posee un procesador diferente al que tendrán las computadoras donde va a
ejecutarse el programa objeto producido. El empleo de este tipo de traductores permite
aprovechar el soporte de medios físicos (discos, impresoras, pantallas, etc.), y de programación
que ofrecen las máquinas potentes para desarrollar programas que luego los van a ejecutar
sistemas muy especializados en determinados tipos de tareas. ENSAMBLADORES RESIDENTES.
Son aquellos que permanecen en la memoria principal de la computadora y cargan, para su
ejecución, al programa objeto producido. Este tipo de ensamblador tiene la ventaja de que se
puede comprobar inmediatamente el programa sin necesidad de transportarlo de un lugar a
otro, como se hacía en cross-assembler, y sin necesidad de programas simuladores.
MACROENSAMBLADORES. Son ensambladores que permiten el uso de macroinstrucciones
(macros). Debido a su potencia, normalmente son programas robustos que no permanecen en
memoria una vez generado el programa objeto. MICROENSAMBLADORES. El programa que
indica al intérprete de instrucciones de la UCP cómo debe actuar se denomina microprograma.
El programa que ayuda a realizar éste microprograma se llama microensamblador. Existen
procesadores que permiten la modificación de sus microprogramas, para lo cual se utilizan
microensambladores. ENSAMBLADORES DE UNA FASE. Estos ensambladores leen una línea del
programa fuente y la traducen directamente para producir una instrucción en lenguaje
máquina o la ejecuta si se trata de una pseudoinstrucción. También va construyendo la tabla
de símbolos a medida que van apareciendo las definiciones de variables, etiquetas, etc.
ENSAMBLADORES DE DOS FASES. Los ensambladores de dos fases se denominan así debido a
que realizan la traducción en dos etapas. En la primera fase, leen el programa fuente y
construyen una tabla de símbolos; de esta manera, en la segunda fase, vuelven a leer el
programa fuente y pueden ir traduciendo totalmente, puesto que conocen la totalidad de los
símbolos utilizados y las posiciones que se les ha asignado.

Desarrollo de la práctica
La practica nos pide ensamblar los códigos en los apéndices A y B y luego correrlos,
por lo tanto, comenzaremos con el apéndice A.
Primero se crea un archivo .asm
PRIMASM.asm

TITLE PRIMASM Primer programa en ensamblador (PRIMASM.ASM)

SUBTTL Uso de directivas y estructuras de un programa.

.8086

STACK_SEG SEGMENT 'STACK'

; inicio del segmento de pila.


; A continuación, se inicia con cero el segmento de pila (STACK) y se
; carga con una cadena de caracteres ( 64 veces la palabra 'STACK').

DB 64 DUP (?)

STACK_SEG ENDS ; Fin del segmento de pila.

CODIGO_SEG SEGMENT 'CODE' ; inicio del segmento de código.


ORG 0
ASSUME CS:CODIGO_SEG,SS:STACK_SEG ; definimos los segmentos.

CODIGO PROC NEAR

SUB AX,AX ; Borra el contenido de AX


MOV AX,18D ; asigna a AX el valor 18 (decimal).
SUB AX,18D ; resta 18 decimal a AX,
; volviendo su valor a cero.
MOV ah,4ch
INT 21h

CODIGO ENDP

CODIGO_SEG ENDS ; fin del segmento de código.

END CODIGO ; fin del programa.

Primero se monta la carpeta donde se tienen los archivos.


Una vez que se tiene es código se procede a ensamblar para obtener un archivo ejecutable.

Por ultimo se ejecuta el archivo, pero en este caso el programa no hace nada.

Ahora haremos el mismo procedimiento con el apéndice B

; Apendice.asm
; Programa para desplegar todos los caracteres en pantalla
; El primer paso a dar es definir los segmentos:
; Segmento de pila (STACK) de longitud 256 bytes:
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP (0)
STACK ENDS
; Segmento de código:
CODE SEGMENT PARA PUBLIC 'CODE'
INICIO PROC FAR
ASSUME CS:CODE,SS:STACK
PUSH DS
MOV AX,0
PUSH AX
; PRIMER PASO: limpiar la pantalla
MOV AX,0B800H ; Dirección del segmento de memoria
; para el adaptador del monitor.
MOV ES,AX ; Fijar a ES como registro base.
MOV DI,0 ; Desplazamiento inicial del segmento ES.
MOV AL,' ' ; Caracter para borrar.
MOV AH,07H ; Byte de atributo para un
; despliegue normal.
MOV CX,2000 ; Número de veces a repetir la
; instrucción que sigue a REP.
CLD ; STOS cargue la memoria y
REP STOSW ; Escribe el caracter contenido en AL
; a la pantalla.
; SEGUNDO PASO: Llenar la pantalla con 256 caracteres
; separados por una fila y una columna c/u.
MOV AL,0 ; AL contiene el caracter a desplegar.
MOV AH,0 ; AH contiene el número de columna.
MOV DI,160 ; DI contiene el desplazamiento y se
; inicia para que apunte al primer
; caracter de la 2a. fila.
; Lazo que llena la pantalla:
LAZO: MOV ES:[DI],AL ; Pone el caracter en la memoria del
; adaptador.
ADD DI,4 ; Apuntar a la próxima posición.
ADD AH,2 ; Actualizar la columna.CMP AH,80 ; Detectar fin de fila.
JB SALTO ; Si no es fin de fila, saltar
; (ir a "SALTO").
ADD DI,160 ; Si es fin de línea, cambiar de fila.
MOV AH,0 ; Volver a primera columna.
SALTO: CMP AL,255 ; ¿Se han desplegado todos los caracteres?
JE FINAL ; Si ya se desplegaron todos los caracteres,
; ir a la salida.
INC AL ; Ir al próximo caracter.
JMP LAZO ; volver al inicio del lazo.
; TERCER PASO: Después de escribir todos los caracteres, esperar,
; borrar la pantalla y volver al DOS.
FINAL:
MOV AX,400H ; Define el tiempo del retardo
; junto con CX.
RETARDO: MOV CX,0A000H ; El retardo variará según la
; velocidad del CPU.
; Aproximadamente 5 seg. en una
; CPU Pentium ® 75 MHz.
RETARDAR: LOOP RETARDAR
INC CX
DEC AX
JNZ RETARDO
MOV DI,0
MOV AL,' '
MOV AH,07H
MOV CX,2000
REP STOSW
RET
INICIO ENDP
CODE ENDS
END INICIO
Escriba el programa del apéndice B como un procedimiento cercano
(denominado
CARACT), el cual debe ser llamado por un programa principal similar a
PRIMASM en cuyo segmento de código se define:
CODIGO PROC FAR
PUSH DS
MOV AX,0
PUSH AX
CALL CARACT
;Aquí escribir instrucciones para leer la tecla "enter". Si es la
;tecla "enter" escribir a continuacion:
RET ;retorno a DOS. Si no es la tecla "enter", esperar hasta que lo
;sea.
CODIGO ENDP
CSEG ENDS
END CODIGO

Asignaciones
 Explique el proceso de ensamble de un programa en macro assembler.

1. El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como
archivo de código fuente.

 2. El ensamblador lee el archivo de código fuete y produce un archivo de código objeto, una
traducción del programa a lenguaje máquina. De manera opcional, produce un archivo de
listado. Si ocurre un error, el programador debe regresar al paso 1 y corregir el programa.

 3. El enlazador lee el archivo de código objeto y verifica si el programa contiene alguna
llamada a los procedimientos en una biblioteca de enlace.

 4. La herramienta cargadora del sistema operativo lee el archivo ejecutable y lo carga en
memoria, y bifurca la CPU hacia la dirección inicial del programa, para que éste empiece a
ejecutarse.

Edición

Los archivos fuente de código ensamblador deben estar en formato ASCII standard. Para esto
puede usarse cualquier editor que permita crear archivos sin formato.

 Ensamblado

El ensamblado se lleva a cabo invocando al MASM. Este puede ser invocado, usando una línea
de comando, de la siguiente manera: MASM archivo [,[objeto][,[listado] [,[cross]]]]][opciones]
[;] Dónde: Objeto.- Es el nombre para el archivo objeto. Listado. - Nombre del archivo de
listado de ensamblado. cross. Es un archivo de referencias cruzadas.  

Objeto. - Es el nombre para el archivo .OBJ Ejecutable. - Nombre del archivo .EXE Mapa. -
Nombre del archivo mapa Librería. - Nombre del archivo biblioteca de rutinas

 Ejecución

Para la ejecución del programa simplemente basta teclear su nombre en el prompt de MS-DOS
y teclear ENTER. Con esto el programa será cargado en memoria y el sistema procederá a
ejecutarlo.

 Investigue y explique los métodos de lectura de teclado y la impresión en pantalla.

Lectura por teclado en el 8086


Para poder leer datos por el teclado (entrada Standard) vamos a utilizar la
interrupción 21h.
Primeramente necesitamos declarar una variable donde se van a almacenar
loscaracteres tecleados:
Sintaxis:
<nombre de la variable> db <tamaño>,?,<tamaño> dup (¿),’$’

 Ejemplo: bufnum1 db 6,?,6 dup (?),'$' -> Declaramosun buffer donde podemos


almacenar 6 caracteres. Este buffer se nos va a rellenar con la entrada tecleada.
 Al producirse la lectura, el lugar de la ? (la que está entre los dos 6's) se va a
rellenar con el tamaño exacto de la cadena tecleada.

Para llamar a la interrupción para que realice la lectura, tenemos que incluir el
siguiente código en nuestro programa (veámoslo sobre el ejemplo anterior):

Mov ah,0ah
Mov dx,offset bufnum1
Int 21h

Podemos observar en la primera instrucción que la opción de la interrupción 21h la


marcamos con 0ah.

Para imprimir en pantalla tenemos el siguiente ejemplo:

.model small
.stack 100
.code
mov ah, 02h ; funcion para imprimir un caracter
mov dx, 64 ; mover un 64 a Dx para imprimir en pantalla
int 21h ; ejecuta la funcion
.exit
end

 Diseñar un programa en el que se solicite el ingreso de 4 números entre 0 y 20 (los


números menores a 10 deben ser ingresados con un cero a la izquierda), luego del
ingreso que muestre un menú estilo tabla solicitando la operación que se desea
realizar, que no distinga entre minúscula y mayúscula para seleccionar la opción del
menú y que en el caso de ingresar una opción no válida (siempre durante el menú)
muestre un mensaje de error y aguarde a que se presione enter para volver al menú.
 Diseñar un programa en el cual se ingresen dos números de un byte cada uno, y que
solicite la operación matemática a realizar, la cual se seleccionara de acuerdo a la
siguiente tabla:

Letra Operación
S Suma
R Resta
M Multiplicación
D División
Cualquier otra letra Operación no valida

Sin que haga diferencia entre mayúsculas y minúsculas, es decir si se ingresa “S” o“s” el
programa siempre realice la suma y así con las demás instrucciones.

 Diseñe un programa con dos tablas de 10x5, es decir, tablas de 10 posiciones de 5


bytes cada una de nombres USERS y PASSWORD la primera posición de la tabla
USERS debe contener 5 caracteres (USER1) y la primera posición de la tabla
PASSWORD contener 5 caracteres (PASS1). En principio el programa debe solicitar un
usuario y contraseña (que serán los guardados por defecto), de lograr esto
correctamente debe mostrarse un menú estilo tabla

La descripción de las opciones es la siguiente:


debe solicitar un nombre de usuario y una password (imprimir * por cada
N
carácter ingresado) y al finalizar esperar enter para volver al menú,
Debe mostrar un mensaje "sesión finalizada" y volver al menú y por ende
X
restringir las opciones I y N hasta que se inicie sesión.
B Solicitará lo mismo que al inicio del programa.
Debe imprimir los usuarios y contraseñas de la forma USER1-->PASS1 y la opción
I
E finaliza el programa
Todo ingreso de datos correctamente deberá ser almacenado en USERS y PASSWORD
respectivamente, no distinga entre minúscula y mayúscula para seleccionar la opción del menú
y que en el caso de ingresar una opción no válida (siempre durante el menú) muestre un
mensaje de error y espere a que se presione enter para volver al menú.

; Asig5.asm
.8086
.model small ; Directiva para indicar el tamano del programa
.stack 256 ; Directiva para indicar el tamano de pila
.data
CAD_USR DB 10, 13 ,"Introduzca el usuario:",10,13,24h
CAD_PASS DB 10,13,"Introduzca la contrasena:",10,13,24h
USERS DB "USER1",45 DUP(0)
CONTR DB "PASS1",45 DUP(0)

USER_AC DB 5 DUP(?)
CONTR_AC DB 5 DUP(?)
CAN_DATOS DB 1
MSGMD DB "se han superado la cantidad de datos que se pueden
ingresar",10,13,24h
MSGSF DB "Sesion Finalizada, no podra ver ni agregar usuarios hasta
que inicie sesion",10,13,24h,24H
MSGM DB 10,13,"tecla erronea, vuelva a digitarlo",10,13,24h
MSG1 DB "_______________________________________________",10,13
MSG2 DB "|letra | Ingresar nuevo usuario y contrasena | ",10,13
MSG3 DB "|______|_______________________________________|",10,13
MSG4 DB "| N | Ingresar nuevo usuario y contrasena | ",10,13
MSG5 DB "| B | iniciar sesion | ",10,13
MSG6 DB "| I | Imprimir usuario y password | ",10,13
MSG7 DB "| X | cerrar sesion | ",10,13
MSG8 DB "| E | Finalizar programa | ",10,13
msg9 db "|______|_______________________________________|" ,10,13,24h

.code ;Directiva para indicar el codigo

IN_a_si_PAS PROC NEAR


MOV CX,5H
INTR_datosp:
MOV AH,07H
INT 21H
MOV [SI],AL
MOV AH,02H
MOV DL,'*'
INT 21H
INC SI
LOOP INTR_DATOSp
MOV AH,02 ; PONDRA UNA LINEA NUEVA DESPUES DE INTRODUCIR LOS DATOS
MOV DL,10
INT 21H
MOV DL,13
INT 21H
RET
IN_A_SI_PAS ENDP

IN_a_si_USER PROC NEAR


MOV CX,5
INTR_datosu:
MOV AH,01H
INT 21H
MOV [SI],AL
INC SI
LOOP INTR_DATOSu
MOV AH,02 ; PONDRA UNA LINEA NUEVA DESPUES DE INTRODUCIR LOS DATOS
MOV DL,10
INT 21H
MOV DL,13
INT 21H
RET
IN_A_SI_USER ENDP

CMPR_USERAC: ;MACRO
mov dx,0
mov bl,5
prueba:
cmp dx,10
jae errorusuario
mov cx, 5
mov si, offset USER_AC
mov di, offset users
mov ax,dx
mul bl
add di,ax
cld
repe cmpsb
jz password;etiqueta para probar contrasenia
inc dx
jmp prueba

password:
mov di, offset CONTR
mov al,dl
mov si, offset CONTR_AC
mul bl
add di,ax
mov cx,5
repe cmpsb
jz MENU
jmp errorusuario
;CMPR_USERAC ENDM
errorusuario:
jmp inicio2
MENU:
MOV DX, OFFSET MSG1
CALL CAD_IMP
MOV AH,1H
INT 21H
MOV BH,AL
mov ah,2
mov dl,10
int 21h
mov dl,13
int 21h
MOV AL,BH
CMP AL,'N'
JE NUEVO_USR
CMP AL,'B'
JE INICIO2;INICIO_SESION
CMP AL, 'I'
JE IMP_ALL
CMP AL, 'X'
JE CERRAR_SESION
cmp al,'E'
je ed_prog
MOV DX, OFFSET MSGM
call Cad_imp

JMP MENU

menusf:
MOV DX, OFFSET MSG1
CALL CAD_IMP
MOV AH,1H
INT 21H
CMP AL,'B'
JE INICIO2;INICIO_SESION
CMP AL, 'X'
JE CERRAR_SESION
cmp al,'E'
je ed_prog
JMP MENUsf

cad_imp proc near


mov ah,09
int 21h
ret
cad_imp endp
ING_USER PROC NEAR
mov dx,offset CAD_USR
CALL CAD_IMP

MOV AX,5
MUL CAN_DATOS
ADD AX,OFFSET USERS
MOV SI,AX ; UBICA EL APUNTADOR SI A LA TABLA USUARIOS EN LA
POSICION 5*CAN_DATOS
CALL IN_A_SI_USER
MOV DX, OFFSET CAD_PASS
CALL CAD_IMP

MOV AX,5
MUL CAN_DATOS
ADD AX,OFFSET CONTR
MOV SI,AX
CALL IN_A_SI_PAS
MOV SI,OFFSET CONTR ; UBICA EL APUNTADOR SI A LA TABLA USUARIOS EN LA
POSICION 5*CAN_DATOS

INC CAN_DATOS
RET
ING_USER ENDP

inicio:
mov ax,@data ;Inicializar los registros.
mov ds,ax
MOV ES,AX
inicio2:
mov dx,offset CAD_USR
CALL CAD_IMP
MOV SI,OFFSET USER_AC
CALL IN_A_SI_USER
MOV DX, OFFSET CAD_PASS
CALL CAD_IMP
MOV SI,OFFSET CONTR_AC
CALL IN_A_SI_PAS
jmp CMPR_USERAC

IMP_ALL:
MOV BL,0; IRA DE 0 A CAN_DATOS (CANTIDAD DE DATOS INTRODUCIDOS)
MOV SI,OFFSET USERS
MOV DI, OFFSET CONTR
MOV BH, CAN_DATOS
CICLO_IMP:
MOV CX,5
POR_USR:
MOV AH,2
MOV DL,[SI]
INT 21H
INC SI
LOOP POR_USR

MOV AH, 2
MOV DL,9
INT 21H
MOV CX,5
POR_PASS:
MOV AH, 2
MOV DL,[DI]
INT 21H
INC DI
LOOP POR_PASS

MOV AH,2
MOV DL,10
INT 21H
MOV DL, 13
INT 21H
INC BL
CMP BL,BH
JB CICLO_IMP
JMP MENU

NUEVO_USR:
; CUANDO CAN_DATOS SEA 10 YA NO SE PODRA METER MAS DATOS
CMP CAN_DATOS,10
Jae NOSEPUEDE
MOV AH,2
MOV DL,10
INT 21H
MOV DL,13
INT 21H
CALL ING_USER
JMP MENU
NOSEPUEDE:
mov dx, offset msgmd
CALL CAD_IMP
JMP MENU

CERRAR_SESION:

MOV DX, OFFSET msgsf


call cad_imp
jmp menusf

ed_PROG:
.exit
end inicio
Conclusiones

También podría gustarte