Está en la página 1de 14

MODOS DE DIRECCIONAMIENTO.

Son los distintos modos de acceder a los datos en memoria por parte del procesador. Antes de ver
los modos de direccionamiento, echaremos un vistazo a la sintaxis general de las instrucciones,
ya que pondremos alguna en los ejemplos:
INSTRUCCIN

DESTINO, FUENTE

Donde destino indica dnde se deja el resultado de la operacin en la que pueden participar
(segn casos) FUENTE e incluso el propio DESTINO. Hay instrucciones, sin embargo, que slo
tienen un operando, como la siguiente, e incluso ninguno:
INSTRUCCIN

DESTINO

Como ejemplos, aunque no hemos visto an las instrucciones utilizaremos un par de ellas:

Copia o movimiento de datos (MOV) y


Suma (ADD).

ORGANIZACIN DE DIRECCIONES: SEGMENTACIN.


Como ya sabemos, los microprocesadores 8086 y compatibles poseen registros de un tamao
mximo de 16 bits que direccionaran hasta 64K; en cambio, la direccin se compone de 20 bits
con capacidad para 1Mb, hay por tanto que recurrir a algn artificio para direccionar toda la
memoria.
Dicho artificio consiste en la segmentacin: se trata de dividir la memoria en grupos de 64K.
Cada grupo se asocia con un registro de segmento; el desplazamiento (offset) dentro de ese
segmento lo proporciona otro registro de 16 bits.
La direccin absoluta se calcula multiplicando por 16 el valor del registro de segmento y
sumando el offset, obtenindose una direccin efectiva de 20 bits. Esto equivale a concebir el
mecanismo de generacin de la direccin absoluta, como si se tratase de que los registros de
segmento tuvieran 4 bits a 0 (imaginarios) a la derecha antes de sumarles el desplazamiento:

direccin = segmento * 16 + offset


En la prctica, una direccin se indica con la notacin (SEGMENTO: OFFSET); adems, una
misma direccin puede expresarse de ms de una manera: por ejemplo,
3D00h:0300h es equivalente a 3D30:0000h.
Es importante resaltar que no se puede acceder a ms de 64 Kb en un segmento de datos. Por
ello, en los procesadores 386 y superiores no se deben emplear registros de 32 bit para generar
direcciones (bajo DOS), aunque para los clculos pueden ser interesantes (no obstante, s sera
posible configurar estos procesadores para poder direccionar ms memoria bajo DOS con los
registros de 32 bits, aunque no resulta por lo general prctico).

MODOS DE DIRECCIONAMIENTO
Una instruccin de 8088/8086 no solo contienen informacin sobre la operacin particular a
realizar, sino que tambin incluye las especificaciones para el tipo de operando a manipular, as
como tambin la posicin de estos operandos. El microprocesador determina el modo de
direccionamiento que es aludido por la sintaxis de la instruccin. Son siete los modos mas
importantes de direccionamiento.

Direccionamiento inmediato
Direccionamiento de registros
Direccionamiento directo
Direccionamiento indirecto de registros
Direccionamiento relativo a base
Direccionamiento indexado directo
Direccionamiento indexado a base

DIRECCIONAMIENTO INMEDIATO
El operando es una constante situada detrs del cdigo de la instruccin. Sin embargo, como
registro destino no se puede indicar uno de segmento (habr que utilizar uno de datos como paso
intermedio).
ADD AX,0fffh
El nmero hexadecimal 0fffh es la constante numrica que en el direccionamiento inmediato se
le sumar al registro AX.
Al trabajar con ensambladores, se pueden definir smbolos constantes (ojo, no variables) y es
ms intuitivo:
Dato EQU 0fffh;
MOV AX, Dato

smbolo constante

Si se referencia a la direccin de memoria de una variable de la siguiente forma, tambin se trata


de un caso de direccionamiento inmediato:
Dato

DW 0fffh;
ahora es una variable
MOV AX,OFFSET dato ; AX = "direccin de memoria" de dato

Porque hay que tener en cuenta que cuando traduzcamos a nmeros el smbolo podra quedar:
17F3:0A11 DW FFF
MOV AX,0A11

DIRECCIONAMIENTO DE REGISTROS
Los operandos, necesariamente de igual tamao, estn contenidos en los registros indicados en la
instruccin:
MOV DX,AX
MOV AH,AL
Este puede ser un valor de 8 o 16 bits, el microprocesador interpreta la longitud del operando por
el nombre del registro.

