Está en la página 1de 12

UNIVERSIDAD AUTÓNOMA METROPOLITANA

UEA: LABORATORIO DE SISTEMAS DIGITALES


CON MICROPROCESADORES 1121033

GRUPO: CEL81
PROFESOR: VICTOR NOE TAPIA VARGAS

Práctica 3

Instrucciones aritméticas y lógicas

EQUIPO 1:
Gómez López Adrián 2192000376

Jimenez Sanchez Brenda 2202005081

Morales Quezada Victor Hugo 2193044023

Hernández Camacho Brayan Ulises 2202000684

FECHA DE ENTREGA: MARTES 12 DE SEPTIEMBRE DEL 2023


II. INTRODUCCIÓN

El grupo de las instrucciones aritméticas que se encuentran en cualquier microprocesador está


compuesto por la suma, la resta y la comparación.

Siempre que se ejecutan las instrucciones lógicas y aritméticas, se modifica el contenido del
registro de banderas. El contenido de la bandera de interrupción, de atrapamiento y de otras más
no cambia. Sólo se modifican las banderas ubicadas en los ocho bits de más a la derecha del
registro de banderas y la bandera de desbordamiento. Estas banderas de más a la derecha
indican el resultado de la operación aritmética o lógica. Cualquier instrucción ADD modifica el
contenido de las banderas de signo, cero, acarreo, acarreo auxiliar, paridad y desbordamiento.

En el microprocesador, la suma (ADD) aparece de muchas formas. Suma de registros, suma de


memoria a registro, suma de arreglos, suma de incremento y suma con acarreo.

En el conjunto de instrucciones aparecen muchas formas de resta (SUB). Estas formas utilizan
cualquier modo de direccionamiento con datos de 8, 16 o 32 bits. Una forma especial de
substracción (decremento o DEC) resta un 1 a cualquier registro o posición de memoria. Al igual
que las demás instrucciones aritméticas, la instrucción de resta afecta a los bits de bandera. Tipos
de resta: Resta de registros, resta inmediata, resta con decremento, resta con acarreo.

La instrucción de comparación (CMP) es una resta que sólo cambia los bits de bandera; el
operando de destino nunca cambia. Una comparación es útil para comprobar todo el contenido de
un registro o de una posición de memoria sobre la base de otro valor. Por lo general, una
instrucción CMP va seguida de una instrucción de salto condicional, que evalúa la condición de
los bits de bandera.

La multiplicación se realiza sobre bytes, palabras o dobles palabras y puede ser de tipo entero
con signo (IMUL) o de tipo entero sin signo (MUL). En la multiplicación de 8 bits, el multiplicando
siempre se encuentra en el registro AL, sin importar si tiene o no signo. El multiplicador puede ser
cualquier registro o posición de memoria de 8 bits. No se permite la multiplicación inmediata. La
multiplicación de palabras es muy similar a la multiplicación de bytes. La diferencia es que AX
contiene el multiplicando en vez de AL, y el producto de 32 bits aparece en DX-AX en vez de AX.

La división ocurre en números de 8 o 16 bits. Estos números pueden ser enteros con signo (IDIV)
o sin signo (DIV). División de 8 bits. Esta división utiliza el registro AX para almacenar el
dividendo que se va a dividir entre el contenido de cualquier registro o posición de memoria.
La división de dieciséis bits es similar a la división de 8 bits, sólo que en vez de dividir entre AX, el
número de 16 bits se divide entre DX-AX, un dividendo de 32 bits. Después de una división de 16
bits, el cociente aparece en AX y el residuo aparece en DX.

III. OBJETIVOS

Al terminar esta práctica podrá:

1. Utilizar las instrucciones aritméticas y lógicas para realizar operaciones aritméticas simples con
números binarios, BCD y caracteres ASCII.

2. Utilizar las instrucciones ADD, SUB, MUL y DIV, exclusivo para realizar manipulaciones de bits
binarios.

3. Utilizar las instrucciones de desplazamiento y de desplazamiento cíclico.

4. Explicar la operación de las instrucciones de intercambio y suma, comparación e intercambio,


desplazamiento de doble precisión, evaluación de bits y exploración de bits del microprocesador
8086.

5. Revisar el contenido de una tabla para ver si concuerda con las instrucciones de las cadenas.
IV. DESARROLLO TEÓRICO

Instrucción Explicación

AND Realiza la función AND bit a bit en tamaño palabra o byte con los
operandos fuente y destino.

ADD Reemplaza el byte o palabra destino con la suma de los operandos


fuente y destino.

SUB Reemplaza el byte o palabra destino con la diferencia de los operandos


fuente y destino.

NEG Genera el complemento a 2 del operando destino byte o palabra.

CMP Substrae el operando fuente byte o palabra del operando destino; los
operandos permanecen sin cambios.

MUL Multiplicación sin signo de un operando fuente byte o palabra y


el acumulador; el producto se almacena en AX

DIV División sin signo del acumulador (para divisores de 8 bits) o


acumulador y DX (para divisores de 16 bits).

JMP Transfiere el control a la localidad de la etiqueta dentro del segmento.

JNZ Salta si no es igual o salta si no es cero

JS Salta si el signo es positivo

Declaración de variables y constantes.

Nombre Tipo de dato Valor inicial Comentario

Blanco_azul constante 1F h ;Color de pantalla y texto

SaludoLoc constante 0400 h ;Posición inicial del texto

Saludo DB (define byte) “cuál es tu nombre?” ;Saludo y pedir un usuario

numSelec DB (define byte) “Anota un entero” ;Pide un número

pressAnyKey DB (define byte) “Oprime una tecla” ;Pide presionar una tecla
V. DESARROLLO PRÁCTICO

Realizar una corrida de escritorio del PROGRAMA 3


