Modo de direccionamiento

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Los

modos de direccionamiento son un aspecto de la arquitectura del conjunto de instrucciones en la mayoría de los diseños de unidades centrales de procesamiento (CPU). Los diversos modos de direccionamiento que se definen en una arquitectura de conjunto de instrucciones determinada definen cómo las instrucciones en lenguaje de máquina en esa arquitectura identifican los operandos de cada instrucción. Un modo de direccionamiento especifica cómo calcular la dirección de memoria efectiva de un operando utilizando información contenida en registros y/o constantes contenidas dentro de una instrucción de máquina o en otro lugar.

En programación de computadoras, los modos de direccionamiento son de interés principalmente para quienes escriben en lenguajes ensambladores y para escritores de compiladores. Para conocer un concepto relacionado, consulte el conjunto de instrucciones ortogonales que trata de la capacidad de cualquier instrucción para utilizar cualquier modo de direccionamiento.

Advertencias

No existen nombres generalmente aceptados para los modos de direccionamiento: diferentes autores y fabricantes de computadoras pueden dar diferentes nombres al mismo modo de direccionamiento, o los mismos nombres a diferentes modos de direccionamiento. Además, un modo de direccionamiento que, en una arquitectura determinada, se trata como un modo de direccionamiento único puede representar una funcionalidad que, en otra arquitectura, está cubierta por dos o más modos de direccionamiento. Por ejemplo, algunas arquitecturas de computadoras con conjuntos de instrucciones complejas (CISC), como la VAX de Digital Equipment Corporation (DEC), tratan los registros y las constantes literales o inmediatas como un modo de direccionamiento más. Otros, como IBM System/360 y sus sucesores, y la mayoría de los diseños de computadoras con conjunto de instrucciones reducido (RISC), codifican esta información dentro de la instrucción. Por lo tanto, estas últimas máquinas tienen tres códigos de instrucción distintos para copiar un registro a otro, copiar una constante literal en un registro y copiar el contenido de una ubicación de memoria en un registro, mientras que el VAX tiene solo un único "MOV". 34; instrucción.

El término "modo de direccionamiento" está sujeto a diferentes interpretaciones: ya sea "modo de cálculo de dirección de memoria" o "modo de acceso a operando". Según la primera interpretación, se considera que las instrucciones que no leen de la memoria ni escriben en la memoria (como "agregar literal al registro") no tienen un "modo de direccionamiento". La segunda interpretación permite máquinas como VAX que utilizan bits de modo operando para permitir un registro o un operando literal. Sólo la primera interpretación se aplica a instrucciones como "cargar dirección efectiva", que carga la dirección del operando, no el operando en sí.

Los modos de direccionamiento que se enumeran a continuación se dividen en direccionamiento de código y direccionamiento de datos. La mayoría de las arquitecturas de computadoras mantienen esta distinción, pero hay (o ha habido) algunas arquitecturas que permiten utilizar (casi) todos los modos de direccionamiento en cualquier contexto.

Las instrucciones que se muestran a continuación son puramente representativas para ilustrar los modos de direccionamiento y no reflejan necesariamente los mnemotécnicos utilizados por ninguna computadora en particular.

Número de modos de direccionamiento

Las arquitecturas informáticas varían mucho en cuanto al número de modos de direccionamiento que proporcionan en el hardware. Hay algunos beneficios al eliminar modos de direccionamiento complejos y usar sólo uno o unos pocos modos de direccionamiento más simples, aunque requiere algunas instrucciones adicionales y tal vez un registro adicional. Ha demostrado ser mucho más fácil diseñar CPU canalizadas si los únicos modos de direccionamiento disponibles son simples.

La mayoría de las arquitecturas RISC tienen sólo unos cinco modos de direccionamiento simples, mientras que las arquitecturas CISC como DEC VAX tienen más de una docena de modos de direccionamiento, algunos de los cuales son bastante complicados. La arquitectura IBM System/360 tenía sólo tres modos de direccionamiento; Se han agregado algunos más para System/390.

Cuando solo hay unos pocos modos de direccionamiento, el modo de direccionamiento particular requerido generalmente está codificado dentro del código de instrucción. (por ejemplo, IBM System/360 y sucesores, la mayoría de RISC). Pero cuando hay muchos modos de direccionamiento, a menudo se reserva un campo específico en la instrucción para especificar el modo de direccionamiento. El DEC VAX permitía múltiples operandos de memoria para casi todas las instrucciones y, por lo tanto, reservaba los primeros bits de cada especificador de operando para indicar el modo de direccionamiento para ese operando en particular. Mantener los bits del especificador del modo de direccionamiento separados de los bits de operación del código de operación produce un conjunto de instrucciones ortogonales.

