La arquitectura PDP-11 [1] es una arquitectura de conjunto de instrucciones CISC (ISA) desarrollada por Digital Equipment Corporation (DEC). Se implementa mediante unidades centrales de procesamiento (CPU) y microprocesadores utilizados en las miniordenadores PDP-11 . Fue muy utilizado durante la década de 1970, pero finalmente fue eclipsado por la arquitectura VAX-11 más poderosa en la década de 1980.
Memoria
Formatos de datos
Las palabras de dieciséis bits se almacenan en formato little-endian (con los bytes menos significativos primero). Los datos de treinta y dos bits, admitidos como extensiones de la arquitectura básica, por ejemplo, punto flotante en el conjunto de instrucciones FPU , palabras dobles en el conjunto de instrucciones extendido o datos largos en el conjunto de instrucciones comerciales, se almacenan en más de un formato, incluido un formato inusual de middle-endian [2] [3] a veces denominado "PDP-endian".
Gestión de la memoria
Las direcciones de 16 bits del PDP-11 pueden abordar 64 KB . Para cuando el PDP-11 cedió al VAX, los bytes de 8 bits y la notación hexadecimal se estaban convirtiendo en estándar en la industria; sin embargo, los valores numéricos en el PDP-11 siempre usan notación octal, y la cantidad de memoria adjunta a un PDP-11 siempre se expresa como un número de palabras. El espacio de direcciones lógicas básico es de 32 K palabras, pero los 4 K altos del espacio de direcciones físicas (direcciones 160000 8 a 177777 8 en ausencia de administración de memoria) no se llenan porque los registros de entrada / salida en el bus responden a direcciones en ese rango. Entonces, originalmente, un PDP-11 completamente cargado tenía 28K palabras.
El procesador reserva direcciones de memoria baja para vectores de dos palabras que proporcionan un contador de programa y una palabra de estado del procesador con los que 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 más bajos son las rutinas de servicio para manejar varios tipos de trampas. Las trampas ocurren en algunos errores del programa, como un intento de ejecutar una instrucción indefinida; y también cuando el programa ejecuta una instrucción como BPT, EMT, IOT o TRAP para solicitar servicio del sistema operativo.
Expansión de memoria
El artículo PDP-11 describe cómo el espacio de direcciones lógicas de 16 bits se convirtió en una limitación insuperable. Durante la vida útil del PDP-11, se utilizaron las siguientes técnicas para solucionar la limitación:
- Los procesadores PDP-11 del modelo posterior incluían administración de memoria para admitir el direccionamiento virtual . El espacio de direcciones físicas se amplió a 18 o 22 bits, lo que permite hasta 256 KB o 4 MB de RAM. 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 KB) como el "espacio de instrucción" 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 +, solo tienen esta característica.
- Las técnicas de programación, como superponer un bloque de instrucciones o datos almacenados con otro según sea necesario, pueden ocultar problemas de paginación al programador de la aplicación. Por ejemplo, el compilador Modula-2 produce un código bajo el cual el sistema de tiempo de ejecución intercambia páginas de 8 Kb en la memoria a medida que los procedimientos individuales reciben el control. (Consulte la referencia externa aquí ).
Registros de CPU
Registros DEC PDP-11 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
La CPU contiene ocho registros de 16 bits de uso general (R0 a R7). El registro R7 es el contador de programa (PC). Aunque cualquier registro se puede utilizar como puntero de pila, R6 es el puntero de pila (SP) utilizado para interrupciones y trampas de hardware. R5 se utiliza a menudo para señalar la trama de llamada de procedimiento actual. Para acelerar el cambio 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 modo que un programa de usuario no puede hacer que el sistema funcione mal almacenando un valor no válido en el registro de puntero de pila).
Modos de direccionamiento
La mayoría de las instrucciones asignan seis bits para especificar un operando. Tres bits seleccionan uno de los ocho modos de direccionamiento y tres bits seleccionan un registro general.
La codificación del modo de direccionamiento de operandos de seis bits es la siguiente:
5 | 3 | 2 | 0 | ||
Modo | Registrarse |
En las siguientes secciones, cada elemento incluye un ejemplo de cómo se escribiría el operando en lenguaje ensamblador. Rn significa uno de los ocho registros, escrito de R0 a R7.
Modos de direccionamiento de registro general
Los siguientes ocho modos se pueden aplicar a cualquier registro general. Sus efectos cuando se aplican a R6 (el puntero de pila, SP) y R7 (el contador de programa, PC) se establecen por separado en las siguientes secciones.
Código | Nombre | Ejemplo | Descripción |
---|---|---|---|
0n | Registrarse | 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, luego incrementa Rn |
3n | Autoincrement diferido | @ (Rn) + | Rn contiene la dirección de la dirección del operando, luego incrementa Rn en 2 |
4n | Autodecremento | - (Rn) | Disminuya Rn, luego use el resultado como la dirección del operando |
5n | Autodecreción diferida | @ - (Rn) | Disminuya Rn en 2, luego use 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 tomado de una segunda palabra de la instrucción. En las instrucciones de dos operandos, ambos operandos pueden utilizar estos modos. Estas instrucciones tienen tres palabras.
Las operaciones de autoincremento y autodecreción en un registro son por 1 en instrucciones de byte, por 2 en instrucciones de palabra y por 2 siempre que se usa un modo diferido, ya que la cantidad a la que se dirige el registro es un puntero (palabra).
Modos de direccionamiento de contador de programa
Cuando se especifica R7 (el contador de programa), cuatro de los modos de direccionamiento producen naturalmente efectos útiles:
Código | Nombre | Ejemplo | Descripción |
---|---|---|---|
27 | Inmediato | #norte | 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 agregada a la PC |
77 | Diferido relativo | @a | La dirección de la dirección del operando es la siguiente palabra de la instrucción agregada a la PC |
El único uso común del modo absoluto, cuya sintaxis combina el modo inmediato y diferido, es especificar registros de entrada / salida, ya que 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 utiliza el modo relativo (y el modo diferido relativo) exclusivamente para referencias internas es independiente de la posición ; no contiene suposiciones sobre su propia ubicación, por lo que puede cargarse en una ubicación de memoria arbitraria, o incluso moverse, sin necesidad de ajustar sus direcciones para reflejar su ubicación ( reubicar ). Al calcular dichas direcciones en relación con la ubicación actual, el procesador realizó la reubicación sobre la marcha.
Los modos inmediato y absoluto son simplemente el modo diferido de autoincremento y autoincremento, respectivamente, aplicados a la PC. Cuando la palabra auxiliar está "en la instrucción", como dice la tabla anterior, la PC para la siguiente instrucción se incrementa automáticamente más allá de la palabra auxiliar. Como PC siempre apunta a palabras, la operación de autoincremento siempre es 2.
Modos de direccionamiento de pila
R6, también escrito SP, se utiliza como una pila de hardware para trampas e interrupciones. Una convención impuesta por el conjunto de modos que proporciona el PDP-11 es 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, oa cualquier registro que el programador elija usar como una pila de software, los modos de direccionamiento tienen los siguientes efectos:
Código | Nombre | Ejemplo | Descripción |
---|---|---|---|
dieciséis | 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, luego sáquelo |
36 | Autoincrement diferido | @ (SP) + | Un puntero al operando está en la parte superior de la pila; quita el puntero |
46 | Autodecremento | - (SP) | Empuje un valor en la pila |
66 | Indexado | X (SP) | Esto se refiere a cualquier elemento de la pila por su distancia positiva desde la parte superior. |
76 | Diferido indexado | @X (SP) | Esto se refiere a un valor al que se encuentra un puntero en la ubicación especificada en la pila. |
Aunque las pilas de software pueden contener bytes, SP siempre es una pila de palabras. Las operaciones de autoincremento y autodecreción en SP siempre son 2.
Conjunto de instrucciones
El PDP-11 funciona con bytes y palabras. Los bytes se especifican mediante un número de registro, que identifica el byte de orden inferior del registro, o mediante una ubicación de memoria. Las palabras se especifican mediante un número de registro o mediante la ubicación de memoria del byte de orden inferior, que debe ser un número par. En la mayoría de las instrucciones que toman operandos, el bit 15 se establece para especificar el direccionamiento de bytes, o se borra para especificar el direccionamiento de palabras. En las listas de las dos secciones siguientes, el programador en lenguaje ensamblador agregó B al símbolo de instrucción para especificar una operación de byte; por ejemplo, MOV se convirtió en MOVB.
Algunas instrucciones, por ejemplo MARK y SOB, no se implementaron en algunos modelos PDP-11.
Instrucciones de doble operando
Los cuatro bits de orden superior especifican la operación a realizar (con el bit 15 generalmente seleccionando el direccionamiento de palabra frente a byte). Dos grupos de seis bits especifican el modo de direccionamiento del operando de origen y el modo de direccionamiento del operando de destino, como se definió anteriormente.
15 | 12 | 11 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||
Código de operación | Src | Registrarse | Dest | Registrarse |
Código de operación | Mnemotécnico | Operación |
---|---|---|
01 | MOV | Moverse: Dest ← Src Nota: Mover un byte a un signo de registro se extiende a los bits 8-15 |
11 | MOVB | |
02 | CMP | Comparar: Set-flags(Src − Dest) |
12 | CMPB | |
03 | UN POCO | Prueba de bits: Set-flags(Src ∧ Dest) |
13 | BITB | |
04 | BIC | Poco claro: Dest ← Dest ∧ Ones-complement(Src) |
14 | BICB | |
05 | BIS | Conjunto de bits: Dest ← Dest ∨ Src |
15 | BISB | |
06 | AGREGAR | Agregar: Dest ← Dest + Src |
dieciséis | SUB | Sustraer: Dest ← Dest − Src |
Las instrucciones ADD y SUB usan direccionamiento de palabras y no tienen variaciones orientadas a bytes.
Algunas instrucciones de dos operandos utilizan un operando de modo de direccionamiento y un operando de registro adicional:
15 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||||
Código de operación | Reg | Src / Dest | Registrarse |
Cuando se utiliza un par de registros (escrito a continuación como "(Reg, Reg + 1)", el primer registro contiene la parte de orden inferior del operando y debe ser un registro de número par. El siguiente registro de número superior contiene la parte de orden superior parte del operando (o el resto). Una excepción es la instrucción de multiplicación; Reg puede ser impar, pero si lo es, los 16 bits más altos del resultado no se almacenan.
Código de operación | Mnemotécnico | Operación |
---|---|---|
070 | MUL | Multiplicar: (Reg, Reg+1) ← Reg × Src |
071 | DIV | Dividir: Compute (Reg, Reg+1) ÷ Src; Reg ← quotient; Reg+1 ← remainder |
072 | CENIZA | Desplazamiento aritmético: if Src<5:0> < 0 then Reg ← Shift-right(Reg, -Src<5:0>) else Reg ← Shift-left(Reg, Src<5:0>) |
073 | ASHC | Desplazamiento aritmético combinado: if Src<5:0> < 0 then (Reg, Reg+1) ← Shift-right((Reg, Reg+1), -Src<5:0>)
|
074 | XOR | Exclusivo o: Dest ← Dest ⊻ Reg |
Instrucciones de un solo operando
Los diez bits de orden superior especifican la operación a realizar, con el bit 15 seleccionando generalmente el direccionamiento de bytes frente a palabras. Un solo grupo de seis bits especifica el operando como se definió anteriormente.
15 | 6 | 5 | 3 | 2 | 0 | ||||||||||
Código de operación | Src / Dest | Registrarse |
Código de operación | Mnemotécnico | Operación |
---|---|---|
0001 | JMP | Saltar: PC ← Src |
0003 | TORUNDA | Intercambiar bytes de palabra: Dest ← Swap-bytes(Dest) |
0050 | CLR | Claro: Dest ← 0 |
1050 | CLRB | |
0051 | COM | Complemento: Dest ← Ones-complement(Dest) |
1051 | PEINE | |
0052 | C ª | Incremento: Dest ← Dest + 1 |
1052 | JIFE | |
0053 | DIC | Decremento: Dest ← Dest − 1 |
1053 | DECB | |
0054 | NEG | Negar: Dest ← Twos-complement(Dest) |
1054 | NEGB | |
0055 | ADC | Agregar llevar: Dest ← Dest + C flag |
1055 | ADCB | |
0056 | SBC | Restar acarreo: Dest ← Dest - C flag |
1056 | SBCB | |
0057 | TST | Prueba: Set-flags(Src) |
1057 | TSTB | |
0060 | ROR | Gira a la derecha: Dest ← Rotate-right(Dest, 1) |
1060 | RORBO | |
0061 | ROL | Girar a la izquierda: Dest ← Rotate-left(Dest, 1) |
1061 | ROLB | |
0062 | ASR | Desplazamiento aritmético a la derecha: Dest ← Shift-right(Dest, 1) |
1062 | ASRB | |
0063 | ASL | Desplazamiento aritmético a la izquierda: Dest ← Shift-left(Dest, 1) |
1063 | ASLB | |
1064 | MTPS | Mover a PSW: PSW ← Src |
0065 | MFPI | Mover desde el espacio I anterior: −(SP) ← Src |
1065 | MFPD | Mover desde el espacio D anterior: −(SP) ← Src |
0066 | MTPI | Mover al espacio I anterior: Dest ← (SP)+ |
1066 | MTPD | Mover al espacio D anterior: Dest ← (SP)+ |
0067 | SXT | Signo extender: if N flag ≠ 0 then Dest ← -1 else Dest ← 0 |
1067 | MFPS | Mover desde PSW: Dest ← PSW |
Instrucciones de rama
En la mayoría de las instrucciones de bifurcación, si la bifurcación se toma se basa en el estado de los códigos de condición. Una instrucción de bifurcación suele estar precedida por una instrucción CMP (comparar) o BIT (prueba de bits) de dos operandos o una instrucción TST (prueba) de un operando. Las instrucciones aritméticas y lógicas también establecen los códigos de condición. A diferencia de los procesadores Intel en la arquitectura x86 , las instrucciones MOV también los configuran, por lo que se podría usar una instrucción de bifurcación para bifurcar dependiendo de si el valor movido fue cero o negativo.
El byte de orden superior de la instrucción especifica la operación. Los bits 9 a 15 son el código de operación y el bit 8 es el valor del cálculo del código de condición que da como resultado la toma de la rama. El byte de orden inferior es un desplazamiento de palabra con signo relativo a la ubicación actual del contador del programa. Esto permite bifurcaciones hacia adelante y hacia atrás en el código.
15 | 9 | 8 | 7 | 0 | |||||||||||
Código de operación | C | Compensar |
Código de operación | C | Mnemotécnico | Condición u operación |
---|---|---|---|
000 | 1 | BR | Rama siempre PC ← PC + 2 × Sign-extend(Offset) |
001 | 0 | BNE | Rama si no es igual Z = 0 |
001 | 1 | BEQ | Rama si es igual Z = 1 |
002 | 0 | BGE | Rama si es mayor o igual (N ⊻ V) = 0 |
002 | 1 | BLT | Rama si es menor que (N ⊻ V) = 1 |
003 | 0 | BGT | Rama si es mayor que (Z ∨ (N ⊻ V)) = 0 |
003 | 1 | BLE | Rama si es menor o igual (Z ∨ (N ⊻ V)) = 1 |
100 | 0 | BPL | Rama si es más N = 0 |
100 | 1 | IMC | Rama si es menos N = 1 |
101 | 0 | BHI | Rama si es más alto (C ∨ Z) = 0 |
101 | 1 | BLOS | Rama si es menor o igual (C ∨ Z) = 1 |
102 | 0 | BVC | Bifurcar si se desborda claro V = 0 |
102 | 1 | BVS | Rama si se establece el desbordamiento V = 1 |
103 | 0 | BCC o BHIS | Bifurcación si se lleva libre, o Bifurcación si es superior o igual C = 0 |
103 | 1 | BCS o BLO | Bifurcación si se transporta, o bifurcación si es más baja C = 1 |
El rango limitado de las instrucciones de las ramas significaba que, a medida que el código crecía, las direcciones de destino de algunas ramas se volverían inalcanzables. El programador cambiaría la instrucción BR de una palabra a la instrucción JMP de dos palabras del siguiente grupo. Como JMP no tiene formas condicionales, el programador cambiaría BEQ a un BNE que se ramificara alrededor de un JMP.
SOB (Restar uno y rama) es otra instrucción de rama condicional. El registro especificado se reduce en 1, y si el resultado no es cero, se toma una rama inversa basada en el desplazamiento de palabra de 6 bits.
15 | 9 | 8 | 6 | 5 | 0 | ||||||||||
Código de operación | Reg | Compensar |
Código de operación | Mnemotécnico | Operación |
---|---|---|
077 | SOLLOZO | Subtract One and Branch: Reg ← Reg - 1; if Reg ≠ 0 then PC ← PC - 2 × Offset |
Instrucciones de subrutina
La instrucción JSR podría guardar cualquier registro en la pila. Los programas que no necesitaban esta característica especificaron PC como el registro (JSR PC, dirección) y la rutina regresó usando RTS PC. Si se llamara a una rutina con, por ejemplo, "JSR R4, dirección", entonces el antiguo valor de R4 estaría en la parte superior de la pila y la dirección de retorno (justo después de JSR) estaría en R4. Esto permite que la rutina obtenga acceso a valores codificados en línea especificando (R4) +, oa punteros en línea especificando @ (R4) +. La autoincrementación se movió más allá de estos datos, hasta el punto en el que se reanudó el código de la persona que llama. Tal rutina tendría que especificar RTS R4 para regresar a su llamador.
15 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||||
Código de operación | Reg | Src | Registrarse |
Código de operación | Mnemotécnico | Operación |
---|---|---|
004 | JSR | Saltar a la subrutina: -(SP) ← Reg; Reg ← PC; PC ← Src |
15 | 3 | 2 | 0 | ||||||||||||
Código de operación | Reg |
Código de operación | Mnemotécnico | Operación |
---|---|---|
00020 | RTS | Regreso de la subrutina: PC ← Reg; Reg ← (SP)+ |
Instrucciones de trampa
15 | 9 | 8 | 7 | 0 | |||||||||||
Código de operación | S | Código de operación |
Código de operación | S | Mnemotécnico | Operación |
---|---|---|---|
104 | 0 | EMT | Trampa del emulador: -(SP) ← PS; -(SP) ← PC; PC ← (30); PS ← (32) |
104 | 1 | TRAMPA | Trampa general: -(SP) ← PS; -(SP) ← PC; PC ← (34); PS ← (36) |
15 | 0 | ||||||||||||||
Código de operación |
Código de operación | Mnemotécnico | Operación |
---|---|---|
000002 | RTI | Retorno de la interrupción: PC ← (SP)+; PS ← (SP)+ |
000003 | BPT | Trampa de punto de interrupción: -(SP) ← PS; -(SP) ← PC; PC ← (14); PS ← (16) |
000004 | IOT | Trampa de E / S: -(SP) ← PS; -(SP) ← PC; PC ← (20); PS ← (22) |
000006 | RTT | Regreso de la trampa: PC ← (SP)+; PS ← (SP)+ |
Asignaciones de direcciones de vectores de excepción y trampa
Vector | Condición |
---|---|
000000 | (Reservado) |
000004 | Instrucción ilegal, error de bus, límite de pila |
000010 | Instrucción reservada |
000014 | Instrucción BPT, trampa de rastreo |
000020 | Instrucción IOT |
000030 | Instrucción EMT |
000034 | Instrucción TRAP |
000244 | Excepción de punto flotante |
000250 | Fallo de gestión de memoria |
Instrucciones misceláneas
15 | 0 | ||||||||||||||
Código de operación |
Código de operación | Mnemotécnico | Operación |
---|---|---|
000000 | DETENER | Detener procesador: Halt execution before next instruction |
000001 | ESPERE | Espere la interrupción: Halt execution before next instruction; Resume execution at next interrupt handler |
000005 | REINICIAR | Restablecer UNIBUS: Assert INIT on UNIBUS for 10 ms; All other devices reset to power up state |
Operaciones de código de condición
15 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||||||
Código de operación | 1 | S | norte | Z | V | C |
Código de operación | S | Mnemotécnico | Operación |
---|---|---|---|
0002 | 0 | CCC | Códigos de condición claros: Clear codes according to N, Z, V, C bits |
0002 | 1 | Scc | Establecer códigos de condición: Set codes according to N, Z, V, C bits |
Los cuatro códigos de condición en la palabra de estado del procesador (PSW) son
- N indica un valor negativo
- Z indica una condición cero (igual)
- V indica una condición de desbordamiento, y
- C indica una condición de acarreo.
Las instrucciones de este grupo eran lo que Digital llamaba "microprogramadas": un solo bit en la palabra de instrucción hacía referencia a un solo código de condición. El ensamblador no definió la sintaxis para especificar cada combinación, pero los símbolos SCC y CCC ensamblaron una instrucción que estableció o borró, respectivamente, los cuatro códigos de condición.
Borrar o configurar ninguno de los códigos de condición (códigos de operación 000240 y 000260, respectivamente) podría considerarse efectivamente como instrucciones de no operación. De hecho, el mnemónico NOP se ensambló en 000240.
Conjuntos de instrucciones opcionales
- Conjunto de instrucciones extendido (EIS)
El EIS era una opción para el 35/11/40 y el 03/11, y era estándar en los procesadores más nuevos.
- MUL, DIV multiplica y divide el operando entero para registrar el par
- ASH, ASHC aritmética: desplaza un registro o un par de registros. Para un número positivo, se desplazará a la izquierda y a la derecha para uno negativo.
- Conjunto de instrucciones flotantes (FIS)
El conjunto de instrucciones FIS era una opción para los modelos PDP-11/35/40 y 11/03
- FADD, FSUB, FMUL, FDIV solo para operación de precisión simple en pila direccionada por operando de registro
- Procesador de punto flotante (FPP)
Esta fue la opción de procesador de punto flotante opcional para 11/45 y la mayoría de los modelos posteriores.
- operaciones de coma flotante completas en operandos de precisión simple o doble, seleccionados por bit simple / doble en el registro de estado de coma flotante
- formato de datos de coma flotante de precisión simple predecesor del formato IEEE 754 : bit de signo, exponente de 8 bits, mantisa de 23 bits con bit oculto 24
- Conjunto de instrucciones comerciales (CIS)
El CIS se implementó mediante un microcódigo opcional en el 23/11/24, y mediante un módulo adicional en el 44/11 y en una versión del 74/11. Proporcionó instrucciones de cadena y decimales utilizadas por COBOL y Dibol .
- Acceso a la palabra de estado del procesador (PSW)
El PSW se asignó a la dirección de memoria 177 776, pero las instrucciones que se encuentran en todos los PDP-11, excepto en los primeros, dieron a los programas un acceso más directo al registro.
- SPL (establecer el nivel de prioridad)
- MTPS (pasar al estado del procesador)
- MFPS (pasar del estado del procesador)
- Acceso a otros espacios de memoria
En los PDP-11 que proporcionaban múltiples espacios de instrucciones y espacios de datos, un conjunto de instrucciones Move no ortogonales daba acceso a otros espacios. Por ejemplo, las rutinas del sistema operativo que manejan las llamadas de servicio en tiempo de ejecución usarían estas instrucciones para intercambiar información con la persona que llama.
- MTPD (pasar al espacio de datos anterior)
- MTPI (pasar al espacio de instrucción anterior)
- MFPD (pasar del espacio de datos anterior)
- MFPI (moverse desde el espacio de instrucción anterior)
Instrucciones inconsistentes
Durante la vida del PDP-11, surgieron diferencias sutiles en la implementación de instrucciones y combinaciones de modos de direccionamiento, aunque ninguna implementación se consideró correcta. Las inconsistencias no afectaron el uso ordinario del PDP-11.
Velocidad
La velocidad del procesador PDP-11 varía según el modelo, la configuración de la memoria, el código de operación y los modos de direccionamiento. El tiempo de instrucción tenía hasta tres componentes, ejecución / recuperación de la instrucción en sí y tiempo de acceso para el origen y el destino. Los dos últimos componentes dependían del modo de direccionamiento. Por ejemplo, en el PDP-11/70 (circa 1975), una instrucción de la forma ADD x (R m ), y (R n ) tenía un tiempo de recuperación / ejecución de 1,35 microsegundos más los tiempos de origen y destino de 0,6 microsegundos cada uno. , para un tiempo total de instrucción de 2,55 microsegundos. Cualquier caso en el que la memoria direccionada no estuviera en la caché agregó 1.02 microsegundos. El registro a registro ADD R m , R n podría ejecutarse desde la caché en 0,3 microsegundos. El punto flotante era aún más complejo, ya que había cierta superposición entre la CPU y el procesador de punto flotante, pero en general, el punto flotante era significativamente más lento. Una instrucción de suma flotante de precisión simple podría oscilar entre 2,4 y 5,5 microsegundos más el tiempo para obtener los operandos. [4]
Interrupciones
El PDP-11 operaba a un nivel de prioridad de 0 a 7, declarado por tres bits en la palabra de estado del procesador (PSW) , y los modelos de gama alta podían operar en una variedad de modos, Kernel (privilegiado), Usuario (aplicación), ya veces Supervisor, según dos bits del PSW.
Para solicitar una interrupción, un dispositivo de bus afirmaba una de las cuatro líneas de bus comunes, BR4 a BR7, hasta que el procesador respondiera. Los números más altos indicaron una mayor urgencia, tal vez que los datos podrían perderse o un sector deseado podría girar fuera de contacto con los cabezales de lectura / escritura a menos que el procesador respondiera rápidamente. La preparación de la impresora para otro carácter era la prioridad más baja (BR4), ya que permanecería lista indefinidamente. Si el procesador estuviera funcionando en el nivel 5, entonces BR6 y BR7 estarían en orden. Si el procesador estuviera funcionando a 3 o menos, concedería cualquier interrupción; si tiene 7, no concedería ninguno. Las solicitudes de autobús que no se concedieron no se perdieron sino que simplemente se aplazaron. El dispositivo que necesita servicio continuará afirmando su solicitud de bus.
Siempre que una interrupción excedía el nivel de prioridad del procesador, el procesador afirmó la concesión de bus correspondiente, BG4 a BG7. Las líneas de concesión de bus no eran líneas comunes, sino una cadena de margaritas : la entrada de cada puerta era la salida de la puerta anterior en la cadena. Había una puerta en cada dispositivo de bus, y un dispositivo físicamente más cercano al procesador estaba antes en la cadena tipo margarita. Si el dispositivo había realizado una solicitud, al detectar su entrada de concesión de bus, podría concluir que tenía el control del bus y no pasó la señal de concesión al siguiente dispositivo en el bus. Si el dispositivo no había realizado una solicitud, propagaba su entrada de concesión de bus a su salida de concesión de bus, dando al siguiente dispositivo más cercano la oportunidad de responder. (Si los dispositivos no ocupaban ranuras adyacentes a la placa del procesador, las "tarjetas de concesión de continuidad" insertadas en las ranuras vacías propagaban la línea de concesión de bus).
Una vez en control del bus, el dispositivo eliminó su solicitud de bus y colocó en el bus la dirección de memoria de su vector de dos palabras. El procesador guardó el contador de programa (PC) y PSW, ingresó al modo Kernel y cargó nuevos valores del vector especificado. Para un dispositivo en BR6, el nuevo PSW en su vector normalmente especificaría 6 como la nueva prioridad del procesador, por lo que el procesador cumpliría con las solicitudes más urgentes (BR7) durante la rutina de servicio, pero pospondría las solicitudes de la misma o menor prioridad. Con la nueva PC, el procesador pasó a la rutina de servicio del dispositivo de interrupción. Esa rutina hizo funcionar el dispositivo, al menos eliminando la condición que causó la interrupción. La rutina terminó con la instrucción RTI (ReTurn from Interrupt), que restauró PC y PSW justo antes de que el procesador concediera la interrupción.
Si se realizó una solicitud de bus por error y ningún dispositivo respondió a la concesión de bus, el procesador agotó el tiempo de espera y realizó una captura que sugeriría un hardware defectuoso.
Lenguaje ensamblador MACRO-11
MACRO-11 es el lenguaje ensamblador del PDP-11. Es el sucesor de PAL-11 (Program Assembler Loader), una versión anterior del lenguaje ensamblador PDP-11 sin macros. MACRO-11 fue compatible con todos los sistemas operativos DEC PDP-11. Los sistemas Unix PDP-11 también incluyen un ensamblador (llamado " as "), estructuralmente similar a MACRO-11, pero con diferente sintaxis y menos características.
Notas
- ^ "Manual del procesador PDP-11" (PDF) . DIC . Consultado el 13 de noviembre de 2015 .
- ^ pdp11 / 05/10/35/40, Capítulo 7.
- ^ pdp11 / 04 / 34a / 44/60/70, página 421.
- ^ Manual del procesador DEC PDP-11/70, 1975, Apéndice C, Tiempo de instrucción
Referencias
- Manual del procesador pdp11 - pdp11 / 05/10/35/40 . Corporación de Equipos Digitales. 1973.
- Manual del procesador pdp11 - pdp11 / 04 / 34a / 44/60/70 . Corporación de Equipos Digitales. 1979.
Otras lecturas
- Eckhouse, hijo, Richard H .; Morris, L. Robert (1979). Organización, Programación y Aplicaciones de Sistemas Microinformáticos (PDP-11) . Acantilados de Englewood, Nueva Jersey : Prentice-Hall . ISBN 0-13-583914-9.
- Michael Singer, PDP-11. Programación de lenguaje ensamblador y organización de máquinas , John Wiley & Sons, NY: 1980.
enlaces externos
- PDP-11 Procesador Handbook (de Gordon Bell edición 1969 , 1979 edición en bitsavers )
- Conservación de la serie PDP-11 de miniordenadores de 16 bits
- Artículo de 1975 de Gordon Bell y Bill Strecker, Lo que aprendimos del PDP-11
- Ersatz-11 , un emulador de PDP-11
- Más artículos y enlaces en el sitio de Gordon Bell .
- La bola de pelusa
- Sobre LSI-11, RT-11, Megabytes de memoria y Modula-2 / VRS por Günter Dotzel, ModulaWare.com - Un artículo sobre la sinergia del compilador / enlazador Modula-2 para superar las limitaciones de espacio de direcciones PDP / LSI-11, publicado en DEC PROFESSIONAL, La revista para usuarios de DEC, Prensa profesional, Spring House, PA. Estados Unidos, enero de 1986.