3.

2 Arquitectura del Procesador
§1 Sinopsis El procesador es todo un mundo en sí mismo; aunque los primeros eran comparativamente simples, actualmente han alcanzado una notable complejidad. En el presente capítulo dedicaremos algunos comentarios a su estructura lógica, mencionando de pasada que su tecnología física ha avanzado paralelamente con la de construcción de circuitos integrados, IC's, lo que a la postre ha significado unas dimensiones físicas cada vez más pequeñas y un menor consumo. La evolución de ambos parámetros no solo ha permitido incrementar la densidad de integración, también la velocidad (frecuencia de funcionamiento). Si nos referimos a la familia Intel, de los 2.100 transistores del 4004 en 1970, que con solo 46 instrucciones funcionaba a unos 800 KHz, se pasó a los 29.000 transistores del 8086 en 1979 a 14 MHz; y en 1999 a los 8.200.000 transistores del Pentium III a 2 GHz. Nota: acabo de leer (Noviembre 2001) que Intel anuncia la nueva tecnología de 0.13 micras para su serie Pentium 4 (hasta ahora era de 0.18 micras), con la que se espera que a fines de 2002 se alcancen los 3 GHz. en estos procesadores. Un poco después (Enero 2002) leo que Intel espera alcanzar 1.2 THz en sus procesadores para el 2005 (escribo esto en un Pentium II a 200 MHz no demasiado antiguo). En Abril del 2002 Intel anuncia el procesador Pentium 4 con tecnología CMOS de 0,16 micras a 2.4 GHz y mejoras en el proceso de fabricación que permiten su fabricación en obleas de 300 mm. Esta tecnología permite al fabricante proporcionar más de cinco veces el volumen de productos en una sola oblea en comparación con la del procesador Pentium 4 inicial. En Junio del mismo año Intel desvela su nueva tecnología de fabricación de transistores "TeraHerz", con la que pretende que en el 2005 pueda alcanzar los 10 GHz. Craig Barret, CEO [7] de la compañía, afirma que en un futuro no lejano esperan conseguir 2.000 millones de transistores en un procesador a 30 GHz. Actualmente se trabaja en el límite de la resolución óptica de los dispositivos utilizados en su construcción (se usan técnicas fotográficas con longitudes de onda cada vez menores para la luz utilizada), y debido a la altísima frecuencia de funcionamiento, los conductores internos funcionan más como guías de onda que como conductores eléctricos convencionales. Además, las dimensiones físicas del propio dispositivo están teóricamente limitadas si se desea que todos sus elementos funcionen según un mismo patrón de tiempo (cosa que es imprescindible). Para dar una idea de las formidables dificultades técnicas que han debido resolver los diseños actuales, considere que a la velocidad del Pentium III, las señales eléctricas solo recorren 15 centímetros en cada ciclo de reloj.