Incluso en una computadora con muchos modos de direccionamiento, las mediciones de programas reales indican que los modos de direccionamiento simples enumerados a continuación representan alrededor del 90% o más de todos los modos de direccionamiento utilizados. Dado que la mayoría de estas mediciones se basan en código generado por compiladores a partir de lenguajes de alto nivel, esto refleja hasta cierto punto las limitaciones de los compiladores que se utilizan.

Caso de uso importante

Algunas arquitecturas de conjuntos de instrucciones, como Intel x86 e IBM/360 y sus sucesores, tienen una instrucción de dirección de carga efectiva. Este calcula la dirección efectiva del operando y la carga en un registro, sin acceder a la memoria a la que hace referencia. Esto puede resultar útil al pasar la dirección de un elemento de matriz a una subrutina. También puede ser una forma inteligente de hacer más cálculos de lo normal en una sola instrucción; por ejemplo, usar una instrucción de este tipo con el modo de direccionamiento "base+índice+desplazamiento" (detallado a continuación) permite sumar dos registros y una constante en una instrucción y almacenar el resultado en un tercer registro.

Modos de direccionamiento simples para código

A continuación se muestran algunos modos de direccionamiento simples para el código. La nomenclatura puede variar según la plataforma.

Absoluta o directa

 Y...
TENJUNTO A LA DIFERENCIA
Y...

(Dirección Efectiva del PC = dirección)

La dirección efectiva para una dirección de instrucción absoluta es el parámetro de dirección en sí sin modificaciones.

Relativo al PC

 Y...
Silenciosidad contrarrestada contrarrestada
Y...

(Dirección de PC efectiva = siguiente dirección de instrucción + offset, offset puede ser negativo)

La dirección efectiva para una dirección de instrucción relativa a la PC es el parámetro de compensación agregado a la dirección de la siguiente instrucción. Este desplazamiento suele estar firmado para permitir la referencia al código tanto antes como después de la instrucción.

Esto es particularmente útil en relación con los saltos, porque los saltos típicos son a instrucciones cercanas (en un lenguaje de alto nivel más si o mientras las declaraciones son razonablemente cortas). Las mediciones de los programas actuales sugieren que un offset de 8 o 10 bits es lo suficientemente grande para un 90% de los saltos condicionales (aproximadamente ±128 o ±512 bytes).

Otra ventaja del direccionamiento relativo a la PC es que el código puede ser independiente de la posición, es decir, se puede cargar en cualquier lugar de la memoria sin necesidad de ajustar ninguna dirección.

Algunas versiones de este modo de direccionamiento pueden ser condicionales y hacer referencia a dos registros ("saltar si reg1=reg2"), un registro ("saltar a menos que reg1=0") o ningún registro., refiriéndose implícitamente a algún bit previamente establecido en el registro de estado. Consulte también la ejecución condicional a continuación.

Registrar indirecto

 +------+----+
SilencioVia bendición
+------+----+

(Effective PC address = contents of register 'reg')

La dirección efectiva para una instrucción indirecta de registro es la dirección en el registro especificado. Por ejemplo, (A7) para acceder al contenido del registro de direcciones A7.

El efecto es transferir el control a la instrucción cuya dirección está en el registro especificado.

Muchas máquinas RISC, así como CISC IBM System/360 y sus sucesores, tienen instrucciones de llamada de subrutina que colocan la dirección de retorno en un registro de dirección; el modo de direccionamiento de registro indirecto se utiliza para regresar de esa llamada de subrutina.

Modos de direccionamiento secuencial

Ejecución secuencial

 +...
tención nop ← ejecutar la siguiente instrucción
+...

(Dirección de PC efectiva = siguiente dirección de instrucciones)

La CPU, después de ejecutar una instrucción secuencial, ejecuta inmediatamente la siguiente instrucción.

La ejecución secuencial no se considera un modo de direccionamiento en algunas computadoras.

La mayoría de las instrucciones en la mayoría de las arquitecturas de CPU son instrucciones secuenciales. Debido a que la mayoría de las instrucciones son secuenciales, los diseñadores de CPU a menudo agregan características que sacrifican deliberadamente el rendimiento de las otras instrucciones (instrucciones de rama) para que estas instrucciones secuenciales se ejecuten más rápido.

Las ramas condicionales cargan la PC con uno de 2 resultados posibles, dependiendo de la condición; la mayoría de las arquitecturas de CPU utilizan algún otro modo de direccionamiento para las ramas "tomadas" rama y ejecución secuencial para la rama "no tomada" rama.

Muchas características de las CPU modernas (captura previa de instrucciones y canalizaciones más complejas, ejecución fuera de orden, etc.) mantienen la ilusión de que cada instrucción finaliza antes de que comience la siguiente, dando los mismos resultados finales, aunque eso sea cierto. No es exactamente lo que sucede internamente.

Cada "bloque básico" de tales instrucciones secuenciales exhibe una localidad de referencia tanto temporal como espacial.

CPU que no utilizan ejecución secuencial

