1.6 Modos de Direccionamiento

10
1.6 Modos de direccionamiento Cuando se escribe un programa en lenguaje ensamblador, un importante número de las sentencias utilizadas tienen la finalidad de transferir datos, ya sea dentro del propio microprocesador, desde la memoria al microprocesador o viceversa. No en vano una de las instrucciones del 8086 más utilizadas es MOV, implicada en prácticamente todas las transferencias de información controladas por el microprocesador. Las operaciones que más variantes ofrecen son las de transferencia entre el microprocesador y la memoria, ya que la dirección de origen o destino puede obtenerse de múltiples formas distintas, como tendrá ocasión de ver en este capítulo. En conjunto, a las diferentes formas de trasladar los datos que ofrece un microprocesador se las denomina modos de direccionamiento. La finalidad de este breve capítulo es enumerar esos modos proporcionando sencillos ejemplos que faciliten su comprensión. Direccionamiento por registro Se habla de direccionamiento por registro, sin más calificativos, cuando en la operación la información procede de un registro y el destino es otro registro. Dicho de otra forma: la transferencia tiene lugar en el interior del microprocesador, sin emplear en ningún momento los buses de datos o direcciones. Un ejemplo de direccionamiento por registro sería el siguiente: MOV AH, AL En este caso se traslada el contenido del registro AL al registro AH, lo que también equivale a copiar los 8 bits de menor peso del registro AX en los 8 bits de mayor peso. Una de las operaciones más habituales en las que se ve implicado este tipo de direccionamiento es la inicialización de registros de segmento, para establecer por ejemplo el área de datos de un programa. Asumiendo que en el registro AX se tuviese la dirección del segmento de

description

Modos de Direccionamiento

Transcript of 1.6 Modos de Direccionamiento

1.6 Modos de direccionamiento

Cuando se escribe un programa en lenguaje ensamblador, un importante nmero de las sentencias utilizadas tienen la finalidad de transferir datos, ya sea dentro del propio microprocesador, desde la memoria al microprocesador o viceversa. No en vano una de las instrucciones del 8086 ms utilizadas es MOV, implicada en prcticamente todas las transferencias de informacin controladas por el microprocesador. Las operaciones que ms variantes ofrecen son las de transferencia entre el microprocesador y la memoria, ya que la direccin de origen o destino puede obtenerse de mltiples formas distintas, como tendr ocasin de ver en este captulo. En conjunto, a las diferentes formas detrasladar los datos que ofrece un microprocesador se las denomina modos de direccionamiento. La finalidad de este breve captulo es enumerar esos modos proporcionando sencillos ejemplos que faciliten su comprensin.

Direccionamiento por registroSe habla de direccionamiento por registro, sin ms calificativos, cuando en la operacin la informacin procede de un registro y el destino es otro registro. Dicho de otra forma: la transferencia tiene lugar en el interior del microprocesador, sin emplear en ningn momento los buses de datos o direcciones.

Un ejemplo de direccionamiento por registro sera el siguiente:MOV AH, AL

En este caso se traslada el contenido del registro AL al registro AH, lo que tambin equivale a copiar los 8 bits de menor peso del registro AX en los 8 bits de mayor peso.

Una de las operaciones ms habituales en las que se ve implicado este tipo de direccionamiento es la inicializacin de registros de segmento, para establecer por ejemplo el rea de datos de un programa. Asumiendo que en el registro AX se tuviese la direccin del segmento de datos, una de las primeras instrucciones del programa sera la siguiente:

MOV DS, AX Al usar este tipo de direccionamiento deben tenerse en cuenta las reglas siguientes: El registro de destino y el de origen ser del mismo tamao, por lo que no sera vlida una instruccin como MOV AH, DX, ya que AH es un registro de 8 bits y DX de 16. Esta regla es aplicable en general a cualquier transferencia de informacin. Determinados reg stros no pueden aparecer como destino en un direccionamiento por registro. Los casos ms significativos son CS e IP, siendo invlidas instrucciones como MOV I P , BX, por poner un ejemplo. No es posible usar como origen y destino un registro de segmento, siendo incorrectas instrucciones del tipo MOV DS, CS. La alternativa sera un cdigo como:MOV AX, CSMOV DS, AX

