Entregable 3
Entregable 3
Entregable 3
Maestro
Marco Antonio Salas Aceves
Materia
Microprocesadores
Fecha
06-02-21
Modos de direccionamiento
Se les llama modos de direccionamiento a las distintas formas de combinar los operandos
según el acceso que se hace a memoria. Dicho de otra manera, un modo de
direccionamiento será una forma de parámetro para las instrucciones. Una instrucción que
lleve un parámetro, por lo tanto, usará un modo de direccionamiento, que dependerá de
cómo direccionará al parámetro; una instrucción de dos parámetros combinará dos modos
de direccionamiento.
Direccionamiento implícito
Depende solamente de la instrucción, es decir, la instrucción no lleva parámetros.
Particularmente en instrucciones que no accesan memoria, o bien que tienen una forma
específica de accesarla.
Ejemplos: PUSHF, POPF, NOP
Modo registro
Usa solamente registros como operandos Es el más rápido, pues minimiza los recursos
necesarios (toda la información fluye dentro del EU del CPU)
Ejemplo:
MOV AX, BX
Ejemplo Simuproc
MSG imprimir lo ingresado 5 veces
LDT ingrese un numero
STA cx, 01a
MOV cx, 01b
MOV ax, 01a
MSG "+++++"
EAP
LOOP 005
HLT
#01b
0101
Modo inmediato
Tiene dos operandos: un registro y una constante que se usa por su valor. El valor
constante no se tiene que buscar en memoria, pues ya se obtuvo al hacer el “fetch” de la
instrucción.
Ejemplo:
MOV AH, 9
Modo directo
Uno de los operandos involucra una localidad específica de memoria El valor constante se
tiene que buscar en memoria, en la localidad especificada. Es más lento que los
anteriores, pero es el más rápido para ir a memoria, pues ya “sabe” la localidad, la toma
de la instrucción y no la tiene que calcular.
Ejemplo:
MOV AH, [0000]
MOV AH, Variable
Estas dos instrucciones serían equivalentes, si Variable está, por ejemplo, en la localidad
0 de memoria. En la forma primitiva del lenguaje de máquina, como el primer ejemplo, se
tiene que indicar “mover a AH el contenido (indicado por los corchetes), de la localidad 0
de los datos (lo de los datos es implícito). El lenguaje Ensamblador, sin embargo, nos
permite la abstracción del uso de variables, pero como una variable tiene una localidad
determinada en memoria, para el procesador funciona igual. La única diferencia consiste
en que el programador no tiene que preocuparse por la dirección, ese manejo lo hace
automáticamente el Ensamblador.
#SimuProc 1.4.2.0
MSG Sumar la cantidad 4 a dos numeros diferentes
LDT Introduzca el primer numero
PUSH AX
LDT Introduzca el segundo numero
PUSH AX
POP BX
POP AX
INC AX
INC BX
INC AX
INC BX
INC AX
INC BX
INC AX
INC BX
MSG El resultado de los dos numeros es:
EAP
XAB
EAP
HLT
Modo indirecto
Se usan los registros SI, DI como apuntadores El operando indica una localidad de
memoria, cuya dirección (sólo la parte desplazamiento) está en SI o DI. Es más lento que
los anteriores, pues tiene que “calcular” la localidad
Ejemplos:
MOV AL, [SI]
MOV BL, ES: [SI] ; Aquí se dice que se usa un “segment override”, donde se indica que
en vez de usar el segmento de datos por defecto, se use en su lugar como referencia el
segmento extra.
#SimuProc 1.4.2.0
MSG Sumar la cantidad 4 a dos numeros diferentes
LDT Introduzca el primer numero
ADD 20
STA 21
LDT Introduzca el segundo numero
ADD 20
STA 22
MSG El resultado de los dos numeros es:
LDA 21
EAP
LDA 22
EAP
HLT
#20
100
Modo indexado de base
Formato:
[
BX o BP
+ SI o DI (opcionales)
+ constante (opcional)
]
BX o BP indica una localidad base de la memoria A partir de BX o BP, se puede tener un
desplazamiento variable y uno constante La diferencia es el segmento sobre el que
trabajan por defecto:
BX por defecto en el segmento de datos
BP por defecto en el segmento de pila.
Ejemplos:
MOV AX, [BX]
MOV DX, [BX+2]
MOV CX, [BX+DI]
MOV DL, [BX+SI+3]
PUSHF
La instrucción PUSHF copia el contenido del registro de bandera a la pila. Al igual que la
instrucción PUSH, PUSHF almacena la parte más significativa del registro de banderas en
la localidad SP-1 y la menos significativa en la localidad SP-2. Después del almacenar el
registro de banderas, SP se decrementa 2 unidades.
POPF
La instrucción POPF realiza la operación inversa de PUSHF, POPF remueve de la pila un
dato de 16 bits que es cargado como el contenido del registro de banderas.
LAHF
Carga el registro AH con banderas, LAHF copia el byte de orden inferior del registro de
banderas en AH. Después de la ejecución de esta instrucción, los bits 7,6,4,2 y 1 de AH
son iguales a las banderas S, Z, A, P y C respectivamente.
SAHF
Almacena AH en el registro de banderas, SAHF copia el contenido de AH en el byte de
orden inferior del registro de banderas. Después de la ejecución de esta instrucción las
banderas S, Z, A, P y C son iguales a los bits 7, 6, 4, 2 y 1 de AH, respectivamente.
IN y OUT
La Tabla 2 muestra una lista de la forma de las instrucciones IN y OUT. Note que solo el
registro AL y AX están siendo utilizados para la transferencia de datos entre los
dispositivos de E/S y el microprocesador. La instrucción IN transfiere un dato desde un
puerto E/S al registro AL o AX, y la instrucción OUT transfiere un dato del registro AX o AL
a un puerto de E/S.
XCHG
La instrucción XCHG intercambia el contenido de cualquier registro con el contenido de
cualquier otro registro o localidad de memoria. no incluyendo los registros de segmento o
intercambios de memoria a memoria. La Tabla 3 muestra las formas de la instrucción
XCHG y el tamaño de esta.
XLAT
La instrucción XLAT (translate) convierte el contenido del registro AL en un numero
almacenado en una tabla. Esta instrucción se utiliza para realizar una técnica directa de
conversión de un código a otro (lookup table).
Una instrucción XLAT primero suma el contenido de AL con el contenido del registro BX
para formar una dirección del segmento de datos, luego el dato almacenado en esta
dirección es cargado en el registro AL. Esta instrucción no posee operando, ya que
siempre opera sobre AL.
LEA
La instrucción LEA se utiliza para cargar un registro con la dirección de un dato
especificado por un operando (Variable). En el primer ejemplo de la Tabla 4 la dirección
de DATA se almacena en el registro AX, cabe notar que la dirección y no el contenido de
la dirección DATA se almacena en el registro AX.
LDS y LES
Las instrucciones LDS y LES cargan un registro de 16 bits con un desplazamiento
(dirección) y el registro segmento DS o ES con una nueva dirección de segmento. Estas
instrucciones utilizan cualquier modo de direccionamiento a memoria válido para
seleccionar la localidad del nuevo desplazamiento y valor de segmento. En la Figura 3 se
muestra la operación de la instrucción LDS BX[DI] la cual transfiere la dirección de 32 bits
al registro BX y DS que inicia en la localidad de memoria direccionada por el registro DI.
Dado que la mantisa siempre se representa normalizada, el primer bit en q es siempre 1,
por lo que no es necesario almacenarlo proporcionando un bit significativo adicional. Esta
forma de almacenar un número en punto flotante se conoce con el nombre de técnica del
'bit fantasma'.
Se dice que un número real expresado como aparece en la ecuación (18) y que satisface
la ecuación (19) tiene la forma de punto flotante normalizado. Si además puede
representarse exactamente con |m| ocupando 7 bits y |q| ocupando 24 bits, entonces es
un número de máquina en el MARC-323
En lugar de una condición, se evalúa una expresión con múltiples pero finitos resultados,
ejecutándose en función del resultado de la expresión, un grupo de sentencias entre
múltiples posibles.
INSTRUCCIONES DE SALTO:
Se utilizan para realizar un salto, es decir, para transferir el control a un punto del
programa donde seguirá la ejecución de este, pero perdiendo toda posibilidad de retornar
de forma controlada la ejecución del programa al punto de llamada.
Este tipo de instrucciones también son conocidas como bucles, ciclos o lazos. Lo que
hacen es que mientras se verifique una condición, un segmento del algoritmo o programa
se repita consecutivamente.
En cada repetición del bucle (o iteración) se evalúa la expresión de control del bucle (o
condición), que determinará si continuamos realizando otra iteración o bien salimos
definitivamente del bucle.
Podemos distinguir tres tipos de bucles, dependiendo de que la condición de control del
bucle se evalúe antes o después de cada iteración, y de que se pueda fijar de antemano o
no el número de iteraciones a realizar.