Las CPU que no utilizan ejecución secuencial con un contador de programa son extremadamente raras. En algunas CPU, cada instrucción siempre especifica la dirección de la siguiente instrucción. Estas CPU tienen un puntero de instrucción que contiene esa dirección especificada; no es un contador de programa porque no existe ninguna disposición para incrementarlo. Estas CPU incluyen algunas computadoras con memoria de tambor, como la IBM 650, la máquina SECD, Librascope LGP-30 y RTX 32P.

Otras arquitecturas informáticas van mucho más allá e intentan evitar el cuello de botella de von Neumann utilizando una variedad de alternativas al contador de programas.

Ejecución condicional

Algunas arquitecturas de computadora tienen instrucciones condicionales (como ARM, pero ya no para todas las instrucciones en modo de 64 bits) o instrucciones de carga condicionales (como x86) que en algunos casos pueden hacer que las ramas condicionales sean innecesarias y evitar vaciar el proceso de instrucciones.. Una instrucción como 'comparar' se utiliza para establecer un código de condición, y las instrucciones posteriores incluyen una prueba de ese código de condición para ver si se obedecen o se ignoran.

Saltar

 +----+-----+---+--+
Ноперениваниваных el reg1 vidas eterna reg2 mantenerse al día de la siguiente instrucción si reg1=reg2
+----+-----+---+--+

(Dirección de PC efectiva = siguiente dirección de instrucción + 1)

El direccionamiento omitido puede considerarse un tipo especial de modo de direccionamiento relativo a la PC con un valor fijo "+1" compensar. Al igual que el direccionamiento relativo a la PC, algunas CPU tienen versiones de este modo de direccionamiento que solo se refieren a un registro ("omitir si reg1=0") o ningún registro, refiriéndose implícitamente a algún bit previamente establecido en el registro de estado.. Otras CPU tienen una versión que selecciona un bit específico en un byte específico para probar (omitir si el bit 7 de reg12 es 0).

A diferencia de todas las demás ramas condicionales, una opción "saltar" La instrucción nunca necesita vaciar la canalización de instrucciones, aunque puede ser necesario que haga que se ignore la siguiente instrucción.

Modos de direccionamiento simples para datos

A continuación se muestran algunos modos simples de direccionamiento de datos. La nomenclatura puede variar según la plataforma.

Registro (o, registro directo)

 +------+---+-----+-----+----
Silencio mul Silencioso reg1 vidas eterna reg2 vidas periódicas reg3 vidas eternas reg1:= reg2 * reg3;
+------+---+-----+-----+----

Este "modo de direccionamiento" no tiene una dirección efectiva y no se considera un modo de direccionamiento en algunas computadoras.

En este ejemplo, todos los operandos están en registros y el resultado se coloca en un registro.

Base más desplazamiento y variaciones

Esto a veces se denomina 'base más desplazamiento'

 +------+---+-----+
Silencioso de carga Silencio reg Silencioso de la base inversa contrarrestada Silencio reg:= RAM[base + offset]
+------+---+-----+

(Dirección efectiva = offset + contenido del registro básico especificado)

El desplazamiento suele ser un valor de 16 bits con signo (aunque el 80386 lo expandió a 32 bits).

Si el desplazamiento es cero, esto se convierte en un ejemplo de direccionamiento indirecto de registro; la dirección efectiva es solo el valor en el registro base.

En muchas máquinas RISC, el registro 0 se fija en el valor cero. Si se utiliza el registro 0 como registro base, esto se convierte en un ejemplo de direccionamiento absoluto. Sin embargo, sólo se puede acceder a una pequeña porción de la memoria (64 kilobytes, si el desplazamiento es de 16 bits).

El desplazamiento de 16 bits puede parecer muy pequeño en relación con el tamaño de las memorias de las computadoras actuales (razón por la cual el 80386 lo amplió a 32 bits). Podría ser peor: los mainframes IBM System/360 sólo tienen un desplazamiento de 12 bits sin firmar. Sin embargo, se aplica el principio de localidad de referencia: en un corto período de tiempo, la mayoría de los elementos de datos a los que un programa desea acceder están bastante cerca unos de otros.

Este modo de direccionamiento está estrechamente relacionado con el modo de direccionamiento absoluto indexado.

Ejemplo 1: Dentro de una subrutina, al programador le interesarán principalmente los parámetros y las variables locales, que rara vez excederán los 64 KB, para los cuales es suficiente un registro base (el puntero de trama). Si esta rutina es un método de clase en un lenguaje orientado a objetos, entonces se necesita un segundo registro base que apunte a los atributos del objeto actual (this o self en algunos casos). lenguajes de alto nivel).

Ejemplo 2: Si el registro base contiene la dirección de un tipo compuesto (un registro o estructura), el desplazamiento se puede utilizar para seleccionar un campo de ese registro (la mayoría de los registros/estructuras tienen un tamaño inferior a 32 kB).