DIRECCIONAMIENTO DIRECTO
El operando est situado en la direccin indicada en la instruccin , relativa al
segmento que se trate:
MOV AX,[57D1h]
MOV AX,ES:[429Ch]

Esta sintaxis (quitando la 'h' de hexadecimal) sera la que admite el programa DEBUG
(realmente habra que poner, en el segundo caso, ES: en una lnea y el MOV en otra). Al trabajar
con ensambladores, las variables en memoria se pueden referenciar con etiquetas simblicas:
MOV AX,dato
MOV AX,ES:dato
dato

DW 1234h

; variable del programa

En el primer ejemplo se transfiere a AX el valor contenido en la direccin apuntada por la


etiqueta dato sobre el segmento de datos (DS) que se asume por defecto; en el segundo ejemplo
se indica de forma explcita el segmento tratndose del segmento ES. La direccin efectiva se
calcula de la forma ya vista con anterioridad: Registro de 8segmento * 16 +
desplazamiento_de_dato (este desplazamiento depende de la posicin al ensamblar el programa).

DIRECCIONAMIENTO INDIRECTO DE REGISTROS:


El operando se encuentra en una direccin sealada por un registro de segmento*16 ms un
registro base (BX/BP) o ndice (SI/DI). (Nota: BP acta por defecto con SS).
MOV AX,[BP]
MOV ES:[DI],AX

; AX = [SS*16+BP]
; [ES*16+DI] = AX

RELATIVO DE BASE
La direccin de un operando se obtiene de la suma del numero y el contenido de un registro base
(el BX o el BP), relativo al segmento seleccionado. El modo relativo a base es mas usado
frecuentemente para acceder a estructuras de datos complejas.

INDIRECTO INDEXADO DIRECTO


El operando se encuentra en una direccin determinada por la suma de un registro de
segmento*16, un registro de ndice, SI o DI y un desplazamiento de 8 16 bits. Ejemplos:
MOV AX,[DI+DESP]
ADD [SI+DESP],BX

MOV AX,desp[DI]
ADD desp[SI],BX

INDIRECTO CON BASE E NDICE O INDEXADO A BASE:


El operando se encuentra en una direccin especificada por la suma de un registro de
segmento*16, uno de base, uno de ndice y opcionalmente un desplazamiento de 8 16 bits:
MOV AX,ES:[BX+DI+DESP]
MOV CS:[BX+SI+DESP],CX

MOV AX,ES:desp[BX][DI]
MOV CS:desp[BX][SI],CX

Combinaciones de registros de segmento y desplazamiento.


Como se ve en los modos de direccionamiento, hay casos en los que se indica explcitamente el
registro de segmento a usar para acceder a los datos. Existen unos segmentos asociados por
defecto a los registros de desplazamiento (IP, SP, BP, BX, DI, SI); slo es necesario declarar el
segmento cuando no coincide con el asignado por defecto. En ese caso, el ensamblador genera
un byte adicional (a modo de prefijo) para indicar cul es el segmento referenciado. La siguiente
tabla relaciona las posibles combinaciones de los registros de segmento y los de desplazamiento:
CS
SS
DS
IP S
No
No
SP No
S
No
BP con prefijo
por defecto
con prefijo
BX con prefijo
con prefijo
por defecto
SI con prefijo
con prefijo
por defecto
DI con prefijo
con prefijo
por defecto
(1) Tambin por defecto en el manejo de cadenas.

ES
No
No
con prefijo
con prefijo
con prefijo
con prefijo(1)

Los 386 y superiores admiten otros modos de direccionamiento ms sofisticados, que se vern en
el prximo captulo, despus de conocer todas las instrucciones del 8086. Por ahora, con todos
estos modos se puede considerar que hay ms que suficiente. De hecho, algunos se utilizan en
muy contadas ocasiones.

Instrucciones de 8086 y 8088

INSTRUCCIONES DE TRANSFERENCIA DE DATOS (No afectan flags)


MOV dest,src
Copia el contenido del operando fuente (src) en el destino (dest).
Operacin: dest <- src
Las posibilidades son:
1.

MOV reg,{reg|mem|inmed}

2.

MOV mem,{reg|inmed}

