Sei sulla pagina 1di 29

Cuadro de ponderaciones.

En este cuadro se reflejan las ponderaciones de cada parte de este reporte.

Porcentaje Nota
1-Introduccion(máximo una página) 5%
2-Objetivos (1general,2 específicos) 5%
3-Marco Teórico(máximo 2 paginas) 10 %
4-Desarrollo de la practica 10 %
5-Asignaciones 40 %
a)Hello Word
b)Identificador de caracteres
c)Operaciones aritméticas
d)Comparador
e)Banderas
f)Investigaciones
6)Conclusiones 30 %
NOTA FINAL
UNIVERSIDAD DE EL SALVADOR
FACULTAD DE INGENIERIA Y ARQUITECTURA
ESCUELA DE INGENIERIA ELECTRICA
SISTEMAS DIGITALES PROGRAMABLES I

CATEDRATICO:
ING. RICARDO CORTEZ
INSTRUCTOR:
ENRIQUEZ LORENZO
ALUMNOS:
HERRERA GARCIA, WILLIAM ALBERTO HG10045
PEREZ, DAVID JONATHAN PP09020

CIUDAD UNIVERSITARI, 05 DE MARZO DE 2018


Introducción

El presente reporte de laboratorio está encaminado a mostrar el desarrollo de las


primeras asignaciones de la asignatura, el trabajo realizado en ellas refleja una
introducción al lenguaje de programación de ensamblador elemental para el manejo y
programación de microprocesadores como los modelos PIC.

En estas asignaciones se profundiza en el aprendizaje de las instrucciones básicas así


también como el manejo básico de tablas o arreglos, donde podemos almacenar
caracteres dígitos entre muchas otras funciones.

También podremos encontrar definiciones de instrucciones variadas que son muy


importantes a la hora de programar una aplicación dada, son elementales pero muy útiles
se intenta ilustrar con ejemplos la mayoría de estas y de esta forma entender la lógica en
la que funcionan, su sintaxis y poder observar su gran utilidad a la hora de diseñar un
programa en este lenguaje maquina el más elemental y padre de la mayoría de todos los
programas informáticos así también sistemas operativos.
Objetivos

 General: introducirse al lenguaje de programación de ensamblador de manera práctica


realizando programas y definiendo conceptos vitales para ello.

Específicos:

 Familiarizarse con la sintaxis del lenguaje ensamblador.

 Aprender las instrucciones elementales para manipular este lenguaje de programación.

 Aprender los conceptos de registros y banderas los cuales pueden ser utilizados y
manipulados con las instrucciones aprendidas.
Marco teórico.
El lenguaje ensamblador, o assembler (en inglés assembly language y la abreviación asm), es un
lenguaje de programación de bajo nivel. Consiste en un conjunto de mnemónicos que
representan instrucciones básicas para los computadores, microprocesadores,
microcontroladores y otros circuitos integrados programables. Implementa una representación
simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una
arquitectura de procesador y constituye la representación más directa del código máquina
específico para cada arquitectura legible por un programador. Cada arquitectura de procesador
tiene su propio lenguaje ensamblador que usualmente es definida por el fabricante de hardware,
y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones),
los registros del procesador, las posiciones de memoria y otras características del lenguaje. Un
lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o
virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel,
que idealmente son portátiles.

Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje
ensamblador al código de máquina del computador objetivo. El ensamblador realiza una
traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a
las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en
los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.

Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo


del programa, controlar el proceso de ensamblaje, y la ayuda de depuración. Particularmente, la
mayoría de los ensambladores modernos incluyen una facilidad de macro (descrita más abajo), y
se llaman macro ensambladores.

Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba
con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con
frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la
manipulación directa de hardware, alto rendimiento, o un uso de recursos controlado y reducido.
También es utilizado en el desarrollo de controladores de dispositivo (en inglés, device drivers) y
en el desarrollo de sistemas operativos, debido a la necesidad del acceso directo a las
instrucciones de la máquina. Muchos dispositivos programables (como los microcontroladores)
aún cuentan con el ensamblador como la única manera de ser manipulados.
Instrucciones de CPU.
La mayoría de las CPU tienen más o menos los mismos grupos de instrucciones, aunque no
necesariamente tienen todas las instrucciones de cada grupo. Las operaciones que se pueden
realizar varían de una CPU a otra. Una CPU particular puede tener instrucciones que no tenga
otro y viceversa. Los primeros microprocesadores de 8 bits no tenían operaciones para
multiplicar o dividir números, por ejemplo, y había que hacer subrutinas para realizar esas
operaciones. Otras CPU puede que no tengan operaciones de punto flotante y habría que hacer
o conseguir bibliotecas que realicen esas operaciones.