Inmediata / literal

(feminine)
 +------+---+-----+
Silencio añadir Silencio reg1 vidas eterna reg2 vidas constante Silencio reg1:= reg2 + constante;
+------+---+-----+

Este "modo de direccionamiento" no tiene una dirección efectiva y no se considera un modo de direccionamiento en algunas computadoras.

La constante puede ser firmada o no firmada. Por ejemplo, move.l #$FEEDABBA, D0 para mover el valor inmediato del hex de "FEEDABBA" en el registro D0.

En lugar de utilizar un operand de memoria, el valor del operand se mantiene dentro de la instrucción misma. En la máquina DEC VAX, los tamaños literales de operando podrían ser 6, 8, 16 o 32 bits de largo.

Andrew Tanenbaum demostró que el 98% de todas las constantes de un programa caben en 13 bits (consulte la filosofía de diseño RISC).

Implícito

 +-
Silencio claro para llevar poco tiempo
+-

+...
Silencio claro acumulador Silencio
+...

El modo de abordaje implícito, también llamado modo de abordaje implícito (x86 lenguaje de montaje), no especifica explícitamente una dirección efectiva para la fuente o el destino (o a veces ambos).

El código de operación implica la dirección efectiva de origen (si la hay) o de destino (o, a veces, ambas).

El direccionamiento implícito era bastante común en computadoras más antiguas (hasta mediados de la década de 1970). Estas computadoras normalmente tenían un solo registro en el que se podía realizar la aritmética: el acumulador. Estas máquinas acumuladoras hacen referencia implícita a ese acumulador en casi todas las instrucciones. Por ejemplo, la operación < a:= b + c; > se puede hacer usando la secuencia < cargar b; añadir c; almacenar un; > -- el destino (el acumulador) está implícito en cada "carga" y "añadir" instrucción; la fuente (el acumulador) está implícita en cada "tienda" instrucción.

Las computadoras posteriores generalmente tenían más de un registro de propósito general o ubicación RAM que podría ser el origen o el destino o ambos para la aritmética, por lo que las computadoras posteriores necesitan algún otro modo de direccionamiento para especificar el origen y el destino de la aritmética.

Entre las instrucciones x86, algunas usan registros implícitos para uno de los operandos o resultados (multiplicación, división, salto condicional de conteo).

Muchas computadoras (como x86 y AVR) tienen un registro de propósito especial llamado puntero de pila que se incrementa o disminuye implícitamente al insertar o extraer datos de la pila, y la dirección efectiva de origen o destino es (implícitamente) la dirección almacenado en ese puntero de pila.

Muchos ordenadores de 32 bits (como 68000, ARM o PowerPC) tienen más de un registro que podría ser utilizado como puntero de pila, y por lo tanto utilizar el modo de dirección "incremento registrado indirecto" para especificar cuál de esos registros debe ser utilizado al empujar o extraer datos de una pila.

Algunas arquitecturas informáticas actuales (por ejemplo, IBM/390 e Intel Pentium) contienen algunas instrucciones con operandos implícitos para mantener la compatibilidad con diseños anteriores.

En muchas computadoras, las instrucciones que invierten el bit de modo usuario/sistema, el bit de habilitación de interrupción, etc. especifican implícitamente el registro especial que contiene esos bits. Esto simplifica el hardware necesario para atrapar esas instrucciones a fin de cumplir con los requisitos de virtualización de Popek y Goldberg; en un sistema de este tipo, la lógica de captura no necesita mirar ningún operando (o la dirección efectiva final), sino solo el código de operación..

Se han diseñado algunas CPU donde cada operando siempre se especifica implícitamente en cada instrucción: CPU de operando cero.

Otros modos de direccionamiento para código o datos

Absoluto/directo

 Y...
Silencioso de carga Silencio reg Silencio
Y...

(Dirección efectiva = dirección dada en la instrucción)

Esto requiere espacio en una instrucción para una dirección bastante grande. A menudo está disponible en máquinas CISC que tienen instrucciones de longitud variable, como x86.

Algunas máquinas RISC tienen una instrucción especial Cargar literal superior que coloca una constante de 16 o 20 bits en la mitad superior de un registro. Luego se puede utilizar como registro base en un modo de direccionamiento de base más desplazamiento que suministra los 16 o 12 bits de orden inferior. La combinación permite una dirección completa de 32 bits.

Absoluto indexado

 Y...
Silencioso de carga Silencio reg Silencio
Y...

(Dirección efectiva = dirección + contenido del registro de índice especificado)

Esto también requiere espacio en una instrucción para una dirección bastante grande. La dirección podría ser el inicio de una matriz o vector, y el índice podría seleccionar el elemento de matriz particular requerido. El procesador puede escalar el registro de índice para permitir el tamaño de cada elemento de la matriz.

