Cada ubicación en la memoria de un ordenador tiene una dirección de memoria única. Si conoces la dirección de la ubicación que te interesa, puedes acceder al contenido de esa ubicación de memoria. En muchos sistemas informáticos, cada byte de memoria tiene una dirección única, pero esto no es cierto para todos los ordenadores. Por ejemplo, he trabajado en ordenadores centrales en los que cada palabra de memoria tenía una dirección única, y cada palabra tenía 60 bits de longitud.
Dicho esto, para el resto de esta discusión, vamos a centrarnos en los microprocesadores convencionales utilizados en los PC, y decir que cada byte de memoria tiene una dirección única.
En primer lugar, considere las direcciones de las casas. Si quiere dirigir a alguien a una casa específica, tiene algunas opciones:
- Dirección absoluta
- Déles la dirección exacta de la casa que es su destino final. No importa dónde empiecen, podrán encontrar la casa. Esto se conoce como direccionamiento absoluto.
- Dirección relativa
- Déles la dirección exacta de una casa al final de la calle de destino, y luego diríjalos a la casa de destino final diciendo algo como «entonces ve dos casas al norte, y habrás llegado». Esto se conoce como direccionamiento relativo, o direccionamiento base/desplazamiento. La dirección base, en este caso, es la dirección de la casa de la esquina, y el desplazamiento es el número de casas que hay que ir desde allí, antes de que lleguen a la casa de destino.
- Digamos que usted sabe que la persona ya está en algún lugar de la calle de destino correcta, y sabe dónde está. Entonces puedes darle el número de casas que tiene que ir, y una dirección en la calle para ir, con el fin de llegar a la casa de destino final. Este es otro ejemplo de direccionamiento relativo, o direccionamiento base/desplazamiento. La dirección base, en este caso, es la ubicación de la persona en este momento, y el desplazamiento es el número de casas que debe ir desde allí, antes de llegar a la casa de destino.
Ahora, piense en cada casa de la calle como un byte de la memoria del ordenador. Cada una tiene una dirección única. Si observa las direcciones de los bytes adyacentes, verá que aumentan en una dirección y disminuyen en la dirección opuesta, de forma similar a las direcciones de las casas de una calle.
Si conoce la dirección exacta del byte que le interesa, puede utilizar esa dirección para acceder al contenido de ese byte de memoria. Esto es un direccionamiento absoluto – se especifica la dirección de memoria completa del byte que le interesa.
- Ejemplo: Tienes una variable global con nombre. En la mayoría de los lenguajes de programación de propósito general, sólo tiene que utilizar el nombre, que es un alias para la dirección de memoria de la variable.
Si conoce una dirección base, y conoce la distancia entre esa dirección base y el byte que le interesa (es decir, el desplazamiento desde la dirección base hasta el byte que le interesa), puede especificar tanto la dirección base como el desplazamiento para acceder al byte. Esto es un direccionamiento relativo – usted especifica una dirección base y un desplazamiento desde esa dirección, para llegar al byte que le interesa.
- Ejemplo: Tienes una variable local con nombre. En muchos lenguajes de programación de propósito general, simplemente se utiliza el nombre, que el compilador (o ensamblador) ha convertido en un alias para el desplazamiento desde el principio del área de la pila utilizada para el almacenamiento de la variable local. Internamente, la dirección base es una dirección en la pila, y el desplazamiento es la distancia desde esa ubicación a la ubicación de la variable local a la que está accediendo.
- Ejemplo: Tienes un array de bytes con nombre. En muchos lenguajes de programación de propósito general, se utiliza el nombre del array y un índice dentro del array. El compilador (o ensamblador) ha convertido el nombre en la dirección base del array… la dirección del primer byte del array. El índice que usted especifica se convierte en el desplazamiento… la distancia desde esa dirección base hasta el byte que le interesa.
Por último, si conoce su dirección actual, y conoce la distancia entre el lugar donde se encuentra ahora y el byte que le interesa (es decir, el desplazamiento desde la dirección actual hasta el byte que le interesa), puede especificar tanto la dirección base como el desplazamiento para acceder al byte. Esto también es un direccionamiento relativo – se especifica un desplazamiento desde la dirección en la que se encuentra ahora, para llegar al byte que le interesa.
- Ejemplo: En los lenguajes ensambladores de muchas arquitecturas, existen instrucciones de salto relativo. En lugar de incluir toda la dirección de memoria de destino del salto dentro de la instrucción, sólo se coloca un offset en la instrucción. Este desplazamiento es la distancia, en bytes, desde la ubicación actual (es decir, el contador de programa actual o el puntero de instrucción) hasta la ubicación a la que se quiere saltar. Los saltos relativos suelen ocupar menos espacio de memoria, y a menudo se ejecutan más rápido que una instrucción de salto que contenga una dirección de memoria completa.
.