6/2/2020
LABORATORIO DE SISTEMAS DIGITALES CON
MICROPROCESADORES
Modos de Direccionamiento
Modos de Direccionamiento
1. ¿Qué son los Modos de direccionamiento?
2. Formato de Instrucción
3. Ejemplo de Aplicaciones con todos los modos
de direccionamiento
1
6/2/2020
¿Qué son los Modos de Direccionamiento?
Los Modos de Direccionamiento son las diversas formas con las
que se puede indicar a un P dónde encontrar o depositar un dato,
en una instrucción. Identifica los operandos de la operación a
realizar, fuente y destino, de los datos sobre los que se operará.
Los operandos se pueden especificar por: un registro de la CPU,
una localidad de memoria, un puerto de Entrada/Salida o un dato
inmediato.
Existen dos grupos principales de Modos de Direccionamiento,
según los operandos se encuentren en registros o en memoria
serán: modos de Registro o modos de Memoria.
La dirección física de memoria o registro donde se encuentra
realmente el operando se llama Dirección Efectiva, y se representa
< ea >. Según el modo de direccionamiento utilizado, la CPU
tendrá que realizar unos cálculos distintos hasta obtener el valor
de dicha dirección efectiva.
Las instrucciones pueden contener hasta dos operandos que se
denominan Operando Fuente, el del lado derecho, y Operando
Destino, el del lado izquierdo. En estos casos, cada operando
tendrá su propio modo de direccionamiento.
Direccionamiento inmediato
Transfiere un byte o palabra de datos inmediato hacia
el operando destino. Este modo es usado para
inicializar registros o localidades de memoria y para
operar sobre ellos con valores constantes de datos.
Ejemplo: MOV AX,0ABCDH
MOV BL,12H
Las instrucciones que usan el modo de
direccionamiento inmediato obtienen el dato como
parte de la instrucción.
B8 00 10 MOV AX,1000H
Este modo no opera con registros de segmento, por lo
que no se puede cargar un registro de segmento
de manera inmediata.
2
6/2/2020
Direccionamiento por Registro
Transfiere un byte o palabra desde un registro fuente
hasta un registro destino.
Ej. MOV AX,CX
INC BX
El operando no requiere ninguna referencia de memoria.
Nota: Los dos operandos no pueden ser registros de
segmento.
El registro de segmento de código (CS) nunca puede
utilizarse como destino.
No se permite el acceso entre registros de segmento ni de
distintos tamaños.
Direccionamiento Directo
Transfiere un byte o palabra, contenido en una
localidad de memoria en el segmento DS, a un
registro de 8 o 16 bits. La localidad de memoria
puede ser el operando fuente o destino.
Ej: MOV AL,[1234H]
En el modo de direccionamiento directo, la dirección
de memoria se proporciona directamente como parte
de la instrucción (Puede ser a través de etiquetas, en
las cuales el programador no necesita conocer la
dirección numérica)
MOV AH, MEMBDS
8A 00 10 MOV AH,[MEMBDS] AH[1000H]
3
6/2/2020
Direccionamiento Indirecto
El modo de direccionamiento directo se usa para acceder
localidades de memoria de manera no frecuente. Sin embargo
cuando una localidad de memoria debe ser leída o escrita
varias veces dentro de un programa, la búsqueda repetida de
la dirección lógica hace este modo ineficiente. El modo de
direccionamiento indirecto resuelve este problema
almacenando esta dirección de memoria en un registro base
(BX, BP)o un registro índice (SI o DI)
MOV [DI],BH
MOV [BP],DL
8B 04 MOV AX, [SI] AL[SI]; AH[SI+1]
FF 25 JMP [DI] IP[DI+1:DI]
FE 46 00 INC BYTE PTR[BP] [BP][BP] + 1
FF 0F DEC WORD PTR[BX]b [BX+1:BX][BX+1:BX]-1
Direccionamiento Base más Índice
Transfiere un byte o palabra entre un registro y una
localidad de memoria direccionada por la suma de un
registro base más un registro índice.
Este modo es usado para el acceso a tablas.
Ej. MOV AX,[BX+DI]
En muchos casos, el registro base retiene la dirección
de inicio de un arreglo de memoria, y el registro índice
retiene la posición relativa de un dato en un arreglo.
8B 00 MOV AX,[BX+SI] AH[BX+SI+1], AL[BX+SI];
FF 21 JMP [BX+DI] IP[BX+DI+1:BX+DI];
FE 02 INC BYTE PTR[BP+SI] [BP+SI][BP+SI]+1 ;
FF 0B DEC WORD PTR[BP+DI] [BP+DI+1:BP+DI][BP+DI+1:BP+DI]-1
4
6/2/2020
Ejemplo Direccionamiento Base más Índice
Ej. Si se desea direccionar
los elementos en un
arreglo de datos
localizados en el segmento
de datos en la localidad
ARRAY + 5
DI ARRAY + 4
ARRAY + 3
ARRAY. Se requiere cargar
Elemento ARRAY + 2
ARRAY + 1
BX +
BX con la dirección ARRAY
ARRAY
ARRAY
y DI con el número del
elemento del arreglo que MOV AL,[BX+DI]
se desea acceder.
MOV BX, OFFSET ARRAY
MOV DI,3
MOV AL,[BX+DI]
Direccionamiento Relativo a Registro
Transfiere un byte o palabra entre un registro y una localidad de
memoria direccionada por un registro base o un registro índice
más un desplazamiento.
Si la localidad de memoria se direcciona por la suma de un
registro base y un desplazamiento, también se conoce como
direccionamiento basado.
Ej. MOV AX,[BX+10H]
Si la localidad de memoria se direcciona por la suma de un
registro índice y un desplazamiento, también se conoce
como direccionamiento indexado.
Ej. MOV AX,[SI+500H]
MOV AX,[BX+4]
MOV AX,ARRAY [SI]
MOV LIST[BP],CL
MOV ARRAY[DI],AL
10
5
6/2/2020
Direccionamiento Relativo Base más Índice (1)
Transfiere un byte o palabra entre un
registro y la localidad de memoria
direccionada por un registro base más un
registro índice más un desplazamiento.
Ej. MOV AX, [BX+SI+100H]
MOV AX, ARRAY[BX+DI]
MOV LIST[BP+DI],CL
11
Direccionamiento Relativo Base más Índice (2)
Este tipo de +
2
columna a2,3
a2,2
direccionamiento es DI=8
Renglón
a2,1
a2,0
a1,3 Renglón 2
usado comúnmente para +
a1,2
a1,1
a1,0 Renglón 1
direccionar arreglos de
a0,3
a0,2
BX a0,1
MATRIZ a
datos en memoria de dos 0,0
Renglón 0
dimensiones (matrices). MOV AL,[BX+DI+2]
Selecciona elemento a2,2
MOV BX, OFFSET MATRIZ
MOV DI,8
a0,0 a0,1 a0,2 a0,3
MOV AL,[BX+DI+2]
a1,0 a1,1 a1,2 a1,3
a2,0 a2,1 a2,2 a2,3
12
6
6/2/2020
Direccionamiento de string
En computación un string (cadena) es una secuencia
de bytes o palabras almacenadas en memoria. Una
tabla de datos es un ejemplo de string. Debido a su
importancia el 8086 tiene algunas instrucciones
diseñadas específicamente para manejar strings
(cadenas) de caracteres.
Estas instrucciones tienen un modo de
direccionamiento especial y usan a DS:SI para
apuntar al string fuente y a ES:DI para apuntar al
string destino.
MOVSB mueve el byte del dato fuente a la localidad
destino. SI y DI se incrementan o decrementan
automáticamente dependiendo del valor de la bandera
D.
13
Instrucciones de cadena
Instrucciones de Cadena (string)
Mnemónico Código Mnemónico Segmento Operación Descripción
general Objeto de memoria simbólica
Op-code
Operando
STOSB AA STOSB Extra ES:[DI]AL Transfiere un byte o palabra del registro
Si DF=0, DIDI+1 AL o AX a la cadena direccionada por DI
Si DF=1, DIDI-1 en el segmento extra; Si DF=0,
incrementa DI, de lo contrario
STOSW AB STOSW Extra ES:[DI] AL
decrementa DI; las banderas no son
ES:[DI+1] AH
afectadas.
Si DF=0, DIDI+2
Si DF=1, DIDI-2
LODSB AC LODSB Datos AL DS:[SI] Transfiere un byte o palabra de la
Si DF=0,SISI+1 cadena direccionada por SI en el
Si DF=1, SISI-1 segmento de datos al registro AL o AX;
Si DF=0, incrementa SI, de lo contrario
LODSW AD LODSW Datos ALDS:[SI]
decrementa SI; las banderas no son
AHDS:[SI+1]
afectadas.
Si DF=0, SISI+2
Si DF=1, SISI-2
14
7
6/2/2020
Tabla de Modos de Direccionamiento
Direccionamiento Cod. Ob. Mnemónico Segmento Operación simbólica
Inmediato B8 00 10 MOV AX,1000H Código AH10H; AL 00
Registro 8B D1 MOV DX,CX Dentro del CPU DXCX
Directo 8A 00 10 MOV AH,[MEMBDS] Datos AH[1000H]
Indirecto a registro 8B 04 MOV AX, [SI] Datos AL[SI]; AH[SI+1]
FF 25 JMP [DI] Datos IP[DI+1:DI]
FE 46 00 INC BYTE PTR[BP] Stack [BP][BP] + 1
FF 0F DEC WORD PTR[BX] Datos [BX+1:BX][BX+1:BX]-1
Indexado 8B 44 06 MOV AX,[SI+6] Datos AL[SI+6]; AH[SI+7]
FF 65 06 JMP [DI+6] Datos IP [DI+7:DI+6]
Basado 8B 46 02 MOV AX,[BP+2] Stack AL[BP+2]; AH[BP+3]
FF 67 02 JMP [BX+2]c Datos IP[BX+3:BX+2]
Base mas índice 8B 00 MOV AX,[BX+SI] Datos AL[BX+SI]; AH[BX+SI+1]
FF 21 JMP [BX+DI] Datos IP[BX+DI+1:BX+DI]
FE 02 INC BYTE PTR[BP+SI] Stack [BP+SI][BP+SI]+1
FF 0B DEC WORD PTR[BP+DI] Stack [BP+DI+1:BP+DI][BP+DI+1:BP+DI]-1
Relativo base mas 8B 40 05 MOV AX,[BX+SI+5] Datos AL[BX+SI+5]; AH[BX+SI+6]
índice FF 61 05 JMP [BX+DI+5] Datos IP[BX+DI+6:BX+DI+5]
FE 42 05 INC BYTE PTR[BP+SI+5] Stack [BP+SI+5][BP+SI+5]+1
FF 4B 05 DEC WORD PTR[BP+DI+5] Stack [BP+DI+6:BP+DI+5][BP+DI+6:BP+DI+5]-1
String A4 MOVSB Extra, Datos ES:[DI]DS:[SI]
Si DF=0, entonces SISI+1; DIDI+1
Si DF=1, entonces SISI-1; DIDI-1
15
Codificación en Lenguaje Máquina
Para convertir un programa en lenguaje
ensamblador a código máquina, se debe
convertir cada instrucción en lenguaje
ensamblador a su instrucción equivalente en
código máquina.
El código máquina especifica qué operación se
realizará, qué operando u operandos serán
usados (registros, localidad de memoria, dato
inmediato), el tamaño del dato (byte o palabra).
Toda la información se encuentra codificada en
los bits del código máquina de la instrucción.
16
8
6/2/2020
Codificación en Lenguaje Máquina
El código máquina de las
instrucciones del 8086 varía de 1 a 6
bytes. Las instrucciones de un byte
generalmente especifican operaciones
simples con un registro o un bit de
bandera.
El código máquina para las
instrucciones puede obtenerse del
siguiente formato general.
17
Codificación en Lenguaje Máquina
Formato de una Instrucción
18
9
6/2/2020
Codificación en Lenguaje Máquina
Formato de una Instrucción
El primer byte contiene la siguiente información:
El campo opcode (código de operación) especifica la
operación que será realizada.
El bit D indica la dirección del campo REG; D=0 si REG es
fuente, D=1 si REG es destino.
El bit W indica el tamaño de la operación; W=0 tamaño
byte, W=1 tamaño palabra.
El bit V se utiliza en instrucciones de rotación o
desplazamiento para indicar el número de cuenta; v=0 para
cuenta=1 y v=1 para usar cuenta en CL.
X indica que no importa el valor del bit
19
Codificación en Lenguaje Máquina
Formato de una Instrucción
El bit Z se utiliza con el prefijo de repetición en
instrucciones de cadena cuando se requiere comparar
con la bandera de cero (Z). El bit Z=1 indica que la
instrucción se repite mientras la bandera ZF=1, el bit
Z=0 indica que la instrucción se repite mientras la
bandera ZF=0.
En algunas instrucciones que utilizan dato inmediato se
requiere indicar el valor del campo “S”, el cual se emplea
de la siguiente manera:
Si los bits SW=01 entonces se requiere especificar los
16 bits del dato inmediato que se utilizará como
operando.
Si SW=11 entonces el byte de dato inmediato es
extendido en signo para formar el operando de 16 bits.
20
10
6/2/2020
Codificación en Lenguaje Máquina
Formato de una Instrucción
\ MOD 00 01 10 11 REG W=0 W=1
R/M
000 AL AX
000 [BX+SI] [BX+SI+D8] [BX+SI+D16] AL AX
001 CL CX
001 [BX+DI] [BX+DI+D8] [BX+DI+D16] CL CX
010 DL DX
010 [BP+SI] [BP+SI+D8] [BP+SI+D16] DL DX
011 BL BX
011 [BP+DI] [BP+DI+D8] [BP+DI+D16] BL BX
100 AH SP
100 [SI] [SI+D8] [SI+D16] AH SP
101 [DI] [DI+D8] [DI+D16] CH BP 101 CH BP
110 [Num16 bits] [BP+D8] [BP+D16] DH SI 110 DH SI
111 [BX] [BX+D8] [BX+D16] BH DI 111 BH DI
21
Ejemplos de
formatos de
Instrucciones
del 8086
22
11
6/2/2020
Ejemplos de
formatos de
Instrucciones
del 8086
23
Ejemplos de
formatos de
Instrucciones
del 8086
24
12
6/2/2020
Ejemplos de
formatos de
Instrucciones
del 8086
25
Ejemplos de
formatos de
Instrucciones
del 8086
26
13