Tenga en cuenta que esto es más o menos lo mismo que el modo de direccionamiento base más desplazamiento, excepto que el desplazamiento en este caso es lo suficientemente grande como para direccionar cualquier ubicación de memoria.

Ejemplo 1: Dentro de una subrutina, un programador puede definir una cadena como una constante local o una variable estática. La dirección de la cadena se almacena en la dirección literal de la instrucción. El desplazamiento (qué carácter de la cadena usar en esta iteración de un bucle) se almacena en el registro de índice.

Ejemplo 2: Un programador puede definir varios arreglos grandes como globales o como variables de clase. El inicio de la matriz se almacena en la dirección literal (quizás modificada en el momento de la carga del programa por un cargador reubicado) de la instrucción que hace referencia a ella. El desplazamiento (qué elemento de la matriz usar en esta iteración de un bucle) se almacena en el registro de índice. A menudo, las instrucciones de un bucle reutilizan el mismo registro para el contador del bucle y los desplazamientos de varias matrices.

Base más índice

 +------+---+-----+-----+----
Silencioso de carga
+------+---+-----+-----+----

(Dirección efectiva = contenido del registro base especificado + contenido del registro índice especificado)

El registro base podría contener la dirección inicial de una matriz o vector, y el índice podría seleccionar el elemento de matriz particular requerido. El procesador puede escalar el registro de índice para permitir el tamaño de cada elemento de la matriz. Esto podría usarse para acceder a elementos de una matriz pasada como parámetro.

Base más índice más compensación

 +------+-----+-----+--------+
Silenciosamente cargado Silencio reg Silenciosos base
+------+-----+-----+--------+

(Dirección efectiva = offset + contenido del registro base especificado + contenido del registro índice especificado)

El registro base podría contener la dirección inicial de una matriz o vector de registros, el índice podría seleccionar el registro particular requerido y el desplazamiento podría seleccionar un campo dentro de ese registro. El procesador puede escalar el registro de índice para permitir el tamaño de cada elemento de la matriz.

Escalado

 +------+---+-----+-----+----
Silencioso de carga
+------+---+-----+-----+----

(Dirección efectiva = contenido del registro de base especificado + el contenido escalado del registro de índice especificado)

El registro base podría contener la dirección inicial de una matriz o estructura de datos vectoriales, y el índice podría contener la compensación del único elemento de matriz requerido.

Este modo de tratamiento escala dinámicamente el valor en el registro índice para permitir el tamaño de cada elemento array, por ejemplo, si los elementos de matriz son números de doble precisión flotante-punto ocupando 8 bytes cada uno entonces el valor en el registro índice se multiplica por 8 antes de ser utilizado en el cálculo de la dirección efectiva. El factor de escala normalmente se limita a ser una potencia de dos, para que se pueda utilizar el cambio en lugar de la multiplicación.

Registro indirecto

 +----+------+---+---+
Silencioso de carga
+----+------+---+---+

(Dirección efectiva = contenido del registro base)

Algunos ordenadores tienen esto como un modo de dirección distinto. Muchos ordenadores solo usan base más compensación con un valor offset de 0. Por ejemplo, (A7)

Registrar autoincremento indirecto

 +------+-----+-------+
Silencioso de carga Silencio reg Silencioso
+------+-----+-------+

(Dirección efectiva = contenido del registro base)

Después de determinar la dirección efectiva, el valor en el registro base se incrementa por el tamaño del elemento de datos que debe ser accedido. Por ejemplo, (A7)+ accedería al contenido del registro de direcciones A7, luego aumentaría el puntero de dirección A7 por 1 (normalmente 1 palabra). Dentro de un bucle, este modo de dirección se puede utilizar para atravesar todos los elementos de un array o vector.

En los idiomas de alto nivel se cree que a menudo es una buena idea que las funciones que devuelven un resultado no deben tener efectos secundarios (la falta de efectos secundarios hace que la comprensión y validación del programa sea mucho más fácil). Este modo de dirección tiene un efecto secundario en que el registro base se altera. Si el acceso posterior a la memoria causa un error (por ejemplo, error de página, error de autobús, error de dirección) que conduce a una interrupción, entonces reiniciar la instrucción se vuelve mucho más problemático ya que uno o más registros pueden necesitar ser devueltos al estado en el que estaban antes de que la instrucción comenzó originalmente.

Ha habido al menos dos arquitecturas de computadora que han tenido problemas de implementación con respecto a la recuperación de interrupciones cuando se utiliza este modo de direccionamiento:

  • Motorola 68000 (la dirección está representada en 24 bits). Podría tener uno o dos operados de registro de autoincremento. El 68010+ resolvió el problema guardando el estado interno del procesador en los errores de autobús o dirección.
  • DEC VAX. Podría tener hasta 6 registros de autoincremento. Cada acceso operativo podría causar dos fallas de página (si los operandos sucedieron para atracar un límite de página). Por supuesto, la instrucción misma podría ser de más de 50 bytes de largo y podría atracar un límite de página también!