RESULTADOS
Ejecución de Programa.

SUMA:

RESTA:
MULTIPLICACIÓN:

DIVISIÓN:
VI. MATERIAL Y EQUIPO

Se utilizó el software MASM y la máquina virtual DOSBox. También como Hardware se ocupó una
computadora de escritorio con un sistema operativo Windows 10.

Para realizar el reporte se ocupó Microsoft Word.

VII. OBSERVACIONES

Al realizar las primeras pruebas de nuestro programa nos dimos cuenta que estaba muy limitado
al uso números muy pequeños, esto se debió a que usamos operaciones de registros de 8 bits, al
modificar esto por registros de 16 tuvimos un mayor rango de operación.

Un problema que se nos presentó fueron las operaciones con números negativos en el caso de la
resta ya que cuando el primer número ingresado era menor al segundo se producía un resultado
negativo que por sí solo no podía representarse por lo que se usó la instrucción NEG AX que
convertía el número a complemento a 2 y con eso ya podíamos mostrar el resultado correcto.

Ya que es una calculadora básica nos limitamos al uso de únicamente números positivos, ya que
si manejamos números signados tendríamos que utilizar operaciones IMUL, IDIV y hacer
comprobaciones de signo.

Otro problema fue en la operación de la división, a la hora de imprimir el residuo ya que este se
mostraba en hexadecimal por lo que se tuvo que usar un enmascaramiento para poder dar el
resultado en decimal. A su vez otro problema lo tuvimos con el número cero ya que es sabido que
si se usa como dividendo el resultado es indefinido por lo que la ejecución del programa falla, por
lo que solo se permite ingresar números mayores a cero y menores a 15.

Para hacer la selección del menú se utilizó una estructura SWITCH-CASE construida con las
instrucciones CMP y JNZ.
VIII. CONCLUSIONES

Conclusión Adrian Gómez López.


La práctica nos permitió profundizar en el entendimiento de las instrucciones aritméticas y lógicas,
específicamente las instrucciones ADD, SUB, MOV y DIV.

Estas instrucciones son fundamentales para la manipulación de datos en la memoria del


computador. La instrucción ADD nos permite realizar operaciones de suma, mientras que SUB se
utiliza para las restas. Por otro lado, MOV es crucial para mover o copiar datos de un lugar a otro
en la memoria. Finalmente, la instrucción DIV nos permite realizar divisiones.

A través de esta práctica, pudimos apreciar cómo estas instrucciones básicas se combinan para
formar programas más complejos. Además, nos permitió entender mejor cómo funciona el
hardware a nivel más bajo y cómo se ejecutan las operaciones que normalmente damos por
sentado en lenguajes de programación de alto nivel.

Esta experiencia nos ha proporcionado una base sólida para explorar conceptos más avanzados
en la programación en lenguaje ensamblador y ha reforzado nuestra apreciación por la eficiencia
y la optimización en el código.

Conclusión Brenda Jimenez Sanchez.

En conclusión las instrucciones aritméticas y lógicas en ensamblador son una herramienta


poderosa para programadores que requieren un control extremadamente preciso sobre el
hardware y desean lograr un rendimiento óptimo en aplicaciones específicas, esto implica un
conocimiento profundo de la arquitectura del procesador subyacente. Esto puede ser necesario
en situaciones en las que se requiere un control muy preciso sobre el hardware, como en la
programación de controladores de dispositivos o sistemas embebidos. De igual manera las
instrucciones lógicas en ensamblador son una herramienta valiosa para programadores que
necesitan un control preciso a nivel de bits y desean optimizar el rendimiento de sus programas.
Aunque su uso es menos común en comparación con lenguajes de alto nivel, siguen siendo
esenciales en áreas como la programación de sistemas, el desarrollo de controladores de
hardware y la optimización de código crítico para el rendimiento.
Conclusión Victor Hugo Morales Quezada.

En conclusión esta práctica nos sirvió para identificar en qué casos debemos ocupar las
instrucciones aritmeticas y logicas, también resaltamos que al ejecutar instrucciones lógicas y
aritméticas, se modifican las banderas de estado en el registro de banderas, y se especifica
cuáles banderas son afectadas y su importancia en el resultado de las operaciones.

En el caso de las operaciones es muy importante poner un límite en cuanto a los números a
operar ya que hay algunas que solo se pueden llegar a mostrar números no mayores a 255 bits.
Cuando corrimos el programa con el debugger pudimos ver cómo se ejecuta paso a paso cada
línea de código, por lo cual igual me pareció algo interesante al ver cómo es que los datos se
guardaban en los registro y algunos permanecen y otros cambiaban de lugar.

Conclusión Hernández Camacho Brayan Ulises.

Al realizar esta práctica pudimos comprender mejor cómo trabajan las operaciones aritméticas de
suma, resta, multiplicacion y division en un lenguaje de programación de bajo nivel y que aquí es
muy importante la cantidad de números que se ingresan ya que tiene un límite a diferencia de un
lenguaje de programación de alto nivel donde podemos usar otros tipos de datos para extender
este límite, también vimos la limitación al trabajar con números con signo. Pudimos comprender
cómo es que se mueven los datos entre registros y cómo se van realizando las operaciones que
normalmente no vemos en otros lenguajes. Podemos concluir que el lenguaje ensamblador
necesita muchas más instrucciones para realizar ciertas funciones en las operaciones básicas ya
que aquí es más difícil usar excepciones y condicionales.

IX. BIBLIOGRAFÍA

[1]. – Irvine K. R., “Assembly Language for X86 Processors”, Prentice Hall, 6a ed.,2010

[2]. – Brey B. B., “Microprocesadores INTEL” Prentice Hall, 7a. Ed. 2006

También podría gustarte