Las instrucciones de la CPU pueden agruparse, de acuerdo a su funcionalidad, en:


Operaciones con enteros: (de 8, 16, 32 y 64 bits dependiendo de la arquitectura de la CPU, en los
sistemas muy viejos también de 12, 18, 24, 36 y 48 bits)
Estas son operaciones realizadas por la Unidad aritmético lógica de la CPU
Operaciones aritméticas. Como suma, resta, multiplicación, división, módulo, cambio de signo
Operaciones booleanas. Operaciones lógicas bit a bit como AND, OR, XOR, NOT
Operaciones de bits. Como desplazamiento o shift lógico y rotaciones u Operadores a nivel de
bits (hacia la derecha o hacia la izquierda, a través del bit del acarreo o sin él)
Comparaciones,Operaciones de mover datos:,Entre los registros y la memoria:
Aunque la instrucción se llama "mover", en la CPU, "mover datos" significa en realidad copiar
datos, desde un origen a un destino, sin que el dato desaparezca del origen.
 Se pueden mover valores: Desde un registro a otro
 Desde un registro a un lugar de la memoria
 Desde un lugar de la memoria a un registro
 Desde un lugar a otro de la memoria
 Un valor inmediato a un registro
 Un valor inmediato a un lugar de memoria
 Operaciones de pila (stack, en inglés):
 PUSH (escribe datos hacia el tope de la pila)
 POP (lee datos desde el tope de la pila)
 Operaciones de entrada/salida:
Desarrollo de la práctica.
1. Acceder al programa EMU8086, ya sea desde el icono en el escritorio o desde el menú
Inicio de Windows.
En este caso mediante el menú de inicio accedemos a EMU8086.

Fig1. Accede a EMU8086

2. En el menú [FILE] seleccione la viñeta [SAMPLES] y elija el ejemplo llamado


“HELLOWORLD”.

Fig2. Acceder al ejemplo de “Hello World

3. Dentro del menú [COMPILE], presione [COMPILE AND EMULATE] o en su defecto


presione F5 desde el teclado.

Si presionamos F5 el EMU8086 hace la corrida automática saltándose los pasos que


realiza cada instrucción en lenguaje ensamblador.
Fig3. Corrida de ejemplo “Hello Wolrd”, presionando “Run”.

4. Presione la viñeta [SINGLE STEP] o la tecla F8 y observe con atención como se ejecuta
el código del programa.

Ahora se usara la opción “single step” en las siguientes 3 imágenes más significativas.
a. Al presionar un par de veces mandamos la instrucción para que aparezca la
consola o ventana donde se escribirá “Hello World”.

Fig4. Ventana de consola donde se escribira “Hello World”


b. Se muestra la ventana con el mensaje que deseamos imprimir en pantalla.

IFig5. Se muestra el mensaje “Hello World”.

c. Como se desea sombrear el mensaje dando una foreground color amarillo,


quedando de la siguiente manera.

Fig6. Finaliza los pasos mostrando el resultado deseado


Diseñar el programa para sumar dos números que se encuentran a partir de la dirección 1000H
dejando el resultado en 1002H.
 Código comentado.

Fig7. Código de la suma de dos números a partir de sus direcciones.

 Código ensamblador ejecutado.

Fig8 Corrida del codigo.


 Asignaciones

1- Ejecute en el EMU8086 el programa que se encuentra en el anexo, y explique cada


uno de los pasos que lo conforman, colocando cada una de las ventanas que se
alteran en el EMU8086.

 Código del programa comentado:


Podemos observar que a medida se ejecuta la instrucción MOV (la cual en este caso copia el valor
hexadecimal de cada letra de la palabra HELLO en una posición de la pantalla) podremos ver
como se muestra una letra en pantalla instrucción por instrucción:

Figura 1.1 Se muestra la primera letra H después de ejecutar la instrucción MOV [52h], ‘H’
Una vez que hayamos realizado 5 steps o pasos podremos ver la palabra HELLO completamente
en pantalla, esto sucede después de haber ejecutado las 5 instrucciones MOV:
Figura 1.2 Se muestra la palabra HELLO completa después de haber ejecutado las 5
instrucciones MOV en direcciones que representan posiciones en la pantalla.
Primero observamos la instrucción PUSH y POP con las cuales podemos hacer uso del STACK
donde podemos almacenar una palabra (16 bits) con PUSH y sacarlo del STACK con POP.
Se vuelve a inicializar la memoria de video en el registro acumulador AX y luego se copian los
valores de AX en el registro de segmento extra ES.

1.3 Se utiliza las instrucciones PUSH y POP para poder ingresar datos a la pila y también
tomarlos.
Finalmente podemos observar que se ejecutan 6 instrucciones MOV con la intención de mostrar
el string “WORLD!” mostrando una pequeña variación en la sintaxis a la anterior (HELLO),
haciendo uso del registro de segmento extra ES donde los valores en hexadecimales representan

posiciones en la pantalla.

Figura 1.4 Una vez se han ejecutado las 6 instrucciones MOV las cuales muestran la palabra
WORLD! En pantalla el pequeño programa desarrollado en lenguaje ensamblador se detiene
con la instrucción HLT.
2- Diseñe un programa el cual solicite el ingreso de 10 caracteres (5 números de un
digito y 5 letras, las cuales deben de ser vocales), los números deben ser
almacenados en la tabla NUMS y las vocales en la tabla VCLS, y luego se deben de
mostrarse en pantalla los elementos de la tabla NUMS y de la tabla VCLS, en el orden
que fueron ingresado.

Nota: en nuestro código se sustituyó el nombre de la tabla NUMS por NUMB y VCLS
por VOWS respectivamente.

 Código del programa comentado:


En el código anterior se declaran y se hacen las sentencias en código ensamblador.
 Ejecución de programa:

Figura 2.1 Programa de asignación 2 ejecutado.


3. Diseñar un programa que almacene 4 números, 2 en la tabla NUMS1 y 2 en otra
tabla NUMS2. Posteriormente realizar la suma, resta, multiplicación y división.
Entre los elementos de las tablas y los resultados deben de ser almacenados en la
tabla RESUL de la siguiente manera.

 Código del programa comentado.


Las líneas de código están bien comentadas en las cuales se hace hincapié a las instrucciones que
se utilizaron en el código.
 Ejecución del programa.

Fig. 3.1 corrida del programa de la asignación 3


4. Diseñe un programa que almacene 5 números en una tabla llamada NUMS, que los
compare, y muestre en pantalla cual es el promedio, y cuál es el número menor.

 Código comentado.
 Corrida del programa

Fig. 4.1 resultado del código del comparado de números

5. Defina el registro de banderas y explique la función de cada bit que lo conforma

Es un registro de 16 bits, de los cuales nueve sirven para indicar el estado actual de la máquina y
el resultado del procesamiento. Muchas instrucciones aritméticas y de comparación cambian el
estado de las banderas y apoyándose en ellas se pueden tomar decisiones para determinar la
acción subsecuente.
La tabla contiene 16 posiciones (de 0 a 15), que son los 16 bits del registro de banderas,
numeradas de derecha a izquierda. La posición 0 la encontraremos a la derecha y la posición 15
a la izquierda.
Los bits de las banderas son las siguientes:

 OF (overflow, desbordamiento): Indica desbordamiento del bit de mayor orden después de


una operación aritmética de números con signo (1=existe overflow; 0=no existe overflow).
Para operaciones sin signo, no se toma en cuenta esta bandera.

 DF (dirección): Controla la selección de incremento o decremento de los registros SI y DI en


las operaciones con cadenas de caracteres (1=decremento automático; 0=incremento). La
bandera DF se controla con las instrucciones STD y CLD.


 IF (interrupción): Controla el disparo de las interrupciones (1=habilita las interrupciones;
0=deshabilita las interrupciones). La interrupción no enmascarable es la única que no puede
ser bloqueada por esta bandera. El estado de la bandera IF se controla con las instrucciones
STI y CLI.
 TF (trampa): Permite la operación del procesador en modo de depuración (paso a paso)
 SF (signo): Contiene el signo resultante de una operación aritmética (0=positivo; 1=negativo).

 ZF (cero): Indica el resultado de una operación aritmética o de comparación (0=resultado


diferente de cero; 1=resultado igual a cero).
 AF (acarreo auxiliar): Contiene el acarreo del bit 3. Esta bandera se prueba con las