Registrar autodecremento indirecto

 +----+-----+---+--+
Silencioso de carga
+----+-----+---+--+

(Dirección efectiva = nuevo contenido del registro base)

Antes de determinar la dirección efectiva, el valor en el registro base se reduce según el tamaño del elemento de datos al que se va a acceder.

Dentro de un bucle, este modo de direccionamiento se puede utilizar para retroceder a través de todos los elementos de una matriz o vector. Se puede implementar una pila utilizando este modo junto con el modo de direccionamiento anterior (incremento automático).

Consulte la discusión sobre los efectos secundarios en el modo de direccionamiento de incremento automático.

Memoria indirecta o diferida

Cualquiera de los modos de direccionamiento mencionados en este artículo podría tener un bit adicional para indicar direccionamiento indirecto, es decir, la dirección calculada utilizando algún modo es de hecho la dirección de una ubicación (normalmente una palabra completa) que contiene la dirección efectiva real.

Se puede utilizar direccionamiento indirecto para código o datos. Puede facilitar mucho la implementación de punteros, referencias o identificadores y también puede facilitar la llamada a subrutinas que de otro modo no serían direccionables. El direccionamiento indirecto conlleva una penalización en el rendimiento debido al acceso adicional a la memoria involucrado.

Algunas de las primeras minicomputadoras (por ejemplo, DEC PDP-8, Data General Nova) tenían solo unos pocos registros y solo un rango de direccionamiento directo limitado (8 bits). Por lo tanto, el uso de direccionamiento indirecto de memoria era casi la única forma de referirse a una cantidad significativa de memoria.

La mitad de los ocho modos de direccionamiento del DEC PDP-11 están diferidos. El registro diferido @Rn es lo mismo que el registro indirecto como se define anteriormente. Los modos predecremento diferido @-(Rn), postincremento diferido @(Rn)+ y diferido indexado @nn(Rn) apuntan a direcciones en la memoria que se leen para encontrar la dirección del parámetro. Los modos diferidos del PDP-11, cuando se combinan con el contador de programas, proporcionan sus modos de direccionamiento absoluto y relativo a la PC.

Relativo al PC

 +------+-------------------+
Silenciosamente carga Silencio reg1 Silenciosos base=PC Silenciosos
+------+-------------------+

reg1:= RAM[PC + offset]
(Dirección efectiva = PC + offset)

El modo de direccionamiento relativo a la PC se puede utilizar para cargar un registro con un valor almacenado en la memoria del programa a poca distancia de la instrucción actual. Puede verse como un caso especial de la estrategia "base más compensación" Modo de direccionamiento, aquel que selecciona el contador de programa (PC) como "registro base".

Hay algunas CPU que admiten referencias de datos relativos a la PC. Estas CPU incluyen:

El MOS 6502 y sus derivados utilizaron direccionamiento relativo para todas las instrucciones de rama. Solo estas instrucciones usaban este modo, los saltos usaban una variedad de otros modos de direccionamiento.

La arquitectura x86-64 y la arquitectura ARMv8-A de 64 bits tienen modos de direccionamiento relativos a la PC, llamados modos de direccionamiento "relativos a RIP" en x86-64 y "literal" en ARMv8-A. El Motorola 6809 también admite un modo de direccionamiento relativo a la PC.

La arquitectura PDP-11, la arquitectura VAX y las arquitecturas ARM de 32 bits admiten el direccionamiento relativo a la PC al tener la PC en el archivo de registro.

IBM z/Architecture incluye instrucciones específicas, por ejemplo, Carga relativa larga, con direccionamiento relativo a la PC si la función de extensión de instrucciones generales está activa.

Cuando se utiliza este modo de direccionamiento, el compilador normalmente coloca las constantes en un grupo literal inmediatamente antes o inmediatamente después de la subrutina que las utiliza, para evitar la ejecución accidental de esas constantes como instrucciones.

Este modo de direccionamiento, que siempre recupera datos de la memoria o los almacena en la memoria y luego secuencialmente falla para ejecutar la siguiente instrucción (la dirección efectiva apunta a los datos), no debe confundirse con la "rama relativa a la PC". #34; que no recupera datos ni los almacena en la memoria, sino que se ramifica a alguna otra instrucción en el desplazamiento dado (la dirección efectiva apunta a una instrucción ejecutable).

Modos de direccionamiento obsoletos

Los modos de direccionamiento enumerados aquí se utilizaron en el período 1950-1980, pero ya no están disponibles en la mayoría de las computadoras actuales. Esta lista no esta de ninguna manera completa; Se han utilizado muchos otros modos de direccionamiento interesantes y peculiares de vez en cuando, p. O-lógico-menos-absoluto de dos o tres registros de índice.

Memoria multinivel indirecta

