Professional Documents
Culture Documents
Supongamos que queremos realizar la operacin 5 * 3 + 2, en el equipo descrito al inicio. En memoria, podramos "escribir" el programa de la siguiente forma: Localidad OPCODE Significado Comentario 0 1 2 3 4 5 3 3 1 2 5 * 3 + 2 En esta localidad, tenemos el primer nmero de la frmula En esta localidad, tenemos el cdigo de operacin que representa la multiplicacin. En esta localidad, tenemos el segundo nmero de la frmula En esta localidad, tenemos el cdigo de operacin que representa la suma. En esta localidad, tenemos el ltimo nmero de la frmula
Podemos ver que con esta representacin, es simple, expresar las operaciones de las que es capaz el hardware (en este caso, nuestra calculadora imaginaria), en la memoria. La descripcin y uso de los cdigos de operacin (OPCODE) es lo que llamamos lenguaje de mquina. Es decir, la lista de cdigos que la mquina va a interpretar como instrucciones, describe las capacidades de programacin que tenemos de ella; es el lenguaje ms primitivo, depende directamente del hardware, y requiere del programador que conozca el funcionamiento de la mquina al ms bajo nivel. Este mtodo resulto ser ms eficiente que volver a cablear la mquina, pero an as era extremadamente tardado desarrollar un programa debido al gran nmero de claves necesarias. La primera persona en desarrollar un sistema que aceptaba instrucciones y las almacenaba en memoria, fue el matemtico John Von Neumann (a menudo a estos equipos se les conoca como Mquinas Von Newmann en su honor). Cuando abstraemos los cdigos de operacin y los sustituimos por una palabra que sea una clave de su significado, a la cual comnmente se le conoce como mnemnico, tenemos el concepto de lenguaje ensamblador. As, se puede definir: El lenguaje ensamblador es la primera abstraccin del lenguaje de mquina, consistente en asociar a los cdigos de operacin en palabras clave que faciliten su uso por parte del programador. Como se puede ver, el lenguaje ensamblador es directamente traducible al lenguaje de mquina, y viceversa; simplemente, es una abstraccin que facilita su uso para los seres humanos. Por otro lado, la computadora no entiende directamente al lenguaje ensamblador; es necesario traducirle a lenguaje de mquina. Originalmente, este proceso se haca a mano, usando para ello hojas donde se escriban tablas de programa similares al ejemplo de la calculadora que acabamos de ver. Pero, al ser tan directa la traduccin, pronto aparecieron los programas Ensambladores, que son traductores que convierten el cdigo fuente (en Lenguaje Ensamblador) a cdigo objeto (es decir, a Lenguaje de Mquina). A principios de los aos cincuenta, una vez que las computadoras como la UNIVAC estaban disponibles se utiliz el lenguaje ensamblador. Aunque el lenguaje ensamblador es una ayuda para la programacin, no fue hasta 1957 (cuando Grace Hopper desarroll el primer lenguaje de programacin de alto nivel llamado FLOW-MATIC) que permiti que las computadoras fueron ms fciles de programar.
Pg. 1 -
A continuacin se presenta una tabla que indica los tamaos de los archivos creados por los diferentes compiladores. El programa muestra desplegar la siguiente cadena: Hola, que tal! Lenguaje BASIC CLIPPER ENSAMBLADOR Fuente 27 bytes 22 bytes 162 bytes Objeto 651 bytes 572 bytes 169 bytes Ejecutable (.EXE) 12 814 bytes 159 178 bytes 543 bytes
No se estn comparando las velocidades de ejecucin, aunque si tomamos en cuenta el tamao del programa ejecutable, es obvio que mientras ms grande sea ste, su ejecucin ser ms tardada debido al tiempo necesario para cargarlo. Ahora que se ha visto las diferencias entre los lenguajes, tambin es justo sealar los problemas de trabajar con el lenguaje ensamblador: Una instruccin mal interpretada o un error de lgica en el programa puede causar un caos, a tal grado que ser necesario apagar y encender de nuevo la computadora. La insuficiencia de conocimientos sobre el funcionamiento interno de la computadora puede causar efectos impredecibles. Es necesario ajustarse a una convencin respecto al uso de interrupciones. Se debe tener presente que un programa se puede volverse ms complejo conforme se le agregan rutinas o funciones adicionales. El programa fuente que despliega la cadena antes mencionada en lenguaje ensamblador se muestra a continuacin: .model small .stack .data mens db Hola, que tal! .code emp: mov ax,@data mov ds,ax mov dx, offset mens mov ah,09h int 21h mov ax, 4C00h int 21h end emp
Pg. 2 -
Pg. 3 -
Pg. 4 -
2. UNIDAD DE EJECUCION. (EU) a) Extrae la primera instruccin en la cola de la BIU b) Ejecuta la instruccin. c) Contiene los registros de propsito general, registros de pila y registro ndice. En la figura 2 se muestra el diagrama del Modelo de Programacin para este microprocesador.
El microprocesador tiene disponibles 20 bits de direccionamiento a memoria, es organizada en un arreglo lineal de 1'048,576 de bytes, direccionables del 00000H a 0FFFFFH. La memoria es dividida lgicamente en segmentos llamados: CODE, DATA, EXTRA DATA y STACK. Cada uno puede tener desde 16 bytes hasta 64 KB de longitud. La referencia a memoria se realiza mediante un DIRECCIONAMIENTO BASE l cual se encuentra en registros de segmento de alta velocidad. El tipo segmento se escogi de acuerdo a las necesidades de los programas. El registro de segmento es seleccionado de acuerdo a la siguiente regla: Toda la informacin con los mismos atributos es colocada en un mismo segmento; por ejemplo todo el cdigo es colocado en el segmento de cdigo (CS) y todos los datos son colocados en el segmento de datos (DS). Esta manera de hacer las cosas da como resultado programas ms rpidos, cortos y estructurados. En la figura 3 muestra la organizacin de la memoria del microprocesador.
Pg. 5 -
Hay localidades de la memoria las cuales son reservadas para operaciones especficas del microprocesador: a) De la direccin 00000H a la 003FFH son reservadas para interrupciones, lo que permite manejar hasta 256 interrupciones. Cada interrupcin usa 4 bytes: * 2 bytes para la direccin del segmento. * 2 bytes para la direccin del offset . b) De la direccin FFFF0H a la FFFFFH son reservadas para rutinas de inicializacin del sistema.
El microprocesador 8086/8088 puede manejar alrededor de 65536 puertos de Entrad/Salida. La direccin de Entrada/Salida permanece en el mismo formato en las lneas A0 a A15, las restantes lneas de direccin se mantienen en CERO en operaciones de entrada/salida. Las instrucciones de Entrada/Salida utilizan el registro DX como un apuntador, con ello se logra un acceso directo a cualquier dispositivo de Entrada/Salida. En la figura 4 se muestra el diagrama del manejo del direccionamiento del microprocesador 8088/8086.
Entrada/Salida 0FFFFh
00000h 8086/8088
Bus de Direcciones
000000h
Figura 4. Manejo de direccionamiento del microprocesador. Enero Junio 2011 Pg. 6 Ing. Claudia E. Carrillo R
El bus de direcciones solicita a la memoria una localidad de memoria o a los dispositivos de entrada/salida una localidad de entrada/salida. Si la entrada/salida es direccionada, el bus de direcciones contiene una direccin de entrada/salida de 16 bits; si la memoria es direccionada, el bus de direcciones contiene una direccin de memoria que vara en ancho dependiendo de una versin del microprocesador a otro microprocesador. El bus de datos transfiere informacin entre el microprocesador y su espacio de direccionamiento de memoria y entrada/salida; la transferencia de datos vara tamao dependiendo del tipo de microprocesador que se trate. La ventaja de un bus ms ancho es la velocidad de las aplicaciones que utilizan formatos grandes. El bus de control contiene lneas que seleccionan ya sea a la memoria o la entrada/salida y que ocasionan que stas efecten una operacin de lectura o escritura. En la mayora de los sistemas de cmputo existen cuatro lneas del bus de control: MRDC (Control de lectura de memoria), MWTC (Control de escritura de memoria), IORC (Control de lectura de entrada/salida) e IOWC (Control de escritura de entrada/salida). Por ejemplo, si IOWC = 0, el microprocesador est escribiendo datos desde el bus de datos hacia un dispositivo de entrada/salida, cuya direccin aparece en el bus de direcciones. El microprocesador lee el contenido de una localidad de memoria enviando una direccin a travs del bus de direcciones; en seguida enva a la memoria la seal de control de lectura de memoria (MRDC) para hacer que sta proporcione datos. Por ltimo, la informacin leda de la memoria llega al microprocesador a travs del bus de datos. Cada vez que ocurra una escritura de memoria o una lectura o una escritura de entrada/salida, se repite la misma secuencia, salvo porque las seales de control son diferentes y el flujo de datos sale del microprocesador a travs de su bus de datos para una operacin de escritura.
Pg. 7 -
Figura 6. Registros de propsito general en un microprocesador x86. Estos registros se han dividido en categoras dependiendo para lo que se utilizan, as pues tenemos los registros de propsito general o de propsitos mltiples, los registros de propsito especfico y los registros de segmentos.
Pg. 8 -
Registros de Propsito General. Se cuenta con 8 registros de propsito general; los primeros cuatro registros de la tabla pueden manejarse como registros de diferentes tamaos (64,32,6,8 bits) dependiendo del tipo de microprocesador que se este utilizando. Nombre Acumulador Base Contador Datos Apuntador de Pila Apuntador Base Indice Fuente Indice Destino Uso Instrucciones aritmticas, instrucciones de ajuste de formato e instrucciones de E/S. Almacenamiento de direcciones de desplazamiento en estructuras de datos. Variables de lazo y contadores Operaciones aritmticas. Direcciona un rea de memoria llamada pila Apuntador auxiliar de la pila, transferencia de datos a memoria Instrucciones de cadena Instrucciones de cadena
Pg. 9 -
Segmento de pila
SS (STACK)
Segmento extra
ES (EXTRA)
FS, GS
Por defecto ciertos registros de segmento se asocian a bloques de memoria determinados de los programas, utilizndose en combinacin con registros de propsito general o especfico concretos. Por tanto uno registro de segmentacin se usa para almacenar la DIRECCION DE SEGMENTO y el otro para almacenar el OFFSET (desplazamiento), por ello existen registros que siempre trabajan en pares. Registro de 16 bits CS:IP SS:SP DS:BX DS:SI DS:DI Uso Direccin completa del cdigo. (IP contador de programa) Direccin completa de la pila. Direccin completa de los datos. Direccin completa de los datos. Direccin completa de los datos.
Apuntador de Instrucciones (IP). Segn se acaba de mencionar el registro CS almacenar la direccin base del segmento o seccin donde se encuentra el cdigo del programa. Se necesita adems, un segundo registro que vaya indicando al microprocesador la ejecucin que debe realizar a cada paso, ya que el contenido de CS permanecer durante todo el tiempo con esa direccin base. Aqu es donde entra en juego el registro IP (Instruction Pointer) o Apuntador de Instrucciones. La pareja formada por los registros CS:IP determinarn la direccin exacta de memoria en la que se encuentra la instruccin a procesar. El contenido del apuntador de instrucciones puede ser modificado con una instruccin de salto o una llamada a una subrutina. Registros de control. Estn representados por CR0, CR1, CR2, CR3 con una tamao de 32 bits en modo protegido y de 64 en modo largo, siendo su finalidad modificar o informar sobre distintos aspectos del funcionamiento del microprocesador. Una aplicacin raramente tendr la necesidad de acceder a estos registros, por lo que no se tratar con mayor profundidad. El ltimo conjunto de registros mostrados en la figura 7 es el de los que incorporan la FPU (Floting Point Unit), parte de la ALU que se encarga de los clculos en coma flotante, y la unidad encargada de las instrucciones MMX/SSE/3DNow
Pg. 10 -
8086/8088/80186/80186 80286 80386/80386DX 80486SX Pentium/Pentium II Figura 8. Posicin de los bits banderas.
Acarreo. Cero. Trampa (una instruccin a la vez). Direccin (Inc/Dec de registros ndices). Nivel de Privilegio de entrada/salida. Reanudar. Verificacin de alineacin. Bandera de interrupcin virtual Interrupcin virtual pendiente.
PF SF IF OF NT VM
ID
Identificacin.
Antesala para abordar los modos de direccionamiento a la memoria. Aunque existen conceptos, que conocer en este semestre, generales a la programacin en ensamblador usando cualquier microprocesador, cuando se inicia la prctica las diferencias pueden ser muy considerables. Por ello es necesario optar por estudiar el conjunto de instrucciones y caractersticas de un microprocesador en concreto. Conociendo ste, aprender programar para otro ser bastante sencillo. El dilema est, en principio, elegir con cul microprocesador empezar. Actualmente la arquitectura del microprocesador ms usada mundialmente en computadoras, el dispositivo ms accesible a la programacin, es la conocida como x86. Esta surgi con el ahora anciano microprocesador INTEL 8086 y, a lo largo de ms de veinte aos, ha ido evolucionando hasta llegar a los ltimos Pentium IV, AMD, Athlon y otros microprocesadores compatibles. Existen multitud de herramientas para programar en ensamblador en la plataforma x86, por lo que parece la eleccin lgica. Al programar en ensamblador no slo se utiliza el conjunto de instrucciones y registros de cierto microprocesador sino que, adems, usarn dichas instrucciones para acceder a elementos del hardware, como de adaptador de vdeo, el teclado, los buses de comunicacin de una cierta arquitectura de la computadora. De igual manera, para efectuar ciertas tareas se utilizarn servicios puestos a disposicin de las aplicaciones por el sistema operativo. Cuando las tareas a efectuar son algo ms complejas, como el recuperar informacin de un archivo en disco o abrir una ventana en un entorno grfico, suele recurrirse a los servicio que ofrece el sistema operativo. Es otro punto en el cual se crean fuertes dependencias entre programa y plataforma, en este caso plataforma software. Son distintos lgicamente los servicios ofrecidos por LINUX, DOS, Mac OS y WIN, no estando disponibles las mismas funciones para cada uno de ellos. Los sistemas operativos antes mencionados son cuatro de los ms usados, si bien DOS, WIN y LINUX pueden encontrarse para una misma arquitectura del microprocesador y hardware, MAC OS es un caso aparte por la arquitectura de los procesadores POWER PC y el propio hardware de la MAC. El rea de memoria en la que se alojar el cdigo del programa, el rea de datos y la pila parten de una direccin a la que podra denominarse Direccin Base. Dicha direccin es desconocida por el programa, de tal forma que es el sistema operativo el que decide dnde colocarlo segn las reas que ya estuviesen ocupadas. Por lo tanto, es el sistema operativo, quien le asigna el valor del registro CS, almacenando en l la direccin base o direccin de memoria donde se encuentra la primera instruccin del programa. De igual manera, se establecen los valores para los registros DS y SS, y si bien stos suelen ser configurados por el propio programa una vez que se ha puesto en marcha. El primero determina el rea de memoria en la que se encontrarn los datos del programa, el segundo almacena la direccin base de la zona dedicada a la pila. Refirindonos a la pila, sta es una estructura de datos LIFO (Last In First Out), de tal forma que el ltimo dato introducido en ella es el primero que se recupera. Esta es la razn de que el crecimiento sea en orden inverso, para facilitar siempre la extraccin en primer lugar del ltimo dato almacenado. Enero Junio 2011 Pg. 11 Ing. Claudia E. Carrillo R
1FFFFH
1F000H
segmento de 64 KB
Desplazamiento = 0F000h
Pg. 12 -
13 bits = 8192 descriptores Selecciona 1 de dos tablas Tabla de descriptores Globales = 0 Tabla de descriptores Locales = 1 Nivel de privilegio de acceso PL0 (00) = Para el software del sistema. (Mayor jerarqua) PL1 (01) = Para utileras del sistema. PL2 (10) = Para utileras del SO. PL3 (11) = Para software de aplicacin. (Menor jerarqua) Figura 9. Informacin contenida en el registro de segmento (registro selector de segmento) Existen dos tablas utilizadas en los registros de segmento: una contiene descriptores globales y la otra, descriptores locales. Los descriptores globales contienen definiciones de segmentos que se aplican a todos los programas, mientras que los descriptores locales son generalmente exclusivos de una aplicacin. La figura 10 muestra el formato de un descriptor para los microprocesadores 80286 al Pentium IV. Observe que cada descriptor tiene una longitud de 8 bytes, (por lo que las tablas de los descriptores local u global pueden tener hasta 64 KB de longitud). Los descriptores para el 80286 y para el 80386 al Pentium IV, varan ligeramente, pero el descriptor del 80286 es compatible con los posteriores. Descriptor del 80286 7 5 3 1 Derechos de acceso Base (B23 B16) 6 4 2 0 7 5 3 1 Descriptor de 386, 486, Pentium, Pro, II, III, IV Base (B31 B24) Derechos de acceso G D O AV (L19 L16 Base (B23 B16) 6 4 2 0
Figura 10. Formatos de los descriptores de diferentes microprocesadores. La parte del descriptor que indica la localidad de inicio del segmento es la direccin base. Para el microprocesador 80286 la direccin base es de 24 bits, as que los segmentos inician en cualquier localidad dentro de sus 16 MB de memoria. Los microprocesadores 30386 y posteriores utilizan una direccin base de 32 bits. El lmite de segmento contiene la ltima direccin de desplazamiento en un segmento. En el descriptor 30286 y posteriores manejan los bits G, D, O, AV los cuales se describen a continuacin: BIT de Granularidad (G): Si G = 0 , el lmite especfica un lmite de segmento entre 00000h y 0FFFFFH. Si G = 1, el valor de lmite se multiplica por 4KB, entonces el lmite de segmento va desde 00000XXXH hasta 0FFFFFXXXH. BIT AV: Es usado por algunos SO para indicar que el segmento est disponible (AV = 1) o que no lo est (AV = 0). Enero Junio 2011 Pg. 13 Ing. Claudia E. Carrillo R
100100H 1000FFH
100000H 0FFFFFH
Pg. 14 -