stringtranslate.com

Modo de direccionamiento

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 el o 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 nombres diferentes 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 simplemente otro modo de direccionamiento. 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 una sola instrucción "MOV".

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 operandos". 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.

Algunas computadoras, por ejemplo IBM 709 , RCA 3301, [1] no tienen un campo de modo de dirección único, sino que tienen campos separados para direccionamiento indirecto e indexación.

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. [2] [3] Se ha demostrado [4] [5] [6] que es mucho más fácil diseñar CPU canalizadas si los únicos modos de direccionamiento disponibles son los 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 sólo 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 sus sucesores, la mayoría de los 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 especificadores 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 [7] 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. [8] [7] [9]

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 . [10] [11] 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, el uso de una instrucción de este tipo con el modo de direccionamiento "base+índice+desplazamiento" (que se detalla 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 código. La nomenclatura puede variar según la plataforma.

Absoluta o directa

 +----+------------------------------+ |saltar| dirección | +----+------------------------------+ (Dirección de PC efectiva = dirección)

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

relativo a la PC

 +----+------------------------------+ |saltar| compensación | saltar relativo +----+------------------------------+ (Dirección de PC efectiva = siguiente dirección de instrucción + compensación, la compensación puede ser negativa)

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. [12]

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, la mayoría de las declaraciones if o while son razonablemente cortas). Las mediciones de programas reales sugieren que un desplazamiento de 8 o 10 bits es lo suficientemente grande para alrededor del 90% de los saltos condicionales (aproximadamente ±128 o ±512 bytes). [13]

Otra ventaja del direccionamiento relativo a la PC es que el código puede ser independiente de la posición , es decir, puede cargarse 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.

