Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GRUPO: CEL81
PROFESOR: VICTOR NOE TAPIA VARGAS
Práctica 3
EQUIPO 1:
Gómez López Adrián 2192000376
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 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
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.
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.
CMP Substrae el operando fuente byte o palabra del operando destino; los
operandos permanecen sin cambios.
pressAnyKey DB (define byte) “Oprime una tecla” ;Pide presionar una tecla
V. DESARROLLO PRÁCTICO
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.
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
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.
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.
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