3.

MOV {reg16|mem16},{CS|DS|ES|SS}

4.

MOV {DS|ES|SS},{reg16|mem16}

PUSH src
Pone el valor en el tope del stack.
Operacin: SP <- SP - 2, [SP+1:SP] <- src donde src = {reg16|mem16|CS|DS|ES|SS}.
POP dest
Retira el valor del tope del stack ponindolo en el lugar indicado.
Operacin: dest <- [SP+1:SP], SP <- SP + 2 donde dest = {reg16|mem16|DS|ES|SS}.
XCHG reg,{reg|mem}
Intercambia ambos valores.
IN {AL|AX},{DX|inmed (1 byte)}
Pone en el acumulador el valor hallado en el port indicado.
OUT {DX|inmed (1 byte)},{AL|AX}
Pone en el port indicado el valor del acumulador.
XLAT
Realiza una operacin de traduccin de un cdigo de un byte a otro cdigo de un byte mediante una tabla.
Operacin: AL <- [BX+AL]
LEA reg,mem
Almacena la direccin efectiva del operando de memoria en un registro.
Operacin: reg <- direccin mem
LDS reg,mem32
Operacin: reg <- [mem], DS <- [mem+2]
LES reg,mem32
Operacin: reg <- [mem], ES <- [mem+2]
LAHF
Copia en el registro AH la imagen de los ocho bits menos significativos del registro de indicadores.
Operacin: AH <- SF:ZF:X:AF:X:PF:X:CF
SAHF
Almacena en los ocho bits menos significativos del registro de indicadores el valor del registro AH.
Operacin: SF:ZF:X:AF:X:PF:X:CF <- AH
PUSHF
Almacena los flags en la pila.
Operacin: SP <- SP - 2, [SP+1:SP] <- Flags.
POPF
Pone en los flags el valor que hay en la pila.
Operacin: Flags <- [SP+1:SP], SP <- SP + 2

INSTRUCCIONES ARITMETICAS (Afectan los flags AF, CF, OF, PF, SF, ZF)
ADD dest,src
Operacin: dest <- dest + src.
ADC dest,src
Operacin: dest <- dest + src + CF.
SUB dest,src
Operacin: dest <- dest - src.
SBB dest,src
Operacin: dest <- dest - src - CF.
CMP dest,src
Operacin: dest - src (slo afecta flags).
INC dest
Operacin: dest <- dest + 1 (no afecta CF).
DEC dest
Operacin: dest <- dest - 1 (no afecta CF).
NEG dest
Operacin: dest <- - dest.
donde dest = {reg|mem} y src = {reg|mem|inmed} no pudiendo ambos operandos estar en memoria.
DAA
Corrige el resultado de una suma de dos valores BCD empaquetados en el registro AL (debe estar
inmediatamente despus de una instruccin ADD o ADC). OF es indefinido despus de la operacin.
DAS
Igual que DAA pero para resta (debe estar inmediatamente despus de una instruccin SUB o SBB).
AAA
Lo mismo que DAA para nmeros BCD desempaquetados.
AAS
Lo mismo que DAS para nmeros BCD desempaquetados.
AAD
Convierte AH:AL en BCD desempaquetado a AL en binario.
Operacin: AL <- AH * 0Ah + AL, AH <- 0. Afecta PF, SF, ZF, mientras que AF, CF y OF quedan
indefinidos.
AAM
Convierte AL en binario a AH:AL en BCD desempaquetado.
Operacin: AH <- AL / 0Ah, AL <- AL mod 0Ah. Afecta PF, SF, ZF, mientras que AF, CF y OF quedan
indefinidos.
MUL {reg8|mem8}
Realiza una multiplicacin con operandos no signados de 8 por 8 bits.
Operacin: AX <- AL * {reg8|mem8}. CF=OF=0 si AH = 0, CF=OF=1 en caso contrario. AF, PF, SF, ZF
quedan indefinidos.
MUL {reg16|mem16}
Realiza una multiplicacin con operandos no signados de 16 por 16 bits.
Operacin: DX:AX <- AX * {reg16|mem16}. CF=OF=0 si DX = 0, CF=OF=1 en caso contrario. AF, PF, SF,
ZF quedan indefinidos.
IMUL {reg8|mem8}
Realiza una multiplicacin con operandos con signo de 8 por 8 bits.
Operacin: AX <- AL * {reg8|mem8} realizando la multiplicacin con signo. CF = OF = 0 si el resultado
entra en un byte, en caso contrario valdrn 1. AF, PF, SF, ZF quedan indefinidos.
IMUL {reg16|mem16}
Realiza una multiplicacin con operandos con signo de 16 por 16 bits.
Operacin: DX:AX <- AX * {reg16|mem16} realizando la multiplicacin con signo. CF = OF = 0 si el
resultado entra en dos bytes, en caso contrario valdrn 1. AF, PF, SF, ZF quedan indefinidos.
CBW
Extiende el signo de AL en AX. No se afectan los flags.
CWD
Extiende el signo de AX en DX:AX. No se afectan flags.