Registro indirecto

 +-------+-----+ |saltarVía| registro | +-------+-----+ (Dirección de PC efectiva = contenido del registro '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

 +------+ | nop | ejecutar la siguiente instrucción +------+ (Dirección de PC efectiva = dirección de siguiente instrucción)

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 la rama "tomada" y ejecución secuencial para la rama "no tomada".

Muchas características de las CPU modernas ( captación previa de instrucciones y canalización más compleja , ejecución fuera de orden , etc.) mantienen la ilusión de que cada instrucción termina antes de que comience la siguiente, dando los mismos resultados finales, aunque eso 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. Dichas CPU incluyen algunas computadoras con memoria de tambor como la IBM 650 , la máquina SECD , Librascope LGP-30 y la RTX 32P. [14]

Otras arquitecturas informáticas van mucho más allá e intentan sortear 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 la canalización de instrucciones . Se utiliza una instrucción como 'comparar' 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

 +------+-----+-----+ |saltarEQ| reg1| reg2| omita la siguiente instrucción si reg1=reg2 +------+-----+-----+ (Dirección de PC efectiva = dirección de siguiente instrucción + 1)

El direccionamiento omitido puede considerarse un tipo especial de modo de direccionamiento relativo a la PC con un desplazamiento fijo "+1". 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 a 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 instrucción "omitir" 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 de direccionamiento simples para datos. La nomenclatura puede variar según la plataforma.

Regístrese (o regístrese directamente)

 +------+-----+-----+-----+ | mul | reg1| reg2| reg3| 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 compensación y variaciones.

Esto a veces se denomina "base más desplazamiento".

 +------+-----+-----+----------------+ | cargar | registro | base| compensación | reg := RAM[base + desplazamiento] +------+-----+-----+----------------+ (Dirección efectiva = desplazamiento + contenido del registro base especificado)

El desplazamiento suele ser un valor de 16 bits con signo (aunque el 80386 lo amplió 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, un programador se interesará principalmente por los parámetros y las variables locales, que rara vez excederán los 64 KB , para los cuales basta con 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 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).

Inmediato/literal

 +------+-----+-----+----------------+ | añadir | reg1| reg2| constante | 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 estar firmada o sin firmar. Por ejemplo, move.l #$FEEDABBA, D0para mover el valor hexadecimal inmediato de "FEEDABBA" al registro D0.

En lugar de utilizar un operando de la memoria, el valor del operando se mantiene dentro de la propia instrucción. En la máquina DEC VAX, los tamaños literales de los operandos pueden tener 6, 8, 16 o 32 bits de longitud.

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

Implícito

 +-----------------+ | bit de transporte claro | +-----------------+ +-------------------+ | borrar acumulador | +-------------------+

El modo de direccionamiento implícito, también llamado modo de direccionamiento implícito ( lenguaje ensamblador x86 ), no especifica explícitamente una dirección efectiva ni para el origen ni para el destino (o, a veces, para 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 instrucción "cargar" y "agregar"; la fuente (el acumulador) está implícita en cada instrucción de "almacenamiento".

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 utilizan registros implícitos para uno de los operandos o resultados (multiplicación, división, conteo de salto condicional).

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 almacenada en ese puntero de pila.

Muchas computadoras de 32 bits (como 68000, ARM o PowerPC) tienen más de un registro que podría usarse como puntero de pila, por lo que usan el modo de direccionamiento "incremento automático de registro indirecto" para especificar cuál de esos registros debe usarse cuando 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

 +------+-----+------------------------------------ --+ | cargar | registro | dirección | +------+-----+------------------------------------ --+ (Dirección efectiva = dirección como se indica en las instrucciones)

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

Algunas máquinas RISC tienen una instrucción especial Load Upper Literal 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.

absoluta indexada

 +------+-----+-----+------------------------------ --+ | cargar | registro |índice| dirección | +------+-----+-----+------------------------------ --+ (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 variables globales o 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 mediante 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

 +------+-----+-----+-----+ | cargar | registro | base|índice| +------+-----+-----+-----+ (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

 +------+-----+-----+-----+----------------+ | cargar | registro | base|índice| compensación | +------+-----+-----+-----+----------------+ (Dirección efectiva = desplazamiento + 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 .

Escamoso

 +------+-----+-----+-----+ | cargar | registro | base|índice| +------+-----+-----+-----+ (Dirección efectiva = contenido del registro base especificado + contenido escalado del registro í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 el desplazamiento de un elemento particular de la matriz requerido.

Este modo de direccionamiento escala dinámicamente el valor en el registro de índice para permitir el tamaño de cada elemento de la matriz; por ejemplo, si los elementos de la matriz son números de punto flotante de doble precisión que ocupan 8 bytes cada uno, entonces el valor en el registro de í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 , por lo que se puede utilizar el desplazamiento en lugar de la multiplicación.

Registro indirecto

 +------+------+-----+ | cargar | reg1 | base| +------+------+-----+  (Dirección efectiva = contenido del registro base)

Algunas computadoras tienen esto como modo de direccionamiento distinto. Muchas computadoras simplemente usan base más compensación con un valor de compensación de 0. Por ejemplo, (A7)

Registrar autoincremento indirecto

 +------+-----+-------+ | cargar | registro | bases | +------+-----+-------+ (Dirección efectiva = contenido del registro base)

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

En lenguajes de alto nivel a menudo se piensa que es una buena idea que las funciones que devuelven un resultado no tengan 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 direccionamiento tiene el efecto secundario de que se altera el registro base. Si el acceso posterior a la memoria causa un error (por ejemplo, falla de página, error de bus, error de dirección) que conduce a una interrupción, entonces reiniciar la instrucción se vuelve mucho más problemático ya que es posible que sea necesario restablecer uno o más registros al estado en el que estaban antes. La instrucción comenzó originalmente.

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

Registrar autodecremento indirecto

 +------+-----+-----+ | cargar | registro | base| +------+-----+-----+ (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 programa, proporcionan sus modos de direccionamiento absoluto y relativo a la PC.

relativo a la PC

 +------+------+---------+----------------+ | cargar | reg1 | base=PC | compensación | +------+------+---------+----------------+ reg1: = RAM [PC + compensación] (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 del modo de direccionamiento "base más desplazamiento", uno 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 [15] tienen modos de direccionamiento relativos a la PC, llamados "RIP-relativo" 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 usa, para evitar la ejecución accidental de esas constantes como instrucciones.

Este modo de direccionamiento, que siempre recupera datos de la memoria o almacena datos 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", que no recupera datos. desde o almacena datos en la memoria, sino que se bifurca 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; Ha habido muchos otros modos de direccionamiento interesantes y peculiares utilizados de vez en cuando, por ejemplo, OR absoluto menos lógico de dos o tres registros de índice. [16] [17]

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 tienen cada uno de ellos una memoria multinivel indirecta y podrían entrar en un bucle de cálculo de direcciones tan infinito. El modo de direccionamiento indirecto de memoria en Nova influyó en la invención del código de subprocesos indirectos .

La computadora DEC PDP-10 con direcciones de 18 bits y palabras de 36 bits permitía un 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 prioritaria. [18] 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 algunas computadoras, había direcciones que hacían referencia a registros en lugar de al almacenamiento primario, o a la memoria primaria utilizada para implementar esos registros. Aunque en algunas de las primeras computadoras había direcciones de registro en el extremo superior del rango de direcciones, por ejemplo, IBM 650 , [19] [a] IBM 7070 , [20] [c], la tendencia ha sido usar solo direcciones de registro en el rango bajo. final y utilizar sólo las primeras 8 o 16 palabras de la memoria (por ejemplo, ICL 1900 , DEC PDP-10). Esto significaba que no había necesidad de una instrucción separada "agregar registro para registrar"; simplemente se podía usar la instrucción "agregar memoria para registrar".

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 de lo que lo habría hecho en Memoria de 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. [21] Esto facilitó el paso por la memoria en un bucle sin necesidad de usar 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. [22] Cuando se accedía a través de direccionamiento indirecto de memoria, 16 a 23 se incrementaría automáticamente antes de su uso, y 24 a 31 disminuiría automáticamente antes de su uso.

pagina 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 direccionamiento de "página cero". Se puede acceder a los 256 bytes iniciales de memoria ($0000 – $00FF; también conocido 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 utilizó 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.

pagina 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 direccionamiento de "página directa", 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ó mover la página directa 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 verificación de límites

Esto es similar al direccionamiento de índice escalado, excepto que la instrucción tiene dos operandos adicionales (generalmente 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 dividían 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 tuvieron que usar cuatro bytes de 9 bits por palabra, ya que la función 'malloc' en C supone que el tamaño de un int es un múltiplo del tamaño de un char ; [23] el múltiplo real está determinado por el operador en tiempo de compilación dependiente del sistema sizeof .

Índice de la siguiente instrucción

El Elliott 503 , [24] el Elliott 803 , [24] [25] 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 cambio, 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 a JUMP 0en a 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

Indirecto
Datos referidos a través de un puntero o dirección .
Inmediato
Datos incrustados directamente en una lista de instrucciones o comandos.
Índice
Un desplazamiento dinámico, normalmente mantenido en un registro de índice , posiblemente escalado según el tamaño de un objeto.
Compensar
Un valor inmediato agregado a una dirección; por ejemplo, correspondiente al acceso a campos de estructura en el lenguaje de programación C.
Relativo
Una dirección formada en relación con otra dirección.
Incremento de publicación
El paso de una dirección a través de los datos utilizados, similar *p++al lenguaje de programación C , utilizado para operaciones de pila emergente .
Pre decremento
La disminución de una dirección antes de su uso, similar a *--pla del lenguaje de programación C , que se utiliza para operaciones de inserción de pila .

Ver también

Notas

  1. ^ Unidades de almacenamiento de condensador para 650:
    Conmutadores de consola 8000
    Distribuidor 8001
    8002 Acumulador inferior
    8003 Acumulador superior
  2. ^ ab Solo válido desde consola
  3. ^ Para 5K o 10K 7070
    00xx Registro de índice xx
    9991 Acumulador 1
    9992 Acumulador 2
    9993 Acumulador 3
    9995 Registro de programa [b]
    9999 Contador de instrucciones [b]

Referencias

  1. ^ Manual de referencia del sistema - RCA 3301 REALCOM EDP (PDF) . RCA . Septiembre de 1967. 94-16-000-1 . Consultado el 21 de diciembre de 2023 .
  2. ^ F. Chow; S. Correll; M. Himelstein; E. Killian; L. Weber (1987). "¿Cuántos modos de direccionamiento son suficientes?". Noticias de arquitectura informática de ACM Sigarch . 15 (5): 117-121. doi :10.1145/36177.36193.
  3. ^ John L. Hennessy ; Mark A. Horowitz (1986). "Una descripción general del proyecto MIPS-X-MP" (PDF) . ... MIPS-X utiliza un modo de direccionamiento único: registro base más desplazamiento. Este modo de direccionamiento simple permite que el cálculo de la dirección efectiva comience muy temprano...
  4. ^ Dr. Jon Squire. "Conferencia 19, Canalización del reenvío de datos". CS411 Notas de conferencias seleccionadas .
  5. ^ "Computación de alto rendimiento, notas de la clase 11 (15 y 20 de septiembre de 2000) - Pipelining". Archivado desde el original el 27 de diciembre de 2013 . Consultado el 8 de febrero de 2014 .
  6. ^ Juan Pablo Shen, Mikko H. Lipasti (2004). Diseño de procesador moderno. Profesional de McGraw-Hill . ISBN 9780070570641.
  7. ^ ab John L. Hennessy; David A. Patterson (29 de mayo de 2002). Arquitectura informática: un enfoque cuantitativo. Elsevier. pag. 104.ISBN _ 9780080502526. El C54x tiene 17 modos de direccionamiento de datos, sin contar el acceso a registros, pero los cuatro que se encuentran en MIPS representan el 70% de los modos. El autoincremento y autodecremento, que se encuentran en algunas arquitecturas RISC, representan otro 25% del uso. Estos datos se recopilaron a partir de una medición de instrucciones estáticas para la biblioteca invocable en C de 54 rutinas DSP codificadas en lenguaje ensamblador.
  8. ^ Dra. Sofiène Tahar. "Principios del conjunto de instrucciones: uso del modo de direccionamiento (resumen)" (PDF) . Archivado desde el original (PDF) el 30 de septiembre de 2011. 3 programas medidos en máquina con todos los modos de dirección (VAX)... 75% de desplazamiento e inmediato
  9. ^ Ali-Reza Adl-Tabatabai; Geoff Langdale; Steven Lucco; Robert Wahbe (1995). "Programas móviles eficientes e independientes del idioma". Actas de la conferencia ACM SIGPLAN 1996 sobre diseño e implementación de lenguajes de programación - PLDI '96 . págs. 127-136. doi :10.1145/231379.231402. ISBN 0897917952. S2CID  2534344. El 79% de todas las instrucciones ejecutadas podrían reemplazarse por instrucciones RISC o sintetizarse en instrucciones RISC utilizando solo una combinación de instrucciones de bloque básicas.
  10. ^ Principios de funcionamiento de IBM System/360 (PDF) . IBM. Septiembre de 1968. p. 135. A22-6821-7 . Consultado el 12 de julio de 2019 .
  11. ^ z/Principios de funcionamiento de la arquitectura (PDF) . IBM. Septiembre de 2017. págs. 7–266. SA22-7832-11 . Consultado el 12 de julio de 2019 .
  12. ^ Max Maxfield. "Construcción de una computadora de 4 bits: lenguaje ensamblador y ensamblador". Sección "Modos de direccionamiento". 2019.
  13. ^ Kong, Shing; Patterson, David (1995). "Diseño de conjuntos de instrucciones". Diapositiva 27.
  14. ^ Koopman, Philip (1989). "Arquitectura del RTX 32P". Apilar computadoras .
  15. ^ "Introducción a la arquitectura ARMv8 de 64 bits". Academia UIC . quequero.org. 9 de abril de 2014.
  16. ^ Manual de funcionamiento de la máquina de procesamiento de datos electrónicos 704 (PDF) . IBM . 1955, págs. 10-11.
  17. ^ Manual de referencia del sistema de procesamiento de datos IBM 7090 (PDF) . IBM. 1962, págs. 9-10.
  18. ^ DEC-10-HMAA-D: Manual de mantenimiento del procesador central PDP-10 KA10 (PDF) (primera edición de impresión). Maynard, Massachusetts : Corporación de equipos digitales . Diciembre de 1968. págs. 2-11 . Consultado el 15 de mayo de 2021 . Figura 2-9: Cálculo de dirección efectiva: prueba "PI RQ?"
  19. ^ "Almacenamiento" (PDF) . Máquina procesadora de datos de tambor magnético 650 - manual de funcionamiento (PDF) . Junio ​​de 1955. p. 9. 22-6060-2 . Consultado el 14 de marzo de 2022 .
  20. ^ "Direcciones de registro y almacenamiento principal" (PDF) . Manual de referencia: sistema de procesamiento de datos IBM 7070 (PDF) . Enero de 1960. p. 252. A22-7003-0 . Consultado el 14 de marzo de 2022 .
  21. ^ Jones, Douglas, Instrucciones de referencia sobre el PDP-8 , consultado el 1 de julio de 2013.
  22. ^ Amigo, Carl, Resumen del conjunto de instrucciones NOVA de datos generales , consultado el 1 de julio de 2013
  23. ^ "Referencia C: función malloc()"
  24. ^ ab Dave Brooks. "Algunas computadoras viejas".
  25. ^ Bill Purvis. "Algunos detalles del hardware Elliott 803B"

enlaces externos