Está en la página 1de 7

MEMORIA TECNICA DE LABORATORIO DE

ARQUITECTURA DE OREDENADORES
UNIVERSIDAD: UNIVERSIDAD CENTRAL DEL ECUADOR

FACULTAD: INGENIERIA EN CIENCIAS FISICAS Y MATEMATICAS

CARRERA: INGENIERIA EN INFORMATICA

CONTENIDO:
1. ¿Cuántos bytes se almacenan en la pila por un PUSH AX?
Para el siguiente ejercicio tenemos esta sencilla instrucción

Básicamente la instrucción de pila PUSH, AX mueve a la pila el valor que se encuentra en AX, por lo tanto
el máximo número que se puede almacenar en pila, es la máxima capacidad del registrador AX, que es 2
bytes (16 bits).
2. Forme una instrucción JMP que salta a la dirección señalada por el registro BX.

En este ejercicio, se coloca una dirección especifica en BX, en este caso es 0111H (En esta dirección se
encuentra la instrucción MOV AX, 5) por lo tanto cuando se ejecuta la instrucción JMP BX, dará un salto a
la instrucción mencionada anteriormente.

3. Desarrolle una estructura de datos que tenga cinco campos de una palabra cada uno de ellos
denominados F1, F2, F3, F4 y F5 con un nombre de estructura de FIELDS.
Se reservan 5 espacios de memoria para las palabras, llamadas F1, F2,F3, F4, F5.
Luego se reserva un espacio de memoria llamado CAMPOS con 5 elementos, ahí van lo que está
guardado en memoria para F1, F2, F3,F 4, F5, respectivamente.

4. Sumar 2 números Hexadecimales

Este algoritmo, mueve al registro AX, el valor de 50H, luego mueve el valor de 100H al registrador.
A continuación con la instrucción add suma AX y BX, cabe recalcar que el resultado lo coloca en el
registro AX.
La directiva ORG 100H indica al ensamblador que continúe el ensamblado a partir de la dirección dada
por el argumento, en este caso 100H.
La instrucción RET, se utiliza para retornar el control al sistema operativo.

5. Sumar 2 números de 128 bits (Binarios)


El siguiente ejercicio se explicara por partes.

La directiva .MODEL define el tipo de memoria que se utilizara, la directiva .CODE nos indica que lo que
está a continuación es nuestro programa, la directiva .DATA nos permite asignar datos o variables en
memoria, la directiva .STARTUP le indica al programa donde iniciar.
Para este ejercicio se reservó espacios de memoria para tres vectores, cada uno con 129 elementos
llamados: num1, num2, num3.
Con directiva DB se reserva memoria para elementos de 8 bits cada uno.
A num1 y num2, se establecieron valores binarios ya que la suma va a ser exclusivamente en binario, a
num3, solamente se reservó espacios vacíos de memoria para ser llenados luego.
Se inicializa el registro SI con 128 decimal (para indicar la posición de cada elemento del vector), y el
registro BI con 0, (para llevar un contador de acarreo).
Se define las etiquetas suma, acarreo3, acarreo2, acarreo1, acarreo0.
A partir de la etiqueta “suma” tenemos las siguientes instrucciones:

Se mueve al registro AL el valor del vector “num1” en la posición indicada por SI


Se suma el valor de AL, con el valor del vector “num2” en la posición indicada por SI
Se suma el acarreo.

Con esto se logra que se sume la cifra menos significativa del número. El resultado se guarda en AL

A continuación se compara con la instrucción CMP, el dato en el registro AL, con los números 3, 2, 1, 0,
que son las posibles respuestas. La instrucción --JE “etiqueta”—ejecuta el código que se encuentra en la
etiqueta, si ambos números son iguales.
Si el resultado de la suma es 3 (11 binario) se ejecutara las instrucciones a partir de la etiqueta
“acarreo3”

Esta instrucción básicamente cumple la función de “poner 1 y llevar 1”.


Es decir coloca el valor 1 en la posición [SI] del el espacio de memoria reservado para “num3”
Luego guarda un acarreo de 1 en BL
Compara si el registrador SI=0, si se cumple, se finaliza el programa, caso contrario salta la instrucción
salir y decrementa el registro SI y vuelve a ejecutar la suma del vector.
Cuando el registro SI llegue a cero, significa que ya no quedan números más significativos para sumar,
por lo tanto la ejecución finaliza.
Si el resultado de la suma es 2 (10 binario) se ejecutara las instrucciones a partir de la etiqueta
“acarreo2”

Esta instrucción cumple la función de “poner 0 y llevar 1”.


Es decir coloca el valor 0 en la posición [SI] del el espacio de memoria reservado para “num3”
Luego guarda un acarreo de 1 en BL
Compara si el registrador SI=0, si se cumple, se finaliza el programa, caso contrario salta la instrucción
salir y decrementa el registro SI y vuelve a ejecutar la suma del vector.
Si el resultado de la suma es 1 (01 binario) se ejecutara las instrucciones a partir de la etiqueta
“acarreo1”

Esta instrucción cumple la función de “poner 1 y llevar 0”.


Es decir coloca el valor 1 en la posición [SI] del el espacio de memoria reservado para “num3”
Luego guarda un acarreo de 0 en BL
Compara si el registrador SI=0, si se cumple, se finaliza el programa, caso contrario salta la instrucción
salir y decrementa el registro SI y vuelve a ejecutar la suma del vector.
Si el resultado de la suma es 0 (00 binario) se ejecutara las instrucciones a partir de la etiqueta
“acarreo0”

Esta instrucción cumple la función de “poner 0 y llevar 0”.