Si el tamaño de la palabra es mayor que la dirección, entonces la palabra a la que se hace referencia para el direccionamiento indirecto de memoria podría tener un indicador indirecto configurado para indicar otro ciclo indirecto de memoria. Este indicador se conoce como bit de indirección y el puntero resultante es un puntero etiquetado; el bit de indirección etiqueta si se trata de un puntero directo o indirecto. Es necesario tener cuidado para garantizar que una cadena de direcciones indirectas no se refiera a sí misma; si es así, se puede obtener un bucle infinito al intentar resolver una dirección.

El IBM 1620, el Data General Nova, la serie HP 2100, y el NAR 2 cada uno tiene una memoria tan multinivel indirecta, y podría introducir un bucle de cálculo de direcciones tan infinito. El modo de dirección indirecta de memoria en la Nova influyó en la invención de código indirecto.

La computadora DEC PDP-10 con direcciones de 18 bits y palabras de 36 bits permitía direccionamiento indirecto multinivel con la posibilidad de utilizar también un registro de índice en cada etapa. Antes de decodificar cada palabra de dirección se consultó el sistema de interrupción prioritario. Por lo tanto, un bucle de dirección indirecto no impediría la ejecución de rutinas de servicio del dispositivo, incluido el controlador de vencimiento de intervalos de tiempo de cualquier programador preventivo multitarea. Una instrucción en bucle se trataría como cualquier otro trabajo vinculado a la computación.

Registros mapeados en memoria

En algunos ordenadores había direcciones que se referían a registros en lugar de almacenamiento primario, o a la memoria primaria utilizada para implementar esos registros. Aunque en algunas computadoras tempranas hubo direcciones de registro en el extremo alto del rango de direcciones, por ejemplo, IBM 650, IBM 7070, la tendencia ha sido utilizar sólo la dirección de registro en el extremo bajo y utilizar sólo las primeras 8 o 16 palabras de memoria (por ejemplo, ICL 1900, DEC PDP-10). Esto significaba que no había necesidad de una instrucción "add register to register" separada – se podría utilizar la instrucción "add Memory to register".

En el caso de los primeros modelos del PDP-10, que no tenían memoria caché, un bucle interno apretado cargado en las primeras palabras de la memoria (donde los registros rápidos eran direccionables si estaban instalados) se ejecutaba mucho más rápido que tendría en la memoria del núcleo magnético.

Los modelos posteriores de la serie DEC PDP-11 asignaron los registros a direcciones en el área de entrada/salida, pero esto estaba destinado principalmente a permitir el diagnóstico remoto. De manera confusa, los registros de 16 bits se asignaron a direcciones de bytes consecutivas de 8 bits.

Memoria indirecta y autoincremental

La minicomputadora DEC PDP-8 tenía ocho ubicaciones especiales (en las direcciones 8 a 15). Cuando se accede a través de direccionamiento indirecto de memoria, estas ubicaciones se incrementarían automáticamente antes de su uso. Esto facilitó el recorrido por la memoria en un bucle sin necesidad de utilizar el acumulador para incrementar la dirección.

La minicomputadora Data General Nova tenía 16 ubicaciones de memoria especiales en las direcciones 16 a 31. Cuando se accedía a través de direccionamiento indirecto de memoria, de 16 a 23 se incrementarían automáticamente antes de su uso, y de 24 a 31 disminuirían automáticamente antes de su uso.

Página cero

La familia de procesadores Data General Nova, Motorola 6800 y MOS Technology 6502 tenían muy pocos registros internos. Las instrucciones aritméticas y lógicas se realizaron principalmente con valores en la memoria y no con registros internos. Como resultado, muchas instrucciones requerían una ubicación de dos bytes (16 bits) en la memoria. Dado que los códigos de operación en estos procesadores tenían solo un byte (8 bits) de longitud, las direcciones de memoria podrían constituir una parte importante del tamaño del código.

Los diseñadores de estos procesadores incluyeron una solución parcial conocida como "página cero" direccionamiento. Se puede acceder a los 256 bytes iniciales de memoria ($0000 – $00FF; también conocida como página "0") utilizando una dirección de memoria indexada o absoluta de un byte. Esto redujo el tiempo de ejecución de la instrucción en un ciclo de reloj y la longitud de la instrucción en un byte. Al almacenar datos de uso frecuente en esta región, los programas podrían hacerse más pequeños y más rápidos.

Como resultado, la página cero se usó de manera similar a un archivo de registro. Sin embargo, en muchos sistemas esto dio como resultado una alta utilización del área de memoria de página cero por parte del sistema operativo y los programas de usuario, lo que limitó su uso ya que el espacio libre era limitado.

Página directa

El modo de dirección de página cero se mejoró en varios procesadores de 8 bits de último modelo, incluidos el WDC 65816, el CSG 65CE02 y el Motorola 6809. El nuevo modo, conocido como "página directa" direccionamiento, agregó la capacidad de mover la ventana de memoria de página cero de 256 bytes desde el inicio de la memoria (dirección de desplazamiento $0000) a una nueva ubicación dentro de los primeros 64 KB de memoria.