Otra alternativa sera enviar el origen a la pila y recogerla de sta en el registro de destino, pero ya no se estara utilizando direccionamiento por registro que es el mtodo ms rpido., - ; ; ; > ; ^ " '"- ..";

Direccionamiento inmediatoEste tipo de direccionamiento se caracteriza porque uno de los operandos, concretamente el de origen, forma parte del cdigo del programa, situndose en la memoria a continuacin del cdigo de operacin correspondiente a la instruccin que va a utilizarlo. Por ello se dice que es de acceso o direccionamiento inmediato. Uno de los casos ms tpicos es la inicializacin de un registro con algn valor, por ejemplo:

MOV AH, 2Oh

El ensamblador, al traducir esta instruccin, generara el siguiente patrn de bits:1011 0 100 0010 0000

Los 4 bits de mayor peso: 1011 indican al microprocesador que la instruccin a ejecutar es MOV y que el direccionamiento empleado es inmediato, siendo el destino un registro. El siguiente bit, contando de izquierda a derecha, establece que se trata de un registro de 8 bits. Los tres bits siguientes: 0 0 0, indican que el registro de destino es AH. El byte siguiente es el valor 2Oh que se asignar a ese registro.En cuanto se recupera esta sentencia de la memoria, el primer byte, la unidad que se encarga de descodificar la instruccin detecta que lleva asociado un operando que est en la siguiente posicin de memoria y la recupera. De esta forma cuando la unidad de ejecucin va a realizar su trabajo, ejecutando la instruccin, se sabe cul es el operando de destino (AH en este caso) y el de origen se encuentra tambin en el microprocesador, en un registro temporal.

El operando de destino, el que recibir el dato inmediato, puede ser prcticamente cualquier registro. La excepcin son los registros de segmento, cuya inicializacin debe efectuarse mediante direccionamiento por registro, por ejemplo:

MOV AX, 0B800hMOV ES, AXDireccionamiento directoEn este tercer modo de direccionamiento uno de los operandos, puede ser el destino o bien el origen, es una direccin de memoria. Esta, al igual que ocurre con el dato inmediato del modo de direccionamiento previo, es recuperada durante la descodificacin de la instruccin, por lo que el procesador la tiene a su disposicin cuando va a ejecutar la operacin. En ese momento la coloca en el bus de direcciones e indica a la memoria si tiene que leerla, y poner su contenido en el bus de datos, o bien si debe recuperar la informacin enviada por el bus de datos y escribirla en esa direccin.Para diferenciar un dato de 16 bits, como puede ser 12 8 0 h, de la direccin de memoria 12 8 Oh, ya que el ensamblador no puede saber ante una instruccin como MOV AX, 12 8 Oh si el segundo operando es un dato inmediato o bien una direccin de memoria, existen dos posibilidades:

Colocar la direccin entre corchetes, de manera que la instruccin quedara como MOVAX, [1280h]. Declarar la direccin como una etiqueta, una capacidad que ofrecen todos los ensambladores, de forma que la instruccin sera del tipo MOV AX, Valor, siendo Valor la etiqueta previamente definida.

Al acceder a memoria la direccin efectiva (real) se obtiene a partir de un registro de segmento y la direccin indicada en la instruccin, que sera el desplazamiento. Cada instruccin asume un registro de segmento por defecto, registro que puede ser cambiando por otro indicado explcitamente en la propia instruccin. En captulos posteriores conocer con exactitud la forma en que se generan estas direcciones y la funcin que tienen los registros de segmento, tanto en modo real (16 bits) como en modo protegido(32 bits).El nmero de bytes transferidos desde o hacia la memoria, cuando se utiliza este direccionamiento directo o cualquier otro que opere sobre memoria, ser deducido por el propio ensamblador siempre que sea posible, observando el tamao del otro operando. En una instruccin como MOV AX, [ 12 8 Oh ], por ejemplo, se recuperara el contenido de la posicin de memoria indicada y la siguiente, 16 bits en total, ya que el registro AX es de 16 bits. En caso de que no sea posible deducir el tamao, ste puede especificarexplcitamente con las palabras BYTE, WORD, DWORD, etc., que reconocen la mayora de los ensambladores.