Naturalmente cada criterio tiene sus pros y sus contra en lo que a rendimiento se refiere. La circuitería del procesador también es compleja. rapidez individual aunque hay que ejecutar un mayor número [2]. podemos decir que frente a esta cuestión caben dos filosofías de diseño. Este conjunto de instrucciones (órdenes) es el lenguaje que realmente entiende el procesador. Para cualquier operación se requieren varias instrucciones elementales. diríamos que muy descriptivas y específicas. las máquinas CISC utilizan instrucciones muy complejas. Como puede deducirse de sus propios nombres. Utilizan instrucciones muy simples. La decisión es trascendente. lentitud de cada instrucción frente a poca cantidad de ellas. La circuitería es más simple que en los procesadores CISC. Primero: el juego de instrucciones decide el diseño físico del conjunto. En las máquinas CISC. por tanto de ejecución lenta. Las instrucciones son muy simples. que deben ser cuidadosamente escogidas. . Segundo: cualquier operación que deba ejecutarse con el procesador deberá poder ser descrita en términos de este "lenguaje" elemental (recuerde que los compiladores e intérpretes son en realidad traductores desde el lenguaje de alto nivel (fuente) a este lenguajemáquina.§2 Tipos de arquitectura Una de las primeras decisiones a la hora de diseñar un procesador es decidir cual será su juego de instrucciones. por dos razones. Sin entrar en detalles. La primera conduce a máquinas denominadas CISC ("Complex Instruction Set Computer"). y constituye lo que se conoce como lenguaje ensamblador o lenguaje-máquina [1]. porque cualquier operación debe ser expresada como una secuencia de estas pocas instrucciones. Las máquinas RISC representan el enfoque opuesto. las máquinas construidas según el otro criterio se denominan RISC ("Reduced Instruction Set Computer"). Para un trabajo específico se requieren pocas instrucciones (siempre hay una que resuelve el problema). lo que necesariamente se traduce en varias consecuencias: • • • El lenguaje debe contener un amplio surtido de ellas (una para cada circunstancia distinta). Las consecuencias son justamente opuestas a las anteriores: • • • El lenguaje contiene un conjunto pequeño de instrucciones. Son instrucciones complejas. en las RISC. por tanto de ejecución rápida.

Comparados con los accesos a RAM. los de registro son como mínimo 10 veces más veloces.1. nos detendremos brevemente la descripción de la arquitectura del 8088. y que son de dimensiones mínimas [3].1 Los registros El procesador necesita para su funcionamiento de ciertas áreas de almacenamiento. §3.1 Registros de uso general . De forma esquemática podemos suponer que un procesador se compone de cinco elementos: • • • • • Memoria Unidad Artimético-Lógica ALU ("Arithmetic and Logic Unit" Unidad de Control CU ("Control Unit" Bus interno Conexiones con el exterior ( 3. tienen la ventaja de su rapidez. que aquí se llaman registros. En le figura 1 se muestran sus elementos. además de ser el motor del primer PC. El 8088 dispone de catorce registros de 16 bits que se agrupan en cuatro grupos y que reciben nombres especiales (precisamente los que se utilizan para designarlos en lenguaje ensamblador).§3 Componentes principales. es uno de los primeros ejemplares de una prolífica saga que ha tenido una gran influencia en la informática actual.1) ) ) Puesto que su conocimiento es esencial para la programación en ensamblador. §3.2. Además recordemos que incluso los modernos Pentium pueden emular el funcionamiento en modo real de sus ancestros. sin embargo.

aunque pueden ser utilizados a discreción para cualquier cosa que necesitemos. contiene el número de puerto ( 2. Señala la dirección del segmento donde está la pila del programa ( E1. Utilizándolos en conjunción con otros registros que señalan las direcciones concretas dentro de estos segmentos (los desplazamientos ). los datos y la pila. multiuso. BX es el registro base. §3. DH y DL. su mitad inferior DL. En general las instrucciones que trabajan con este registro (o su mitad inferior) tienen un microcódigo • • • más simple que la misma instrucción ejecutada con otro registro. Señala la dirección del segmento de código del programa que se está ejecutando ( E1.3. y después de esta. en caso necesario pueden ser utilizados en dos mitades (nibbles). Ver al respecto el epígrafe "Direccionamiento segmentado" ( • • • • 5. Segmento de datos DS ("Data segment"). AL.1). el resultado de la operación. DX es un registro de datos. Segmento de código CS ("Code segment").3. BX. CX y DX que en realidad tienen asignados usos característicos. Señala la dirección del segmento de datos del programa en ejecución ( E1. Es un segmento auxiliar a los anteriores.1.2). Segmento extra ES ("Extra segment"). suele contener la dirección de inicio de una tabla de valores. BH. suele contener uno de los operandos que intervienen en las operaciones aritméticas y lógicas. permiten manejar la totalidad de la memoria direccionable (el bus de direcciones es de 20 bits). CX es denominado contador. los anteriores y sus mitades: AH.2). se utiliza para señalar espacio extra en alguno de los segmentos o para almacenar momentáneamente direcciones intermedias. Aunque estos cuatro registros son de 16 bits (como los 10 restantes) [6].Existen 4 registros denominados AX.2 Registros de segmento Se dispone de cuatro registros que sirven para contener las direcciones de otros tantos segmentos (zonas de 64 KB de memoria). • AX es denominado acumulador. Las instrucciones de bucle (LOOP) utilizan este registro como contador. "High" y "Low".1. Segmento de pila SS ("Stack segment"). §3. de 8 bits. CL.3 Registros de puntero . con lo que puede considerarse que existen 12 registros de uso general (no simultáneos).5).3. CH.2). Nota: Puede ocurrir que programas pequeños utilicen el mismo segmento para el código. En operaciones de entrada/salida de puertos IN/OUT. Se utiliza en operaciones de multiplicación y división junto con AX. BL.

Cada bits individual puede estar "activo" (1) o "inactivo" (0). una nueva invocación de función creará un nuevo registro de activación que comenzará en este punto. el índice fuente SI ("Source index") y el índice destino DI ("Destination index"). Si está activo Indica un número par de bits activos (bits cuyo .2 Ejemplo-2).1. señala el desplazamiento del final de la pila dentro del segmento de pila SS.1 Fig. • • • Ver en la página adjunta un ejemplo relativo al uso de punteros ( §3.2) El primero. indica el desplazamiento (dentro del segmento de código CS) de la próxima instrucción a ejecutar. estas direcciones son desplazamientos dentro de los segmentos indicados por los registros de segmento • (ver figura 5. se muestran en la figura 2.Son 5 registros destinados a contener direcciones. En caso necesario la pila puede crecer a partir de este punto. Son los siguientes: Bit Indicador de: CF Acarreo ("Carry Flag") PF Paridad ("Parity Uso Indicador de arrastre del bit de mayor orden. y tiene un identificador que termina en F ("Flag"). 3. denominado indistintamente puntero de instrucción IP ("Instrucción pointer") y contador de programa PC ("Program counter"). que puede ocurrir en las operaciones aritméticas suma y resta. si después de una suma aritmética hay o no desbordamiento del bit más significativo. El puntero base BP ("Base pointer") señala el desplazamiento (dentro del segmento de pila SS) donde se encuentra el origen de la zona ocupada por las variables dinámicas. desde un punto inicial de un segmento de datos. a otro. de forma que por ejemplo. Los nombres y situación de cada uno. Generalmente estos dos registros se utilizan con alguno de los registros de uso general y con ciertas instrucciones específicamente pensadas para transferir datos (dentro de un rango de posiciones de memoria). en razón de su utilización muy particular. El puntero de pila SP ("Stack Pointer"). en el que 9 de los 18 bits actúan como semáforos (indicadores del estado del procesador y del resultado de determinadas operaciones). el registro de estado (FLAGS). Existen dos registros denominados "de índice".4 Registro de estado Existe un registro especial. Por ejemplo. dentro de la palabra de 16 bits.

DF Dirección Indica la dirección de las operaciones. Esta información es útil cuando el procesador controla transmisiones de datos. Cuando está activo (1) permite las interrupciones. La última secuencia de caracteres (NV UP EI PL NZ NA PO NC) muestra el contenido del registro de estado (el bit TF de detención no se muestra). Salir de Debug con Q En mi PC la respuesta al comando tiene el siguiente aspecto: AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1779 ES=1779 SS=1779 CS=1779 IP=0100 NV UP EI PL NZ NA PO NC Los valores están expresados en hexadecimal. ("Direction Flag") OF Desbordamiento Señala desbordamiento aritmético (Overflow Flag") Nota: Los usuarios de MS-DOS o Windows puede usar el programa DEBUG ( inspeccionar y modificar el contenido de los registros de la siguiente forma: • • • 1. el "prompt" es un guión "-") introducir el comando R (pedimos que nos muestre el contenido de los registros). IF Interrupción Este bit controla el estado del sistema de interrupciones ("Interrupt Flag") enmascarables ( 2.4).1w1). Este bit debe estar normalmente inactivo (a 0). ZF Cero ("Zero Flag") Está activo si el resultado de operación es cero o resultado de comparación igual. SF Signo ("Sign Flag") Si está activo indica que el resultado de operación o de comparación son negativos [5]. lo que permite controlar paso a paso la ejecución del programa. el procesador genera automáticamente una Flag") interrupción después de la ejecución de cada instrucción.1) para Flag") Invocar DEBUG desde una ventana DOS (suponemos que estamos en Windows.contenido es 1). AF Acarreo auxiliar Indicador de ajuste en operaciones aritméticas con cantidades BCD ( E0.7. TF Detención ("Trap Si está activo. el significado de la notación utilizada es el siguiente: Bit Indicador de: CF Acarreo PF Paridad AF Acarreo auxiliar Indicativo si bit 1 Indicativo si bit 0 CY ("Carry yes") NC ("No Carry") PE ("Parity Even") paridad par PO ("Parity Odd") paridad impar AC ("Auxiliar Carry") NA ("No Auxiliar") . el estado inactivo (0) las deshabilita.

Por ejemplo. añadiendo al comando R el nombre del registro. SI.9. OR. el comando R IP muestra el contenido del contador de programa. siempre contienen direcciones de memoria (los otros pueden contener direcciones o datos). BX. también ejecuta operaciones como raíz cuadrada y funciones trascendentes. BP. DEBUG responde con un "prompt" distinto del habitual ":". Esto había motivado la aparición de procesadores específicos para estas operaciones.2 Unidad Aritmético-lógica Como su propio nombre indica.1. En cuanto a las primeras. CX. Después de un comando de este tipo. §3. §3.8). Los nombres que pueden utilizarse para los registros son los siguientes: AX. SP.1). La unidad aritmética de los procesadores actuales no solo puede realizar las operaciones aritméticas básicas con números enteros o fraccionarios. Por su parte. Nota: En C++ los operadores aritméticos están incluidos en el lenguaje ( E4. Pulsando INTRO se vuelve al modo normal. SS. CS. arcotangente. en la que existe toda una sección dedicada a estas operaciones <math. es responsable de realizar ciertas operaciones aritméticas y lógicas. ES. etc ( E4. logaritmos y exponenciación. la unidad lógica es la responsable de realizar operaciones lógicas como AND.5 Comentario Observe que tanto el registro contador de programa IP.9. como cálculo del seno. como el de base BP. la unidad Aritmético-Lógica ALU ("Arithmetic and Logic Unit"). XOR.h>.ZF SF IF DF OF Cero Signo Interrupción Dirección Desbordamiento ZR NG EI DN OV ("Zero") ("Negative") negativo ("Enabled Interrupt") activa ("Down") decremento ("Overflow") NZ ("No Zero") PL ("Plus") positivo DI ("Disabled Interrupt") desactivada UP incremento NV ("No overflow") También es posible inspeccionar el contenido de un solo registro. DI. . DX. los denominados coprocesadores matemáticos. las operaciones trascendentes están implementadas mediante funciones de la Librería Estándar ( 5). Ni los registros de segmento ni los de puntero se pueden dividir en mitades (como los de uso general). y que las operaciones con números fraccionarios debían hacerse mediante artificios software. ya hemos indicado ( 3) que los primeros procesadores solo eran capaces de realizar operaciones de aritmética básica con números enteros. A partir de la introducción del Intel 80486 el coprocesador matemático fue incluido en el procesador. IP y F (este último para el registro de estado). para indicar que debe introducir el nuevo valor que desea para el registro. tangente. DS. coseno.

en el 8080 (un antepasado del 8088 montado en los primeros PC's). §3. los tripulantes deben abrir unas válvulas. Esto requiere una serie de operaciones. requiere también la operación de una serie de válvulas (aquí se llaman puertas lógicas) en un orden determinado. su simplificación tiene un límite. Como todo lo demás que ocurre en el ordenador estas operaciones se ejecutan según el compás de las señales de reloj que llegan desde la placa-base. a la que ya nos hemos referido ( 3). En la terminología utilizada por los fabricantes de procesadores. En el procesador. a un módulo de la CU denominado decodificador de instrucciones.4 El bus interno Los diversos elementos de un microprocesador están interconectadas de forma muy compleja (el propio micro lo és). alterando así el microcódigo. las versiones del microcódigo se denominan escalamientos. Al referirse al microcódigo. el "Poder legislativo" sería el programa grabado en memoria). que marca el rendimiento del procesador. Podríamos poner un ejemplo: El procesador es un submarino en inmersión y el comandante da la orden de emerger. etc. frente a los 4 ciclos de las instrucciones más rápidas. en las máquinas de von Neumann [4]. permiten modificar el contenido de la CROM. Aunque el microcódigo se mejora constantemente.§3. Esto no solo permite actualizarlo. Es un programa de actuación cableado en silicio (firmware) o en una memoria interna especial del procesador CROM ("Control Read Only Memory). La Unidad de Control. responsable de que todas estas operaciones se ejecuten correctamente.2). y suele comenzar con las maniobras necesarias para traer ("Fetch") la próxima instrucción (señalada por el contador de programa IP). de forma que la imagen de la figura 1 es solo una simplificación conceptual. Las únicas formas de acelerarlo es aumentar la frecuencia del reloj y el procesamiento paralelo y simultaneo de varias instrucciones. ajustar la velocidad. Para la ejecución de una instrucción de lenguaje máquina se requieren una serie de operaciones elementales y de sucesos físicos en los diversos componentes del procesador. es en realidad el poder ejecutivo de la UCP (siguiendo con nuestro símil. etc. Se encarga de coordinar que todos los elementos funcionen de forma armónica. estas actualizaciones se realizan a través de la secuencia POST del BIOS ( 4. El conjunto de operaciones necesarias para que se complete cada instrucción de lenguaje-máquina se conoce como microcódigo. En ocasiones se trata de un microcódigo complicado. también corregir ocasionalmente algunos errores ("Bugs"). la operación MOV AX. cerrar otras. BX (mover el contenido del registro BX a AX). orientar el timón de profundidad. para el que se necesitan varios ciclos de reloj. el microcódigo de las instrucciones más complejas necesitaba nada menos que 18 ciclos de reloj (CLK) para su ejecución.3 Unidad de Control La Unidad de Control CU ("Control Unit") funciona como árbitro del funcionamiento del procesador. . Esta última capacidad requiere una arquitectura especial (súper escalar) de los procesadores. el número de escalamiento es equivalente al número de versión en el caso del software. Por ejemplo. Nota: Algunos microprocesadores modernos (por ejemplo los Pentium de Intel).

. ensamblador o macro-ensamblador. es el "Sitio" por antonomasia sobre este asunto de la programación en ensamblador. • Roger Jegerlehner www. se utiliza un lenguaje de un poco más alto nivel.En realidad existen varios buses principales. y muchos más secundarios.cs. esta web mantenida por Randall Hyde.trincoll.penguin. para los que se inician en el ensamblador del PC. Pentium) en la que puede apreciarse su complejidad. • WEB Ster webster. pero todos los miembros de la saga Intel x86 (incluídos los actuales Pentium) comparten un núcleo que proviene de su ancestro el 8086. Hace honor a su título: "The Place on the Net to Learn Assembly Language Programming".ch Esta página contiene un excelente resumen de las instrucciones ensamblador de la serie Intel 80x86 descargable en formato .cz Un completo diccionario sobre el juego de instrucciones la familia Intel 80x86 hasta el 80486.edu En mi opinión. En la figura adjunta se muestra un esquema de la arquitectura interna de un procesador de la familia Pentium de Intel ( Arq. • IBM Personal Computer Assembly wiretap. §4 El lenguaje del procesador Hemos señalado que el lenguaje que entiende el procesador es lenguaje-máquina.jegerlehner. cuya anchura que es dos a cuatro veces la del bus externo ( H2) de los PC's.ucr.pdf • Trinity College shakti.edu Estas páginas de un curso sobre arquitectura de ordenadores y ensamblador del Trinity College de Hartford en Connecticut. incluyo algunas referencias donde puede encontrarse información acerca de la programación en ensamblador y donde conseguir macroensambladores. • Winston (Leos Literak) www. de la Universidad de Yale. pero ráramente se emplea como tal. no trata sobre programación en assembler (que además no es mi especialidad). Empieza por aquí y seguramente no tendrás que seguir buscando por ahí. Cada modelo de procesador tiene su propio lenguaje-máquina y necesita su propio ensamblador. Contienen algunos ejemplos de programas en ensamblador.area. pero como algunos me han escrito solicitando información al respecto. Desde luego este tutorial "Tecnología del PC".com Tutorial de Joshua Auerbach.

las instrucciones 51h. [1] Aunque los informáticos suelen utilizan el vocablo ensamblador como sinónimo de lenguajemáquina. Por ejemplo. llegaría a ser una leyenda en Princeton. [4] John von Neumann matemático Húngaro (Budapest 1903). Seguramente muchos sabéis que AutoCad® es un programa de diseño gráfico asistido por ordenador muy utilizado en arquitectura e ingeniería. de cuyos aspectos teóricos llegó a ser una autoridad. PUSH DX y PUSH BX respectivamente (como puede ver mucho más fáciles de recordar).programmersheaven. Aunque AutoCad tiene centenares de instrucciones. Por ejemplo. Tengo un viejo amigo que. según el tipo de instrucción y procesador utilizado. en el 8088. emigrado a USA. aunque una de las razones de la invención de su antecesor el C. son importantes. que con los años ha llegado a unos niveles de refinamiento y potencia realmente notables (creo que llegar a dominarlo supone casi una diplomatura). Una de las mentes más brillantes de su tiempo.com www. o más caracteres por instrucción.10). Posteriormente el compilador traduce nuestros nemónicos al verdadero lenguaje-máquina y el conjunto es ensamblado en un conjunto ejecutable. pero escribir directamente en este lenguaje nativo sería inhumano. en realidad hay una diferencia importante entre ambos. quedó fascinado por las posibilidades y potencial de los ordenadores. DX y BX en la pila. fue precisamente no tener que escribir en el referido lenguaje ensamblador. pero cuando conoció el ENIAC. El verdadero lenguaje máquina es un conjunto de instrucciones en forma de unos y ceros. El lenguaje C++ permite incluir directamente en sus fuentes sentencias ensamblador ( E4. [3] El procesador se apoya constantemente en la RAM externa para su funcionamiento. en el campo de la teoría de Juegos. dos. en razón de su profesión lo utiliza en su trabajo diario. mi amigo utiliza solo un conjunto pequeñísimo de ellas. 52h y 53h son respectivamente órdenes de salvar el contenido de los registros CX. en el que sienta las bases teóricas para el diseño de un ordenador . Aunque es de muy bajo nivel (muy cercano al lenguaje-máquina). y a veces hace verdaderos malabarismos para conseguir lo que quiere en base a tan pocas instrucciones. [2] A este respecto se me ocurre una anécdota que viene al caso.• En el Infierno de los programadores pueden consultarse dos páginas en las que hay abundante información sobre ensambladores y desensambladores: www. donde falleció en 1957. a pesar de lo cual es increíblemente rápido. así como sus trabajos teóricos para la construcción de la primera bomba atómica. como permitir escribir comentarios en el fuente. este lenguaje ha sustituido cada instrucción-máquina por un nemónico o macroinstrucción que la hace más fácil de recordar por el programador. este lenguaje dispone de algunas otras comodidades. Su trabajo más conocido es un famoso informe de 1945: "First draft of a report on EDVAC".com Inicio. Sus aportaciones matemáticas.programmersheaven. y en alguna ocasión he tenido que pedirle ayuda. La última vez que nos vimos le dije entre risas que era un delineante RISC. En realidad se utiliza un lenguaje denominado ensamblador o macro-ensamblador. cuya traducción ASCII es uno. ha desarrollado su propia técnica. las instrucciones anteriores pueden escribirse como: PUSH CX.

parece que le corresponde el honor de ser el primero en concebir un ordenador cuyo programa está albergado en la memoria de la máquina (como otro dato más). EBX. "de von Newmann". [5] La forma de almacenamiento interno utilizada es de complemento a dos ( el bit más significativo de los números negativos es 1. DX.2. AL.("Electronic Discrete Variable Automatic Computer"). [7] CEO "Chief Executive Officer". Por supuesto todos los ordenadores modernos lo son. Este trabajo le ha valido ser considerado por algunos (quizás un poco exageradamente) como el padre de la moderna informática. En cualquier caso. Como Intel garantizó la compatibilidad hacia atrás con el código ensamblador antiguo.4a). las mitades de estos registros podían seguir direccionándose como AX. por lo que [6] Cuando a partir de la introducción del 80386. y sus cuartas partes como AH. Consejero delegado en español. BL. Una máquina de este tipo se denomina. E. CX. justamente por eso. DH y DL. CH. BH. . los registros pasaron a ser de 32 bits. CL. BX. los registros generales pasaron a denominarse EAX. ECX y EDX.