Está en la página 1de 6

MODOS DE DIRECCIONAMIENTO Los llamados modos de direccionamiento son las diferentes maneras de especificar en informtica un operando dentro de una

instruccin (lenguaje ensamblador). Cmo se especifican e interpretan las direcciones de memoria segn las instrucciones. Un modo de direccionamiento especifica la forma de calcular la direccin de memoria efectiva de un operando mediante el uso de la informacin contenida en registros y / o constantes, contenida dentro de una instruccin de la mquina o en otra parte.

La arquitectura x86 utiliza el mtodo de segmentacin para direccionar memoria, en lugar del mtodo lineal usado en otras arquitecturas. La segmentacin implica descomponer una direccin lineal en dos partes un segmento y un desplazamiento. El segmento apunta al inicio de un bloque de 64K direcciones y el desplazamiento indica la diferencia entre el lugar apuntado y el inicio del segmento. Este modo de direccionamiento se utiliza para aprovechar las caractersticas del procesador. El problema estaba en que los registros internos del procesador eran de 16 bits, mientras que el bus de direcciones era de 20. Faltaban por tanto 4 bits para poder aprovechar al mximo las capacidades de direccionamiento del procesador. Para resolver esto, cada direccin de memoria ser especificada como un segmento y un desplazamiento dentro de ese segmento. Esta solucin divide la memoria en segmentos de 64 K, lo cul limit bastante los diseos de los procesadores posteriores de la familia (Intel 80286,Intel 80386, etc.); aunque posteriormente se idearon mtodos para resolver este problema, como la memoria extendida (no compatible con el x86/x88). Con esto se consigue que el procesador sea capaz de direccionar 1,048,576 direcciones de 1 byte, o lo que es lo mismo, 1Mbyte. Se utilizan dos registros para el direccionamiento: uno para indicar el segmento, y el otro para indicar el desplazamiento. Para obtener la direccin de memoria (direccin efectiva): se toma el valor de registro de segmento, se desplaza 4 bits a la izquierda (multiplicacin por 16), y se le suma el valor del desplazamiento. Ejemplo: Si DS contiene 0x000A y DX contiene 0x5F0A, apuntaran a la direccin de memoria: 0x000A * 0x10 + 0x5F0A = 0x5FAA Para referirse a una direccin con un segmento y un desplazamiento, se utiliza la notacin segmento: desplazamiento. En el ejemplo anterior, la direccin lineal 0x5FAA se nombrara como 0x000A:0x5F0A, o si las dos partes se encuentran almacenadas en los registros mencionados, se podra utilizar el par DS:DX. Hay una serie de combinaciones especiales entre registros de segmentos y registros generales que apuntan a direcciones importantes: CS:IP apunta a la siguiente direccin de cdigo en la que se posicionar el procesador. SS:SP apunta al ltimo elemento apilado en la pila. DS:SI se suele usar para apuntar informacin que va a ser copiada a ES:DI.

IR A MENU PRINCIPAL

Modalidades de direccionamiento Direccionamiento directo El operando se especifica en la instruccin mediante un campo de direccin de 8 bits. Slo la RAM interna de datos (primeros 128 bytes) y la zona de SFR se pueden direccionar de esta forma. Este modo de direccionamiento permite el acceso de fcil y rpido a las zonas de las memoria anteriormente indicadas. Ejemplo: ADD A,3BH ; esta instruccin suma (ADD) al contenido del acumulador el contenido de la posicin de memoria 3BH: A <--- (A) + ([3B]). En este modo la direccin efectiva es igual a la parte de direccin de la instruccin. El operando reside en la memoria y su direccin es dada directamente por el campo de direccin de la instruccin. En una instruccin de tipo ramificacin el campo de direccin especifica la direccin de la rama actual. Con este tipo de direccionamiento, la direccin efectiva es contenida en la misma instruccin, tal como los valores de datos inmediatos que son contenidos en la instruccin. Un procesador de 16 bits suma la direccin efectiva al contenido del segmento de datos previamente desplazado en 4 bits para producir la direccin fsica del operando.

IR A MENU PRINCIPAL Direccionamiento indirecto En este modo de direccionamiento, Para el direccionamiento de reas de memoria (tanto internas como externas) de tamao no superior a 256 bytes, se puede hacer uso de los registros R0 y R1 del banco de registros seleccionado. Si el rea de memoria posee un tamao superior, slo puede utilizarse el registro DPTR. Este modo de direccionamiento es especialmente til para acceder a los 128 bytes altos de la memoria de datos interna (8052) y a la memoria de datos externa. Ejemplos: ADD A,@R0 ; Si (R0) = 3BH, la operacin realizada por esta instruccin ser la misma del ejemplo anterior: A <--- (A) + ([3B]). MOVX @DPTR,A ; Si (DPTR) = 4C2BH, esta instruccin carga el contenido del acumulador en la posicin 4C2BH de la memoria de datos externa: [4C2B] <--- (A).