Direccionamiento indirectoSe trata de un direccionamiento similar al anterior, dado que de lo que se trata es de transferir un dato desde o hacia la memoria, pero en este caso la direccin no se facilita en la propia sentencia, de ah que cuando el microprocesador vaya a ejecutar la instruccin no pueda realizar directamente esa transferencia. En su lugar la direccin est almacenada en un registro que, desde el punto de vista del programa, actuara como un puntero. Por ejemplo:

MOV AL, [RX]

Como en el direccionamiento directo, el tamao de uno de los operandos marca el nmero de bytes a transferir. La direccin de memoria puede ser el destino o el origen, tambin como en el direccionamiento directo. Para ejecutar una instruccin como la anterior el microprocesador tiene que obtener el cdigo de operacin y descodificarlo. En ese momento sabe que uno de los operandos, en el caso anterior el registro BX, contiene una direccin que debe colocar en el bus de direcciones, llevando a cabo la lectura o escritura. Una variante de este tipo de direccionamiento es la que incluye un desplazamiento sobre la direccin base contenida en el registro. La forma de expresar el desplazamiento sera la siguiente:MOV AL, [BX+4]

Asumiendo que el registro BX contuviese la direccin donde est alojada una cierta estructura de datos que el programa necesita utilizar, el desplazamiento adicional sera til para acceder a campos de dicha estructura.

Direccionamiento indexadoEs el modo de direccionamiento ms sofisticado con que cuenta el 8086, permitiendo el acceso a memoria calculando la direccin a partir de tres componentes. Es tambin un direccionamiento indirecto, si bien la direccin no se obtiene sin ms de un registro sino que es calculada a partir de dos registros y, opcionalmente, un desplazamiento. Podra decirse, por tanto, que el direccionamiento indexado es un caso particular de direccionamiento indirecto.Al usar el modo de direccionamiento indexado uno de los registros, normalmente BX o BP, contendr una direccin base a la que se sumar el contenido de un registro ndice, DI o SI.El contenido del registro ndice suele ir cambiando, incrementndose o reducindose, en el interior de un bucle. Opcionalmente puede sumarse tambin un desplazamiento, dando lugar a instrucciones como la siguiente:

MOV AL, [BX+SI+4]

Suponiendo que un programa tuviese alojada en memoria una lista de estructuras de datos, el registro BX contendra la direccin base donde comienza la lista, es decir, la direccin del primer campo de la primera estructura de esa lista. El registro SI servira para direccionar cada uno de los elementos de la lista, de forma que se le sumara o restara, segn se quiera avanzar o retroceder, un nmero que sera el tamao de cada elemento. Finalmente el desplazamiento sera el que establecera el campo al que se quiereacceder dentro de ese elemento.

Modos de direccionamiento del 80386Los modos de direccionamiento descritos en los puntos previos estn disponibles en toda la familia de microprocesadores x86, partiendo desde el 8086. Existen modos ms complejos introducidos en el 80386 y miembros posteriores de esta familia. En su mayor parte son modos de direccionamiento indirecto a los que se agregan operandos adicionales.Un ejemplo de estos modos de direccionamiento es el direccionamiento indexado escalado que apareci con el 80386, en el cual es posible aplicar un factor multiplicador al registro que acta como ndice. Por ejemplo:

MOV AL, [EBX+ESI*3+4]