El CSG 65CE02 permitió que la página directa se moviera a cualquier límite de 256 bytes dentro de los primeros 64 KB de memoria almacenando un valor de desplazamiento de 8 bits en el nuevo registro de la página base (B). El Motorola 6809 podría hacer lo mismo con su registro de página directa (DP). El WDC 65816 fue un paso más allá y permitió que la página directa se moviera a cualquier ubicación dentro de los primeros 64 KB de memoria almacenando un valor de desplazamiento de 16 bits en el nuevo registro directo (D).

Como resultado, una mayor cantidad de programas pudieron utilizar el modo de direccionamiento directo de página mejorado en comparación con los procesadores heredados que solo incluían el modo de direccionamiento de página cero.

Índice escalado con comprobación de límites

Esto es similar al direccionamiento de índice escalado, excepto que la instrucción tiene dos operandos adicionales (normalmente constantes) y el hardware verifica que el valor del índice esté entre estos límites.

Otra variación utiliza descriptores vectoriales para mantener los límites; esto facilita la implementación de matrices asignadas dinámicamente y aún tiene verificación de límites completos.

Indirecto al campo de bits dentro de la palabra

Algunas computadoras tenían modos especiales de direccionamiento indirecto para subcampos dentro de palabras.

El carácter de la serie GE/Honeywell 600 que direccionaba la palabra indirecta especificaba campos de caracteres de 6 o 9 bits dentro de su palabra de 36 bits.

El DEC PDP-10, también de 36 bits, tenía instrucciones especiales que permitían tratar la memoria como una secuencia de campos de bits de tamaño fijo o bytes de cualquier tamaño desde 1 bit hasta 36 bits. Un descriptor de secuencia de una palabra en la memoria, llamado "puntero de byte", contenía la dirección de la palabra actual dentro de la secuencia, una posición de bit dentro de una palabra y el tamaño de cada byte.

Existían instrucciones para cargar y almacenar bytes a través de este descriptor y para incrementar el descriptor para que apunte al siguiente byte (los bytes no se dividieron entre límites de palabras). Gran parte del software DEC utilizaba cinco bytes de 7 bits por palabra (caracteres ASCII simples), y un bit por palabra no se utilizaba. Las implementaciones de C tenían que utilizar cuatro bytes de 9 bits por palabra, ya que el código 'malloc' La función en C supone que el tamaño de un int es un múltiplo del tamaño de un char; el múltiplo real está determinado por el operador de tiempo de compilación dependiente del sistema sizeof.

Indexar la siguiente instrucción

El Elliott 503, el Elliott 803 y el Apollo Guidance Computer solo usaban direccionamiento absoluto y no tenían ningún registro de índice. Por lo tanto, el conjunto de instrucciones no admitía saltos indirectos o saltos a través de registros. En su lugar, se le podría indicar que agregue el contenido de la palabra de memoria actual a la siguiente instrucción. Agregar un pequeño valor a la siguiente instrucción a ejecutar podría, por ejemplo, cambiar un JUMP 0 por un JUMP 20, creando así el efecto de un salto indexado. Tenga en cuenta que la instrucción se modifica sobre la marcha y permanece sin cambios en la memoria, es decir, no es un código que se modifica automáticamente. Si el valor que se agrega a la siguiente instrucción fuera lo suficientemente grande, podría modificar el código de operación de esa instrucción además de la dirección o en lugar de ella.

Glosario

Indirect
Datos referidos a través de un puntero o dirección.
Inmediatamente
Datos incrustados directamente en una lista de instrucciones o comandos.
Índice
Un offset dinámico, normalmente mantenido en un registro índice, posiblemente escalado por un tamaño de objeto.
Offset
Un valor inmediato añadido a una dirección; por ejemplo, correspondiente al acceso a la estructura de campo en el lenguaje de programación C.
Relativo
Se formó una dirección relativa a otra dirección.
Aumento de puestos
El paso de una dirección de datos usados, similar a *p++ en el lenguaje de programación C, utilizado para apilar operaciones pop.
Pre decremento
El decremento de una dirección antes del uso, similar a *--p en el lenguaje de programación C, utilizado para apilar operaciones de empuje.

Contenido relacionado

Tarjeta perforada

Una tarjeta perforada es un trozo de papel rígido que contiene datos digitales representados por la presencia o ausencia de agujeros en posiciones...

CPython

CPython es la implementación de referencia del lenguaje de programación Python. Escrito en C y Python, CPython es la implementación predeterminada y más...

Arquitectura Harvard

La Arquitectura Harvard es un modelo de arquitectura informática que separa físicamente la memoria de código de programa de la memoria de almacenamiento de...
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save