INSTRUCCIONES LOGICAS (Afectan AF, CF, OF, PF, SF, ZF)


AND dest,src
Operacin: dest <- dest and src.
TEST dest,src
Operacin: dest and src. Slo afecta flags.
OR dest,src
Operacin: dest <- dest or src.
XOR dest,src
Operacin: dest <- dest xor src.
Las cuatro instrucciones anteriores ponen CF = OF = 0, AF queda indefinido y PF, SF y ZF dependen del resultado.
NOT dest
Operacin: dest <- Complemento a 1 de dest. No afecta los flags.
SHL/SAL dest,{1|CL}
Realiza un desplazamiento lgico o aritmtico a la izquierda.
SHR dest,{1|CL}
Realiza un desplazamiento lgico a la derecha.
SAR dest,{1|CL}
Realiza un desplazamiento aritmtico a la derecha.
ROL dest,{1|CL}
Realiza una rotacin hacia la izquierda.
ROR dest,{1|CL}
Realiza una rotacin hacia la derecha.
RCL dest,{1|CL}
Realiza una rotacin hacia la izquierda usando el CF.
RCR dest,{1|CL}
Realiza una rotacin hacia la derecha usando el CF.
En las siete instrucciones anteriores la cantidad de veces que se rota o desplaza puede ser un bit o la cantidad de bits
indicado en CL.

INSTRUCCIONES DE MANIPULACION DE CADENAS:


MOVSB
Copiar un byte de la cadena fuente al destino.
Operacin:
1.

ES:[DI] <- DS:[SI] (un byte)

2.

DI <- DI1

3.

SI <- SI1

MOVSW
Copiar dos bytes de la cadena fuente al destino.
Operacin:
1.

ES:[DI] <- DS:[SI] (dos bytes)

2.

DI <- DI2

3.

SI <- SI2

LODSB
Poner en el acumulador un byte de la cadena fuente.
Operacin:
1.

AL <- DS:[SI] (un byte)

2.

SI <- SI1

LODSW
Poner en el acumulador dos bytes de la cadena fuente.
Operacin:
1.

AX <- DS:[SI] (dos bytes)

2.

SI <- SI2

STOSB
Almacenar en la cadena destino un byte del acumulador.
Operacin:
1.

ES:[DI] <- AL (un byte)

2.

DI <- DI1

STOSW
Almacenar en la cadena destino dos bytes del acumulador.
Operacin:
1.

ES:[DI] <- AX (dos bytes)

2.

DI <- DI2

CMPSB
Comparar un byte de la cadena fuente con el destino.
Operacin:
1.

DS:[SI] - ES:[DI] (Un byte, afecta slo los flags)

2.

DI <- DI1

3.

SI <- SI1

CMPSW
Comparar dos bytes de la cadena fuente con el destino.
Operacin:
1.

DS:[SI] - ES:[DI] (Dos bytes, afecta slo los flags)

2.

DI <- DI2

3.

SI <- SI2

SCASB
Comparar un byte del acumulador con la cadena destino.
Operacin:
1.

AL - ES:[DI] (Un byte, afecta slo los flags)

2.

DI <- DI1

SCASW
Comparar dos bytes del acumulador con la cadena destino.
Operacin:
1.

AX - ES:[DI] (Dos byte, afecta slo los flags)

2.

DI <- DI2

En todos los casos el signo + se toma si el indicador DF vale cero. Si vale 1 hay que tomar el signo -.

Prefijo para las instrucciones MOVSB, MOVSW, LODSB, LODSW, STOSB y STOSW:

REP: Repetir la instruccin CX veces.