En este caso el registro de 32 bits EBX contiene la direccin base, a la que se suma el contenido de 32 bits de ES I multiplicado por 3. Finalmente se suma el desplazamiento: 4, obteniendo la direccin en la que se encuentra el dato de 8 bits que se llevar a AL. Una vez que conocemos los modos de direccionamiento que podemos usar a la hora de transferir informacin, solamente nos resta tener una visin general sobre el juego de instrucciones con que cuenta el 8086, descrito en el captulo siguiente, para comenzar a escribir nuestros primeros programas en ensamblador.

(Ojeda, 2009, pgs. 97-106)

Modo de direccionamiento realEn el modo de direccionamiento real, el procesador IA-32 puede acceder a 1,048,576 bytes de memoria (1MB) mediante el uso de direcciones de 20 bits, en el rango de 0 a FFFFF hexadecimal. Los ingenieros de Intel tuvieron que resolver un problema bsico: los registros de 16 bits en el procesador 8086 no podan almacenardirecciones de 20 bits. Por ende, idearon un esquema conocido como memoria segmentada. Toda la memoria se divide en unidades de 64 Kilobytes, a las cuales se les llama segmentos. Una analoga es un edificio extenso, en el que los segmentos representan a los pisos del edificio. Una persona puede tomar el elevador hacia un piso especfico, bajarse y empezar a seguir los nmeros de los cuartos para localizar uno. El desplazamiento de un cuarto puede considerarse como la distancia desde el elevador hasta ese cuarto.

Direccionamiento indirectoEl direccionamiento indirecto no es prctico para el procesamiento de arreglos. Muy raras veces es necesarioproporcionar una etiqueta nica para cada elemento de un arreglo. No es conveniente utilizar desplazamientosconstantes para direccionar ms de unos cuantos elementos del arreglo. La nica forma prctica de manejar unarreglo es utilizar un registro como apuntador (conocido como direccionamiento indirecto) y manipular el valor de ese registro. Cuando un operando utiliza el direccionamiento indirecto, se llama operando indirecto.

indexadosUn operando indexado suma una constante a un registro para generar una direccin efectiva. Puede usarse cualquiera de los registros de propsito general de 32 bits como registro ndice. MASM permite varias formasde notacin (los corchetes son parte de la notacin):

constante[reg][constante + reg] La primera forma de notacin combina el nombre de una variable con un registro. El nombre de la variablees una constante que representa el desplazamiento de la variable. He aqu ejemplos que muestran ambasformas de notacin:

arregloB[esi] [arregloB + esi]arregloD[ebx] [arregloD + ebx]

Los operandos indexados son adecuados para el procesamiento de arreglos. El registro ndice debe inicializarsecon cero antes de acceder al primer elemento del arreglo:

.dataarregloB BYTE 10h,20h,30h.codemov esi,0mov al,[arregloB + esi] ; AL = 10h

La ltima instruccin suma ESI al desplazamiento de arregloB. La direccin generada por la expresin[arregloB _ ESI] se emplea para hacer referencia a memoria y el byte en memoria se copia a AL. Suma de desplazamientos El segundo tipo de direccionamiento indexado combina a un registro con un desplazamiento constante. El registro ndice almacena la direccin base de un arreglo o estructura, y la constante identifi ca los desplazamientos de varios elementos del arreglo. El siguiente ejemplo muestra cmo hacer esto con un arreglo de palabras de 16 bits:

.dataarregloW WORD 1000h,2000h,3000h.codemov esi,OFFSET arregloWmov ax,[esi] ; AX = 1000hmov ax,[esi+2] ; AX = 2000hmov ax,[esi+4] ; AX = 3000h

Uso de registros de 16 bits Es comn utilizar registros de 16 bits como operandos indexados en el modode direccionamiento real. En este caso, estamos limitados a utilizar SI, DI, BX o BP:

mov al,arregloB[si]mov ax,arregloW[di]mov eax,arregloD[bx]Al igual que en el caso de los operandos indirectos, evite utilizar BP, excepto cuando direccione datos en lapila.(Irvine, 2008, pgs. 99-101)