Es decir coloca el valor 0 en la posición [SI] del el espacio de memoria reservado para “num3”
Luego guarda un acarreo de 0 en BL
Compara si el registrador SI=0, si se cumple, se finaliza el programa, caso contrario salta la instrucción
salir y decrementa el registro SI y vuelve a ejecutar la suma del vector.

Todo esto seguirá como un bucle hasta que el tamaño del vector (el valor del registro SI) sea cero.
En ese caso se ejecutara la etiqueta salir que tiene la instrucción .exit, con lo cual se retorna el control al
sistema operativo y se finaliza el programa

6. Escriba un procedimiento que multiplique DI por SI y luego divida el resultado por 100H.
Asegúrese de que el resultado se deja en AX al regresar del procedimiento. Este procedimiento
no puede cambiar ningún registro excepto AX.
Primeramente se almacena en memoria el número 100h con la directiva dw (Define Word; que almacena
datos de 16 bits)
Se coloca en el registro DI, el valor 20h, luego se coloca en el registro SI, el valor 200h.
A continuación se procede a mover el valor almacenado en DI, al registrador AX.
La instrucción MUL trabaja con el valor que se encuentre en ese momento en el registro AX y el valor que
se le asigne (en este caso SI), la respuesta la coloca en AX
Igualmente es con la instrucción DIV, la cual trabaja con el valor que se encuentra en AX, y el valor que se
le asigna (En este caso es el valor reservado en memoria 100h)
Se da el control al sistema operativo.
De esta manera no se afectan los demás registradores, ya que trabajamos únicamente con el registrador
AX.

7. Escriba un procedimiento que suma AX, BX, CX y DX. Si se produce un acarreo coloque un 1 en
DI. Si no ocurre el acarreo, coloque un 0 en DI. La suma debe encontrarse en AX después de la
ejecución de su procedimiento.

Inicializamos AX=3000, BX=20000, CX=10000, DX=5535, luego se suma lo que está en AX, con lo que se
encuentra en BX.

La instrucción JC saltara a la etiqueta solamente si la bandera CF (CF indica la existencia de acarreo) se


activa, o se coloca en 1.
La instrucción JNC saltara a la etiqueta solamente si la bandera CF (CF indica la existencia de acarreo) no
está activa, o se mantiene en 0.

De esta manera si la suma excede el tamaño del registrador AX, se activara la bandera de acarreo, se
ejecutara la etiqueta “acarreo”, la cual coloca un 1 en el registrador DX, y finaliza el programa

Si la suma no excede el tamaño máximo del registrador AX, se ejecutara la etiqueta “noacarreo”, la cual
coloca el registro DX un cero, y se retorna el control al sistema operativo, finalizando de esta manera el
programa.

8. Desarrollar una secuencia de instrucciones que busque a través de un bloque de 100H bytes de
memoria. Este programa debe contar todos los números sin signo que están por encima de
42H y todos los que están por debajo de 42H.

Es este procedimiento, se hace una reserva de memoria para un vector de 100h elementos (256 dec)

El vector esta con números entre 0 y 100 (decimales aleatorios). El programa deberá comparar si los
números son menores o mayores a 66 (42h) y guardar cuantos hay de cada uno en dos registros.

Definimos los arreglos SI, BL, BH en cero, SI servirá como variable para recorrer el vector, BL guardara
cuantos números iguales o menores a 42h existen en el vector, y BH guardara cuantos números mayores
a 42h existen.

De esta manera primeramente se compara si SI ha llegado a cero, para ejecutar la etiqueta “salir”, caso
contrario continuara la ejecución moviendo al registro AL, el valor del vector en la posición [SI], se
incrementara [SI] y se compara el numero en al con 45 gracias a la instrucción cmp
Si es igual o menor se activara el salto jbe, el cual saltara a la etiqueta aumentar BL, la cual va
aumentando de uno en uno el registro BL

De igual manera si es mayor a 45, se activara el salto ja, el cual automáticamente direcciona a la etiqueta
aumentar BH, la cual aumenta de uno en uno conforme avanza el ciclo

Cuando [SI] haya llegado a cero, se ejecutara la etiqueta salir, la cual retornara el control al sistema
operativo y de esta manera finalizara el programa.

9. Desarrolle una secuencia corta de instrucciones que utilice la construcción REPEAT-UNTIL para
copiar el contenido de la memoria de tamaño byte BLOCKA en la memoria de tamaño de byte
BLOCKB hasta que se mueva 00H.

En el siguiente procedimiento, primeramente se reservan 2 espacios de memoria, una llamada “BLOCKA”


donde se almacenan números hexadecimales, y otro llamado “BLOCKB” donde solamente se reservan
espacios de memoria vacíos para ser llenados luego.

Dado que no existía una instrucción REPEAT-UNTIL, se realizó la misma instrucción con los comandos
loop y cmp.

Primeramente se establece el registro SI en cero, el cual nos va a ser de utilidad para recorrer el vector.

Empezamos el ciclo en la etiqueta “empezar”, de esta manera primeramente movemos al registro AL, el
valor del vector BLOCKA en la posición [SI], para luego enviar el valor encontrado en AL, al vector
BLOCKB en la posición [SI], Se incrementa SI.

Como el número que se va a cambiar de posición queda almacenado durante un momento en AL, se
compara ese número con 00H, si el número es efectivamente 00h, se sale del ciclo y se finaliza el
programa, caso contrario, la instrucción loop, vuelve a repetir el ciclo a partir de la etiqueta “empezar”.

De esta manera lograremos mover todos los valores que están en BLOCKA a BLOCKB, hasta que aparezca
el número 00H.