Universidad Nacional de Ingeniería
Facultad de Electrotecnia y Computación Ing. Electrónica Maquinas Computadora I Docente: Marlon Robleto
Elaborado por: Ricardo Gabriel Jarquín Anduray Luis Carlos Guevara Cerda Jocsan Haniel Castillo Carranza Tema: Informe de laboratorio #2 “Instrucciones de Movimiento y aritméticas” Grupo: 4T1-Eo Fecha:
Jueves 24 de Marzo del 2016
Tabla de contenidos
I. II. III. IV. V. VI.
Introducción Objetivos Procedimiento Investigación complementaria Conclusiones Recomendaciones
I.
Introducción Para el desarrollo de software de manera eficiente se requiere familiaridad con los modos de direccionamientos utilizados por el 8086 y demás microprocesadores, para ello se necesita el uso de la instrucción MOV, la cual es utilizada para describir los diferentes modos de direccionamiento existentes, ya sea para mover datos tipo byte, palabra o doble palabra (solo para microprocesadores de 32 bits), entre los distintos registros y memoria. Otra conjunto de instrucciones que se deben de tener en cuenta son las instrucciones aritméticas y lógicas la cuales son utilizadas por el 8086 las operaciones aritméticas básicas son: la suma, resta, multiplicación, división, comparación, negación aritmética, incremento y decremento. Mientras que las instrucciones lógicas incluyen AND, OR, OR exclusivo, NOT, desplazamiento, rotación y comparación lógica (TEST). Los primeros microprocesadores de 8 bits no podían multiplicar ni dividir sin un programa que realizara estas operaciones mediante el empleo de una serie de desplazamientos y sumas o restas sucesivas. Así que los microprocesadores de 16 bits empezaron a incluir las instrucciones de multiplicación y división en vista de esta carencia. El registro de bandera contiene un bit llamado acarreo el cual es modificado por los resultados de las operaciones aritméticas y lógicas. Si el resultado de una operación de suma es mayor que el máximo que puede ser representado por el sistema, entonces la bandera de acarreo es puesta en 1 e indica que ha ocurrido un acarreo en la suma que acaba de realizar. En la substracción, si el minuendo es menor que el substraendo, la bandera de acarreo es también puesta en 1, con la diferencia que ahora indica que ha ocurrido un préstamo en la anterior operación de resta. Estas características son utilizadas para realizar operaciones con más de un byte.
II. Objetivos • • • •
Familiarizarse con los modos de direccionamiento y el uso de la instrucción MOV para el desplazamiento de datos. Conocer y utilizar correctamente las instrucciones aritméticas ADD, SUB, MUL, DIV al momento de realizar operaciones aritméticas entre datos. Programar en ensamblador pequeños programas que lleven desplazamiento de datos e instrucciones aritméticas. Comprender el uso del bit de acarreo en el registro de bandera.
III. Procedimiento
1. Se ejecutó el emulador de microprocesadores emu8086.
2. Se abrió un nuevo archivo, en la ventana de bienvenida seleccionando la opción new
3. Se escribió en el IDE el código fuente en lenguaje ensamblador que se muestra a continuación. MOV AX, FFF1h MOV BL, AL MOV DL, 15h ADD BL, DL RET
4. Luego se copilo el código pero en este caso indica el error siguiente: 5. El error se debe a la que se está utilizando un direccionamiento inmediato y si el numero hexadecimal que se desea guardar en el registro empieza con una letra debe
agregarse un cero a la izquierda como se ve en el siguiente código el cual ya está
arreglado: 6. Al ejecutar el programa paso a paso se pudo observar cómo cambian los registros, en un principio todos se encuentran en cero como se ve en la siguiente imagen:
7. En la ejecución de cada instrucción cada registro empieza a tomar el valor deseado utilizando la función MOV al final del programa los registros quedan de la siguiente manera:
8. El programa es un código bastante sencillo mueve unos datos a los registros y luego realiza una suma. La primera instrucción hace un direccionamiento directo y guarda en el registro AX que es un registro de 16 bits el número “FFF1h” que también es de 16bits. La segunda instrucción guarda en el registro BL que es de 8 bits los datos en el registro AL que son los primeros 8 bits del registro AX es decir el número “F1h”.. La tercera instrucción es nuevamente un direccionamiento directo pero ahora de 8 bits el cual guarda en el registro DL el número “15h”. La cuarta instrucción es una operación aritmética el cual suma al registro BL el dato en el registro DL es decir BL=BL+DL. Modificando únicamente al registro BL mientras que el registro DL conserva su dato original. Por último la instrucción RET Extrae una dirección de la pila y salta a ella. Además de volver, restaura el registro de banderas. 9. Luego se volvió a ejecutar el programa paso a paso pero ahora para observar como el registro de banderas es modificado al realizar una operación aritmética o lógica.
Luego de realizar la suma del registro BL con el registro DL dos banderas se activan como se puede observar:
Los cuales son La bandera de acarreo que se activa cuando se produce acarreo en una suma o multiplicación, en una resta entre números sin signo, en este caso como el resultado de la suma es más de 8 bits se produjo un acarreo. Y La bandera de paridad se usa para indicar si el resultado, en un registro, de una operación matemática es válido. 10. Luego se modificó el código para que en lugar de sumar los registros se restaran. El código y el resultado de la resta se puede ver en la siguiente imagen.
Se puede observar al registro BL se le resta el valor de DL, dejando el dato del registro DL sin modificar es decir BL=BL-DL. Las banderas que se activaron al realizar las restas son las siguientes:
La bandera AF (de acarreo auxiliar) se utiliza en operaciones matemáticas con números decimales codificados en binario (BCD). Se activa si hay acarreo presente. La bandera SF (de signo) muestra el bit más significativo del resultado de una operación, el cual denota el signo del número. Si se modifica la instrucción SUB de la siguiente manera: SUB DL, BL ahora al registro DL se le resta el dato del registro BL, es decir DL=DL-BL. Al final de la ejecución del programa los registros y las banderas quedan de la siguiente manera:
Donde se puede ver que la bandera de acarreo se activó pues que el sustraendo es mayor que el minuendo.
IV.
Investigación complementaria
Investigue las instrucciones de multiplicación y división y realice un ejemplo con cada una de esas instrucciones. Multiplicación Antes de empezar a hablar de la multiplicación es necesario recordar que si se multiplican dos números de 8 bits se genera un producto de doble anchura es decir de 16 bits. La multiplicación puede ser de dos maneras entera sin signo usando la instrucción MUL y la entera con signo usando la instrucción IMUL. Como se mencionó anteriormente la operación de multiplicación afecta el registro de bandera, específicamente la bandera de acarre y desbordamiento. La demás banderas se ven afectadas pero de manera impredecibles por los cual no se utilizan. Las operaciones de multiplicación básicas son byte a byte, palabra por palabra y palabras dobles por palabra dobles (esta es exclusiva para microprocesadores de 32 bits). Algo importante de destacar es que siempre el multiplicando debe encontrarse en el registro AL en el caso de la multiplicación byte por byte ,en el registro AX para la multiplicación palabra por palabra y en el registro EAX para la multiplicación de palabras dobles por palabra dobles. El resultado de la multiplicación se almacena de la siguiente: Para la multiplicación de byte por byte: El resultado se almacena en el registro AX Para la multiplicación de palabra por palabra: El resultado se almacena en ambos registro por ejemplo MUL DX, el resultado se almacena en los registro de la siguiente manera DX-AX donde los 8 bits más significativos se almacenan en DX. Para la multiplicación de palabras dobles por palabra dobles: El resultado se almacena en ambos registro por ejemplo MUL EDX, el resultado se almacena en los registro de la siguiente manera EDX-EAX donde los 16 bits más significativos se almacenan en EDX.
Código de ejemplo: MOV AX, 0FFFFh
MOV DX, 0A2FFh MUL DX RET Resultado de la simulación: Se puede notar que las banderas de acarreo y desbordamiento se han activado y los datos en los registros AX y DX han sido cambiados, ahora se encuentra el resultado de la multiplicación. Ordenado de la manera DX-AX es decir el número resultante de la multiplicación es: A2FE5D01h.
División Al igual que la multiplicación la división puede ser entera sin signo DIV o entera con signo IDIV. El dividendo siempre es un dividendo del doble de anchura es decir para una división de 8 bits el dividendo debe de ser de 16 bits. En la división ninguno de los bits de bandera cambia de forma predecible. En la división pueden ocurrir dos tipos de errores: el primero por tratar de dividir entre 0 y el otro por desbordamiento de división, este ocurre por dividir un número pequeño entre un número grande. División de 8 bits: El dividendo de 16 bits se almacena en el registro AX y el divisor en cualquier otro registro de 8 bits. El resultado se almacena de la siguiente manera, el cociente en el registro AL y el residuo en AH. División de 16 bits: Ahora el dividendo de 32 bits se almacena en los registros DX-AX, y el divisor en cualquier otro registro de 16 bits. El resultado se almacena de la siguiente manera, el cociente en AX y el residuo en DX.
División de 32 bits:
Ahora el dividendo de 64 bits se almacena en los registros EDX-EAX, y el divisor en cualquier otro registro de 32 bits. El resultado se almacena de la siguiente manera, el cociente en EAX y el residuo en EDX. Código de ejemplo: MOV AX, 10AAh MOV CL, 95h DIV CL RET Resultado de la simulación: Esta operación es una división de 8 bits se puede observar que el programa carga el número 10AAh al registro AX este será el Dividendo, y el registro CL contendrá el número 95h y será el divisor. El cociente se guarda en AL y el residuo en AH por ello al final de la ejecución AL=1Ch y AH= 5Eh.
V.
Conclusiones • Se logró tener una mejor comprensión de los modos de direccionamiento para mover datos, especialmente el direccionamiento inmediato, también se aprendió a utilizar los registros de 8 bits que son subregistros de los registros de 16 bits. • Se hizo uso de las instrucciones para operaciones aritméticas, de tal manera de hacer uso correcto de ellas al momento de hacer operaciones entre registros, el algún programa. • Las operaciones aritméticas afecta los registros de bandera, algunos de manera predecible mientras que otros de manera impredecible en dependencia de la operación aritmética que se esté utilizando. • El resultado de la operación aritmética es almacenado de diferente manera según la operación aritmética utilizada por ello se debe de tener mucho cuidado, al realizar estas operaciones, se debe conocer que registro cambiaran y cuales no para evitar problemas en el software.
VI.
Bibliografía Brey,Barry R(2006). Microprocesadores Intel 7ma edición. México: Pearson educación.