Prefijos para las instrucciones CMPSB, CMPSW, SCASB, SCASW:

REPZ/REPE: Repetir mientras que sean iguales hasta un mximo de CX veces.

REPNZ/REPNE: Repetir mientras que sean diferentes hasta un mximo de CX veces.

INSTRUCCIONES DE TRANSFERENCIA DE CONTROL (No afectan los flags):


JMP label
Saltar hacia la direccin label.
CALL label
Ir al procedimiento cuyo inicio es label. Para llamadas dentro del mismo segmento equivale a PUSH IP:
JMP label, mientras que para llamadas entre segmentos equivale a PUSH CS: PUSH IP: JMP label.
RET
Retorno de procedimiento.
RET inmed
Retorno de procedimiento y SP <- SP + inmed.
Variaciones de la instruccin de retorno:
RETN [inmed]
En el mismo segmento de cdigo. Equivale a POP IP [:SP <- SP + inmed].
RETF [inmed]
En otro segmento de cdigo. Equivale a POP IP: POP CS [:SP <- SP + inmed]
Saltos condicionales aritmticos (usar despus de CMP):

Aritmtica signada (con nmeros positivos, negativos y cero)


JL etiqueta/JNGE etiqueta
Saltar a etiqueta si es menor.
JLE etiqueta/JNG etiqueta
Saltar a etiqueta si es menor o igual.
JE etiqueta
Saltar a etiqueta si es igual.
JNE etiqueta
Saltar a etiqueta si es distinto.
JGE etiqueta/JNL etiqueta
Saltar a etiqueta si es mayor o igual.
JG etiqueta/JNLE etiqueta
Saltar a etiqueta si es mayor.

Aritmtica sin signo (con nmeros positivos y cero)

JB etiqueta/JNAE etiqueta
Saltar a etiqueta si es menor.
JBE etiqueta/JNA etiqueta
Saltar a etiqueta si es menor o igual.
JE etiqueta
Saltar a etiqueta si es igual.
JNE etiqueta
Saltar a etiqueta si es distinto.
JAE etiqueta/JNB etiqueta
Saltar a etiqueta si es mayor o igual.
JA etiqueta/JNBE etiqueta
Saltar a etiqueta si es mayor.
Saltos condicionales segn el valor de los indicadores:
JC label
Saltar si hubo arrastre/prstamo (CF = 1).
JNC label
Saltar si no hubo arrastre/prstamo (CF = 0).
JZ label
Saltar si el resultado es cero (ZF = 1).
JNZ label
Saltar si el resultado no es cero (ZF = 0).
JS label
Saltar si el signo es negativo (SF = 1).
JNS label
Saltar si el signo es positivo (SF = 0).
JP/JPE label
Saltar si la paridad es par (PF = 1).
JNP/JPO label

Saltar si la paridad es impar (PF = 0).


Saltos condicionales que usan el registro CX como contador:
LOOP label
Operacin: CX <- CX-1. Saltar a label si CX<>0.
LOOPZ/LOOPE label
Operacin: CX <- CX-1. Saltar a label si CX <> 0 y ZF = 1.
LOOPNZ/LOOPNE label
Operacin: CX <- CX-1. Saltar a label si CX <> 0 y ZF = 0.
JCXZ label
Operacin: Salta a label si CX = 0.
Interrupciones:
INT nmero
Salva los flags en la pila, hace TF=IF=0 y ejecuta la interrupcin con el nmero indicado.
INTO
Interrupcin condicional. Si OF = 1, hace INT 4.
IRET
Retorno de interrupcin. Restaura los indicadores del stack.

INSTRUCCIONES DE CONTROL DEL PROCESADOR


CLC
CF <- 0.
STC
CF <- 1.
CMC
CF <- 1 - CF.
NOP
No hace nada.
CLD
DF <- 0 (Direccin ascendente).
STD
DF <- 1 (Direccin descendente).
CLI
IF <- 0 (Deshabilita interrupciones enmascarables).
STI
IF <- 1 (Habilita interrupciones enmascarables).
HLT
Detiene la ejecucin del procesador hasta que llegue una interrupcin externa.
WAIT
Detiene la ejecucin del procesador hasta que se active el pin TEST del mismo.
LOCK
Prefijo de instruccin que activa el pin LOCK del procesador.

También podría gustarte