instrucciones DAA y DAS para ajustar el valor de AL después de una suma o resta BCD.
 PF (paridad): Indica si el número de bits 1, del byte menos significativos de una operación, es
par (0=número de bits 1 es impar; 1=número de bits 1 es par).
 CF (acarreo): Contiene el acarreo del bit de mayor orden después de una operación
aritmética; también almacena el contenido del último bit en una operación de
desplazamiento o de rotación.
6- Investigar el uso de las siguientes instrucciones y realizar un pequeño ejemplo con cada una
de ellas:

 XCHG: intercambia valores de dos operandos.

Algoritmo: Operando1 <_> Operando2

Ejemplo:

 LAHF: Carga AH desde un registro de banderas de 8 bits en bajo (low), sirve para verificar
el estado de las banderas durante la ejecución de nuestro programa.

Algoritmo: AH = registro de banderas

 SAHF: Almacena un registro de banderas de 8 bits en bajo en AH.

Algoritmo: registro de banderas = AH

 XLAT: La instruccion XLAT traduce el contenido de un Byte a otro predefinido. Usted


puede utilizar XLAT, por ejemplo, para validar el contenido de los elementos de datos o,
si transfiere datos entre una PC y una macrocomputadora IBM, para traducir entre
formatos ASCII y EBCDIC.

Algoritmo: [etiqueta:] XLAT ; Sin operandos

 MOVZX: Copia el contenido de un operando fuente (registro o localidad de memoria)


hacia un operando destino (registro) y una extensión de ceros al valor de 16 o 32 bits
(Rellena de ceros).
El tamaño del valor convertido depende del atributo de tamaño del operando.

Algoritmo: Destino = extensionCero(Fuente)

 BSWAP: revierte el orden de un byte de un registro destino de 32 bits. Bits desde el 0


hasta el 7 son intercambiados con los bits desde el 24 hasta el 31. Esta instrucción
funciona para 32 bits, para registros de 16 bits se utiliza XCHG.

 CMOV: movimiento condicional, esta instrucción revisa el estado de uno o más banderas
de estado en el registro de EFLAGS (CF,OF,PF,SF y ZF) y realiza una operación de
movimiento si las banderas están especificadas en un estado o condición especifica.

 SHL: desliza el operando 1 hacia la izquierda. El número de desplazamientos está definido


por el operando 2.

Algoritmo: Desliza todos los bits hacia la izquierda. El bit que queda fuera se almacena en
CF

Ejemplo:

 SHR: desliza el operando 1 hacia la derecha. El número de desplazamientos está definido


por el operando 2.

Algoritmo: Desliza todos los bits hacia la derecha. El bit que queda fuera es almacenado
en CF.

Ejemplo:
 RCL: Rota el operando 1 a la izquierda a través de la bandera CF. El número de rotaciones
está definido por el operando 2.

Algoritmo: Cambia todos los bits a la izquierda, el bit que queda fuera se almacena en CF
y el valor anterior se inserta a la posición más a la derecha.

Ejemplo:

 ROL: Rota el operando 1 a la izquierda. El número de rotaciones es definido por el


operando 2.

Ejemplo:

 RCR: Rota el operando1 a la derecha a través de CF (Carry flag). El número de rotaciones


está definido por el operando 2.

Ejemplo:

 ROR: Rota el operando uno a la derecha. El número de rotaciones está dado por el
operando 2.

Ejemplo:
Conclusiones
En la elaboración de este reporte nos encontramos con muchos obstáculos en la
elaboración de las asignaciones por el uso del lenguaje ensamblador, un lenguaje de
programación algo duro de digerir a diferencia de su contraparte como lo son C u
cualquier otro lenguaje de programación.

También se no fue difícil comprender algunos registros y procedimiento en cuanto como


guardar arreglos y mandar a imprimir en pantalla los resultados que nosotros queríamos
mostrar, fue sin duda una experiencia nueva en cuanto a programación pero se puede
decir que fue una experiencia exitosa.

Potrebbero piacerti anche