La arquitectura PDP-11 es una arquitectura de conjunto de instrucciones (ISA) CISC desarrollada por Digital Equipment Corporation (DEC). Está implementada en las unidades centrales de procesamiento (CPU) y los microprocesadores utilizados en los miniordenadores PDP-11. Durante la década de 1970 fue ampliamente utilizada, pero finalmente fue eclipsada en la década de 1980 por la aún más potente arquitectura VAX-11.
Memoria
Formatos de datos Las palabras de 16 bits se almacenan en formato little-endian (los bytes menos significativos aparecen primero). Los datos con 32 bits—soportados como extensiones de la arquitectura básica, p. ej., datos de coma flotante en el conjunto de instrucciones de la FPU, palabra doble o double word en el conjunto de instrucciones extendidas o los datos long en el conjunto de instrucciones comerciales—se almacenan en más de un formato, incluyendo un raro middle-endian al que a veces se nombra como "PDP-endian".pdp11/05/10/35/40, Chapter 7.pdp11/04/34a/44/60/70, page 421.
Gestión de memoria Las direcciones de 16 bits del PDP-11 pueden direccionar de forma directa hasta un máximo de 64 KiB (65.536 bytes). Para cuando el PDP-11 cedió su puesto al VAX, la notación hexadecimal y los bytes de 8 bits como unidad de medida de almacenamiento se estaban convirtiendo en estándar en la industria; sin embargo, en la arquitectura PDP-11 los valores numéricos utilizan siempre la notación octal y la cantidad de memoria instalada en un PDP-11 siempre se expresa como un número de palabras de 16 bits. Por lo tanto, el espacio de direcciones lógicas básico es de 32.768 palabras direccionables como bytes. Las 4.096 palabras del espacio de direccionamiento superior (direcciones en octal 1600008 a 1777778 en ausencia de la gestión de memoria) no se utilizan porque los registros de entrada/salida en el bus se corresponden con direcciones en ese rango. Por lo tanto, utilizando la nomenclatura habitual, originalmente un PDP-11 en su configuración máxima disponía de 28.672 palabras de 16 bits.
El procesador reserva algunas direcciones de la memoria baja para almacenar vectores de dos palabras que proporcionan los datos para el contador de programa y la palabra de estado del procesador con los cuales comenzar una rutina de servicio. Cuando un dispositivo de E/S interrumpe un programa, coloca la dirección de su vector en el bus para indicar qué rutina de servicio debe tomar el control. Los vectores inferiores se corresponden con las rutinas de servicio para gestionar varios tipos de trampas. Las trampas o excepciones se generan con algunos errores del programa, como el intento de ejecutar una instrucción no definida, y también cuando el programa ejecuta una instrucción determinada como BPT, EMT, IOT o TRAP para solicitar un servicio del sistema operativo.
Expansión de memoria El espacio de direcciones lógicas de 16 bits se convirtió en una limitación que recortaba las posibilidades de desarrollar grandes aplicaciones de software. A lo largo de la vida comercial del PDP-11, se utilizaron las siguientes técnicas para solucionar esta limitación:
Los últimos procesadores del PDP-11 incluían administración de memoria para soportar el direccionamiento virtual . El espacio de direcciones físicas se amplió de 16 a 18 o 22 bits, lo que permite direccionar hasta 256 KiB o 4 MiB de RAM respectivamente. El espacio de direcciones lógicas (es decir, el espacio de direcciones disponible en cualquier momento sin cambiar la tabla de asignación de memoria) permaneció limitado a 16 bits. Algunos modelos, comenzando con el PDP-11/45, se pueden configurar para usar 32K palabras (64 KiB) como el "espacio de instrucciones" para el código de programa y 32K palabras separadas de "espacio de datos". Algunos sistemas operativos, en particular Unix desde la edición V7 y RSX11-M+, están basados en esta característica. Algunas técnicas de programación, como la superposición de un bloque de almacenamiento de instrucciones o datos con otro según sea necesario, pueden ocultar los problemas de paginación al programador de aplicaciones. Por ejemplo, el compilador Modula-2 produce código en el que el sistema en tiempo de ejecución intercambia páginas de 8 Kib en la memoria direccionable a medida que los procedimientos individuales reciben el control. (Ver la referencia externa Arquitectura PDP-11#Enlaces externos aquí.)
Registros de la CPU Registros del DEC PDP-11 1 5 1 4 1 3 1 2 1 1 1 0 0 9 0 8 0 7 0 6 0 5 0 4 0 3 0 2 0 1 0 0 (posición del bit) Registros principales R0 Registro 0 R1 Registro 1 R2 Registro 2 R3 Registro 3 R4 Registro 4 R5 Registro 5 Puntero de pila R6 / SP Registro 6 / Stack Pointer Contador de programa R7 / PC Registro 7 / Program Counter Indicadores de estado Específico de la CPU I T N Z V C Palabra de estado del procesador / Processor Status Word Registro de estado de coma flotante / Floating Point Status Register La CPU contiene ocho registros de 16 bits de uso general (R0 a R7). El registro R7 es el contador de programa (PC). El registro R6 es el puntero de pila (SP) utilizado para interrupciones de hardware y trampas, aunque adicionalmente cualquier registro puede usarse como puntero de una pila. El registro R5 se utiliza habitualmente para apuntar al entorno de llamada del procedimiento en curso. Para acelerar los cambios de contexto algunos modelos PDP-11 proporcionan conjuntos de registros duales R1-R5. Los modos Kernel, Supervisor (si está presente) y Usuario tienen mapas de memoria separados y también punteros de pila separados (de este modo un programa de usuario no puede causar un mal funcionamiento del sistema almacenando un valor no válido en el registro de puntero de pila).
Modos de direccionamiento La mayoría de las instrucciones utilizan seis bits para especificar un operando, tres bits para seleccionar uno de los ocho modos de direccionamiento y otros tres bits para seleccionar uno de los registros de uso general.
La codificación de los seis bits del modo de direccionamiento de operandos es como sigue: 5320ModoRegistro En las siguientes secciones cada elemento incluye un ejemplo de como se escribe el operando en lenguaje ensamblador. Rn designa uno de los 8 registros de uso general, que se aparecerían descritos como R0 a R7.
Modos de direccionamiento del registro general Los siguientes ocho modos se pueden aplicar a cualquier registro de uso general. El comportamiento sobre los registros R6 (puntero de pila o SP) y R7 (contador de programa o PC) se detallan de forma separada en las siguientes secciones. Código Nombre Ejemplo Descripción 0n Registro Rn El operando está en Rn 1n Registro diferido (Rn) Rn contiene la dirección del operando 2n Autoincremento (Rn)+ Rn contiene la dirección del operando, después incrementa Rn 3n Autoincremento diferido @(Rn)+ Rn contiene la dirección de la dirección del operando, después incrementa Rn en 2 4n Autodecremento -(Rn) Disminuye Rn, después utiliza el resultado como la dirección del operando 5n Autodecremento diferido @-(Rn) Disminuye Rn en 2, después utiliza el resultado como la dirección de la dirección del operando 6n Índice X(Rn) Rn+X es la dirección del operando 7n Índice diferido @X(Rn) Rn+X es la dirección de la dirección del operando En los modos de índice e índice diferido, X es un valor de 16 bits que se toma de una segunda palabra de la instrucción. En las instrucciones de dos operandos, ambos operandos pueden utilizar estos modos y en el caso de utilizarlo ambos estas instrucciones tienen tres palabras.
Las operaciones de autoincremento y autodecremento en un registro suman y restan de 1 en 1 en instrucciones con operandos de tipo byte y de 2 en 2 en instrucciones que trabajan con palabras. En los modos de autoincremento y autodecremento diferido las operaciones son siempre de 2 en 2 ya que la cantidad a la que se dirige el registro es un puntero de direccionamiento (palabra de 16 bits).
Modos de direccionamiento del contador de programa Cuando se especifica R7 como operando (el contador de programa), cuatro de los modos de direccionamiento son útiles de forma obvia: Código Nombre Ejemplo Descripción 27 Inmediato #n El operando es la siguiente palabra de la instrucción. 37 Absoluto @#a La dirección del operando es la siguiente palabra de la instrucción. 67 Relativo a La dirección del operando es la siguiente palabra de la instrucción sumada al PC 77 Diferido relativo @a La dirección de la dirección del operando es la siguiente palabra de la instrucción sumada al PC El uso habitual del modo absoluto, cuya sintaxis combina los modos inmediato y diferido, es especificar direcciones de registros de entrada/salida, puesto que en este caso los registros de cada dispositivo tienen direcciones de memoria específicas. El modo relativo tiene una sintaxis más simple y es más típico para referirse a variables de programa y destinos de salto. Un programa que utilice para las referencias internas exclusivamente el modo relativo (y también el diferido relativo) es independiente de la posición: no asume una ubicación específica, con lo que se puede cargar en una ubicación de memoria arbitraria, o incluso moverlo con posterioridad, sin necesidad de ajustar las direcciones para reflejar su ubicación (reubicación). Al calcularse dichas direcciones en relación con la ubicación actual, el procesador realizará la reubicación sobre la marcha.
Los modos inmediato y absoluto se corresponden respectivamente con el modo de autoincremento y de autoincremento diferido aplicados al contador de programa (PC). Cuando la palabra auxiliar está "en la instrucción", como indica la tabla anterior en ambos casos, el PC para la siguiente instrucción se incrementa automáticamente más allá de la palabra auxiliar. Como el PC siempre apunta a palabras, la operación de autoincremento siempre es de 2 en 2.
Modos de direccionamiento de la pila Al registro R6 también se le denomina SP (Stack Pointer o puntero de pila) y se utiliza como el apuntador de una pila de hardware para trampas e interrupciones. Una convención impuesta por el conjunto de modos de direccionamiento que proporciona el PDP-11 establece que una pila crece hacia abajo, hacia direcciones inferiores, a medida que los elementos se insertan en ella. Cuando se aplica un modo a SP o a cualquier registro que el programador elija utilizar como una pila de software, los modos de direccionamiento tienen los siguientes efectos: Código Nombre Ejemplo Descripción 16 Diferido (SP) El operando está en la parte superior de la pila. 26 Autoincremento (SP)+ El operando está en la parte superior de la pila, después eliminar el valor. 36 Autoincremento diferido @(SP)+ Un puntero al operando está en la parte superior de la pila, después eliminar el puntero. 46 Autodecremento -(SP) Poner un valor en la pila 66 Indexado X(SP) Este modo designa cualquier elemento de la pila por su distancia positiva desde la parte superior. 76 Diferido indexado @X(SP) Este modo designa un valor que se encuentra en la dirección apuntada por un puntero en la ubicación especificada en la pila. Las pilas de software pueden contener bytes pero la pila SP siempre se considera una pila de palabras de 16 bits. Por lo tanto las operaciones de autoincremento y autodecremento sobre SP son siempre de 2 en 2.
Conjunto de instrucciones