IR A MENU PRINCIPAL

Direccionamiento por registro Cuando se usa direccionamiento por registro, en el propio cdigo de operacin de la instruccin se especifica el registro del banco activo con que se opera mediante un campo de tres bits. Ejemplo: MOV Rn,A ; Carga en el registro Rn el contenido del acumulador: Rn <--- (A). Este direccionamiento ocupa muy poca memoria de programa y permite acceder de manera rpida a los datos ms frecuentemente utilizados.

IR A MENU PRINCIPAL Direccionamiento implcito Algunas instrucciones operan siempre sobre un mismo registro (acumulador, puntero de datos, etc.) el cual, en consecuencia, es seleccionado de forma implcita por el propio cdigo de operacin, no siendo necesario aadir un byte de direccin para referenciarlo. Las instrucciones con este modo de direccionamiento son muy rpidas y compactas, ocupando el mnimo espacio en la memoria de programa. Ejemplos: INC A ; Incrementa el contenido del acumulador: A <--- (A) + 1. INC DPTR ; Incrementa puntero de datos: DPTR <--- (DPTR) + 1.

Direccionamiento inmediato En este modo de direccionamiento, el operando va incluido en la propia instruccin y se identifica precedindolo por el smbolo #. Dicho operando tiene una longitud de 8 bits, excepto en las instrucciones que afectan al DPTR, en las cuales posee un tamao de 16 bits. Este modo se usa en los casos en que el operando es una constante. Ejemplos: MOV A,#255 ; Carga en el acumulador el nmero decimal 255. MOV DPTR,#36CAH ; Carga en el registro DPTR el valor 36CAH.

Direccionamiento indexado Este direccionamiento slo es aplicable sobre la memoria de programas y para operaciones de lectura. Se utiliza para la lectura de tablas de valores constantes alojadas en esta zona de la memoria. La posicin de memoria a acceder se especifica mediante la direccin de la base de la tabla (almacenada en un registro de 16 bits: DPTR o PC) y un desplazamiento u offset (almacenado en el acumulador). Es decir, la direccin a la que se accede se obtiene mediante la suma de los contenidos del acumulador y del puntero base (DPTR o PC). Las instrucciones MOVC A,@A+DPTR y MOVC A,@A+PC utilizan el modo de direccionamiento indexado. Otro tipo de direccionamiento indexado es el utilizado en la instruccin JMP @A+DPTR, donde la direccin de salto se obtiene sumado los contenidos de los registros A y DPTR. IR A MENU PRINCIPAL

SEGMENTOS La arquitectura de los procesadores x86 obliga al uso de segmentos de memoria para manejar la informacin, el tamao de estos segmentos es de 64kb . La razn de ser de estos segmentos es que, considerando que el tamao mximo de un nmero que puede manejar el procesador esta dado por una palabra de 16 bits o registro , no sera posible accesar a ms de 65536 localidades de memoria utilizando uno solo de estos registros; ahora, si se divide la memoria de la pc en grupos o segmentos, cada uno de 65536 localidades, y utilizamos una direccin en un registro exclusivo para localizar cada segmento, y entonces cada direccin de una casilla especfica la formamos con dos registros, nos es posible accesar a una cantidad de 4294967296 bytes de memoria, lo cual es, en la actualidad, ms memoria de la que veremos instalada en una PC. Para que el ensamblador pueda manejar los datos es necesario que cada dato o instruccin se encuentren localizados en el rea que corresponde a sus respectivos segmentos. El ensamblador accesa a esta informacin tomando en cuenta la localizacin del segmento , dada por los registros DS, ES, SS y CS , y dentro de dicho registro la direccin del dato especfico. Es por ello que cuando creamos un programa empleando el Debug en cada linea que vamos ensamblando aparce algo parecido a lo siguiente:

1CB0:0102 MOV AX,BX En donde el primer nmero, 1CB0, corresponde al segmento de memoria que se est utilizando, el segundo se refiere la la direccin dentro de dicho segmento, y a continuacin aparecen las instrucciones que se almacenaran a partir de esa direccin. La forma de indicarle al ensamblador con cuales de los segmentos se va a trabajar es por medio de las directivas .CODE, .DATA y .STACK. El ensamblador se encarga de ajustar el tamao de los segmentos tomando como base el nmero de bytes que necesita cada instruccin que va ensamblando, ya que sera un desperdicio de memoria utilizar los segmentos completos. Por ejemplo, si un programa unicamente necesita 10kb para almacenar los datos, el segmento de datos unicamente sera de 10kb y no de los 64kb que puede manejar.