Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Modos de Direccionamiento
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:
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
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
; 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.
MOV AX,desp[DI]
ADD desp[SI],BX
MOV AX,ES:desp[BX][DI]
MOV CS:desp[BX][SI],CX
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.
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.
2.
DI <- DI1
3.
SI <- SI1
MOVSW
Copiar dos bytes de la cadena fuente al destino.
Operacin:
1.
2.
DI <- DI2
3.
SI <- SI2
LODSB
Poner en el acumulador un byte de la cadena fuente.
Operacin:
1.
2.
SI <- SI1
LODSW
Poner en el acumulador dos bytes de la cadena fuente.
Operacin:
1.
2.
SI <- SI2
STOSB
Almacenar en la cadena destino un byte del acumulador.
Operacin:
1.
2.
DI <- DI1
STOSW
Almacenar en la cadena destino dos bytes del acumulador.
Operacin:
1.
2.
DI <- DI2
CMPSB
Comparar un byte de la cadena fuente con el destino.
Operacin:
1.
2.
DI <- DI1
3.
SI <- SI1
CMPSW
Comparar dos bytes de la cadena fuente con el destino.
Operacin:
1.
2.
DI <- DI2
3.
SI <- SI2
SCASB
Comparar un byte del acumulador con la cadena destino.
Operacin:
1.
2.
DI <- DI1
SCASW
Comparar dos bytes del acumulador con la cadena destino.
Operacin:
1.
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:
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