Estructura y Tecnología de Computadores I 1 Tema 1º - Conceptos Fundamentales sobre Estructura de Computadores. Concepto de Computador. Máquina que puede resolver problemas ejecutando ciertas instrucciones. Programa: secuencia de instrucciones que describe como ejecutar una tarea. Lenguaje Máquina (L.M.): conjunto de instrucciones primitivas (muy elementales) de un computador. - El conjunto de instrucciones es limitado. - Son instrucciones muy simples. Todos los programas a ejecutar deben convertirse en una secuencia de instrucciones de L.M. El L.M. es incomodo de programar, por ello se usan lenguajes más cómodos para el operador humano-> Lenguajes de Alto Nivel. Niveles de Estudio de un Computador. 1º Descripción geométrica y de componentes, a nivel de componentes electrónicos. 2º Descripción de circuito electrónico. Conjunción de circuitos electrónicos individuales para formar circuitos lógicos. A medio camino entre la electrónica analógica y la digital. 3º Descripción de circuitos digitales. Unión de elementos lógicos simples para formar circuitos que realicen funciones específicas. Las funciones especificas van a ser: - Implementación de registros, implementación de contadores... 4º Descripción a nivel de transferencia entre registros (RTL). Registro: almacén de información. Contiene un conjunto de bits. Se estudia el flujo de información entre los diferentes registros. Este es el nivel que nosotros estudiaremos. 5º Descripción a nivel funcional. Se estudia el computador como una caja negra que realiza funciones hacia el exterior. Algunas partes del computador se verán a este nivel. Estructura y Tecnología de Computadores I 2 Concepto de Arquitectura y Organización de Computadoras. Arquitectura: Atributos de un sistema que son visibles a un programador. Por ejemplo: el lenguaje máquina, número de bits que requiere un dato determinado, modos de direccionamiento,... Organización: Estudio de las unidades funcionales de un sistema y su interconexión. Por ejemplo: señales de control, interface entre el computador y el mundo exterior, tecnología de la memoria, circuitos que implementan las operaciones aritmético lógicas. Ambos términos hacen referencia a conceptos aplicables a todos los computadores. Concepto de Familia de Computadores: Conjunto de computadores con la misma arquitectura pero distinta organización. El modelo superior absorbe al anterior y se respeta una compatibilidad hacia arriba. Estructura y Tecnología de Computadores I 3 Tema 2º - Componentes y Funcionamiento de un Computador. 2.1. Arquitectura Von Neumann. 2.1.1 concepto de arquitectura Von Neumann. El computador está integrado por tres elementos: - CPU. - Memoria. - Unidades de I/O. Los datos e instrucciones se almacenan en una memoria de lectura / escritura. Los contenidos de la memoria se direccionan por su posición independientemente del dato contenido. En la ejecución de los programas las instrucciones se ejecutan en una determinada secuencia. Esa secuencia es la misma que como se hayan almacenado las instrucciones en memoria. 2.1.2 CPU (Unidad Central de Proceso). Integrada por un conjunto de componentes lógicos que sirven para: - Almacenar datos. - Realizar operaciones aritméticas y lógicas con esos datos. Los componentes están incluidos dentro de una configuración que permite hacer un uso general de funciones aritméticas y lógicas. Hay un hardware que realiza funciones distintas según las señales de control que reciba. Funcionamiento: datos El sistema acepta y produce unos resultados. señales de control - Señales de control: hay una parte del hardware encargada de generar las señales de control. o Para cada función a realizar; se debe establecer una secuencia concreta de señales de control que se suministra al hardware que implementa las funciones. o El hardware que genera las señales de control está dentro de la CPU. o Para que la CPU active las señales de control correspondientes a una secuencia concreta (que implementa una operación): Un código especifico asociado a cada secuencia de señales de control. Una parte del hardware que genera las señales de control a partir de ese código. Estructura y Tecnología de Computadores I - - 4 Cada uno de esos códigos es una instrucción. El conjunto de todas ellas forman el lenguaje maquina del computador, también se le conoce como juego de instrucciones. Una secuencia de instrucciones forman un programa. 2.1.3. memoria. La memoria contiene: - Secuencia de instrucciones programa. - Datos que van a ser utilizados durante la ejecución de ese programa. Funcionalidad: 1º La CPU toma las instrucciones de la memoria. 2º La CPU toma los datos que necesita desde la memoria. Se diferencia en que los datos se “cojen” cuando se ejecuta una instrucción determinada (cuando lo necesita el programa) mientras que el “coger” una instrucción se hace de forma automática. 3º La CPU deposita los resultados de la ejecución en memoria. 2.1.4. unidades de I/O. Son elementos que transfieren datos desde dispositivos externos a la CPU hacia la CPU o la memoria y viceversa. En máquinas con arquitectura Von Neumann todos las computaciones tienen lugar en la CPU. Los datos e instrucciones están en memoria hasta que son demandados por la CPU. La CPU “ve” los dispositivos de I/O análogamente a como “ve” la memoria. - La CPU puede enviar datos a un dispositivo de salida. - La CPU puede leer los datos de un dispositivo de entrada. La diferencia entre los posiciones de dispositivos de I/O y los posiciones de memoria es que las direcciones de I/O están asociadas a los dispositivos de I/O, no con la memoria. 2.2. Arquitectura Intel de 32 bits (IA-32). 2.2.1. introducción. Estudiaremos las características de una arquitectura de computadores sobre un tipo concreto de computador que implementa una arquitectura Von Neumann. Computadores tipo PC basados en microprocesadores Pentium de Intel (IA32). Procesadores que abarcan IA-32: - Pentium. - Familia P6: o Pentium Pro. o Pentium II. 5 Estructura y Tecnología de Computadores I - o Pentium III. Pentium IV con arquitectura Net Burst. 2.2.2. el bus del sistema. Conecta los diferentes componentes de la arquitectura Von Neumann. En los sistemas basados en Pentium, existe: − Bus de Direcciones − Bus de Control ⇒ Bus del Sistema − Bus de Datos CPU MEMORIA DISPOSITIVOS I/O Bus de Datos: - Tiene 64 bits de ancho. - Permite realizar transferencias de 16, 32 o 64 bits, no mueve grupos de 8 bits. memoria - Transfiere información entre posiciones de y CPU. I/O Bus de Direcciones: - Tiene 36 bits de ancho. - El sistema asocia una dirección a cada posición de memoria. - El sistema asocia una dirección a cada posición de I/O. memoria - Si la CPU accede a posiciones de coloca la dirección en I/O el bus de direcciones. memoria o La circuitería asociada a la reconoce la dirección I/O (es decir, dice si es de memoria o de I/O) o Da ordenes para leer el dato solicitado y lo coloca en el bus de datos. El resto de posiciones son ignoradas. Bus de Control: - Integrado por todas las señales que controlan como el procesador se comunica con el resto del sistema. Incluye: o Señales de lectura / escritura. o Reloj de sistema. o Líneas de interrupción. Estructura y Tecnología de Computadores I - 6 o Líneas de estado Reloj de sistema: señal eléctrica que alterna entre 2 niveles lógicos. o Maneja toda la sincronización dentro del procesador. La CPU es un sistema lógico asíncrono muy complejo. o La frecuencia del reloj es la frecuencia del sistema. o A un periodo completo se le denomina ciclo de reloj. o La ejecución de cada instrucción consume muchos ciclos de reloj. 2.2.3. el subsistema de memoria. La memoria es direccionable a nivel de byte. La memoria es equivalente a un array de 4×230 posiciones, cada una de 1 byte (230 = 1 gigabyte). Para ejecutar la siguiente instrucción: CPU mem(x): 1º - CPU coloca en el Bus_direcciones la dirección “x”. 2º - CPU activa la línea de control de lectura. 3º - La CPU “lee” el dato que está en el Bus_datos. Definiciones: - Posición de memoria: 1 byte (8 bits) - Palabra: 2 byte (16 bits). - Palabra doble: 4 byte (32 bits). - Palabra cuádruple: 8 byte (64 bits). - El procesador (IA-32) puede acceder a palabras o a palabras dobles. - Tiempo de acceso a memoria: número de ciclos de reloj necesarios para acceder a una posición de memoria. Del orden de varios ciclos de reloj - Memoria caché: parte de memoria que se coloca entre el procesador y la memoria principal. Sirve para acelerar el acceso a memoria. Es de pequeño tamaño. Es más rápido que la memoria principal. Con la memoria principal se intercambia bloques enteros de memoria, no posiciones de memoria. - Acceso del procesador a caché: o Acierto Caché: cuando el procesador busca y encuentra en caché. o Fallo Caché: cuando el procesador busca y no encuentra, la caché pide el bloque a memoria principal. El procesador vuelve a buscar y ahora si que acierta. 2.2.4. el subsistema de entrada / salida. El funcionamiento es análogo al subsistema de memoria. Existen direcciones de memoria que pertenecen al subsistema de entrada / salida. Se manejan direcciones de 16 bit (216=65.536 direcciones) Estructura y Tecnología de Computadores I 7 2.3 Características de la CPU en IA-32. 2.3.1. los registros de la CPU. Los registros son ubicaciones especiales de la memoria. No forman parte de la memoria principal. Se ubican dentro de la CPU. Principales Registros de la CPU: 1º Registros de almacenamiento temporal de datos (32 bit): - EAX: acumulador. - EBX: dirección de base. - ECX: contador. - EDX: para datos. 2º Registro de puntero de instrucción (32 bit): - Contiene la dirección de la siguiente operación a ejecutar. 3º Registro de banderas / flags (32 bit): - Contiene una serie de bits con el estado del procesador o el resultado de ciertas operaciones. 4º Otros registros. 2.3.2. la unidad aritmético lógica (ALU). En ella tiene lugar la mayor parte de las acciones ejecutadas por la CPU. Ej.: sumar 5 a EAX: 1º Copia el valor de EAX en la ALU. 2º Envía 5 a la ALU. 3º Ordena a la ALU que sume las dos cantidades. 4º Lleva el resultado hacia el registro EAX. 2.3.3. la unidad de interface de bus. Unidad dentro de la CPU que se encarga de controlar los buses de datos y direcciones al acceder a datos alojados fuera de la CPU. 2.3.4. la unidad de control y el juego de instrucciones. Cada instrucción que puede ejecutar la CPU tiene asociado un código (es un código numérico en binario). Al código se le conoce como código de operación. La unidad de control (UC) trae desde la memoria las instrucciones del programa. La unidad de control introduce el código binario de la instrucción de memoria que es apuntado por el puntero de instrucción (que está en el registro de puntero de instrucción). El puntero de instrucción contiene la dirección de memoria donde se aloja la siguiente instrucción a ejecutar. Estructura y Tecnología de Computadores I 8 La unidad de control lo que hace es colocar el código en un registro especial: registro de decodificación. Identifica la acción a desarrollar. Luego inicia la ejecución de la acción que acaba de identificar. Tamaño de los códigos de operación: son siempre múltiplos de 8 bits; dentro se codifica la operación a realizar y los operandos involucrados en la operación. Estos operandos pueden ser registros, posiciones de memoria o datos directos. Juego de instrucciones: de la CPU, conjunto de todos los códigos de operación que soporta su unidad de control. Entendemos por soportar que sea un código que el sistema pueda soportar que pueda dar lugar a una serie de pasos. Para referirnos a los códigos de operación utilizamos notación simbólica, esta representación se conoce como mnemónicos. Ej.: Código de operación mnemónico. 10001001:11001000 mov cx, ax (Un código de operación de 2 bytes) 11110100 hlt (código de operación de 1 byte) 9B:DB:E1 fdsi (código de operación de 3 bytes) Ya que nosotros vamos a escribir los programas, vamos a necesitar una herramienta que nos permita hacer la transformación de mnemónico a código máquina y eso será hecho por el programa ensamblador. Programa escrito en mnemónico Programa escrito en lenguaje maquina. Programa ensamblador. 2.4. Organización física de la memoria. Vamos a considerar siempre un espacio de memoria de 4 gigabytes eso quiere decir que pueden direccionarse posiciones de la memoria utilizando direcciones de 32 bits. Segmentación en IA-32. El segmento de memoria es una posición de la memoria. El direccionamiento se puede hacer de dos modos: - Lineal (o plano): una sola dirección selecciona una posición de memoria. - Segmentado: en este caso hay dos componentes para especificar una posición: o Segmento. o Desplazamiento. Estas dos componentes se convierten en una dirección física mediante: dirección_física = f(segmento)+desplazamiento. (La función del segmento puede ser todo lo complicado que se quiera) El tamaño del desplazamiento va a limitar el tamaño máximo del segmento. El segmento al final hace referencia a un trozo de la memoria. En IA-32 hay dos modos de direccionamiento segmentado: 9 Estructura y Tecnología de Computadores I - La segmentación de modo real (permite manejar zonas de memoria) La segmentación de modo protegido: es la que maneja el sistema operativo cuando se está manejando en modo multitarea en el procesador. En nuestro estudio realizamos siempre direccionamiento plano sobre un espacio de memoria de 4 gigabytes. Los registros son de 32 bits al ser de este tamaño son suficientes para alojar una dirección de ese espacio de 4 gigabytes. Todo lo que hace referencia a segmentación bajo nuestro punto de vista es trasparente, no es percibido por el usuario. 2.5. Resumen de los registros de la CPU en IA-32. (alfa) 31 EAX 16 15 87 AH 0 AL AX 32 bits 16 bits 8 bits El bit menos significativo es el que está mas a la derecha y más significativo el que se encuentra en la posición más a la izquierda. Cuando hablo de EAX y AL no hablo de registros distintos sino de un registro que es parte de otro. (beta) EBX 31 16 15 87 BH 0 BL BX ECX 31 16 15 87 CH 0 CL CX EDX 31 16 15 87 DH 0 DL 10 Estructura y Tecnología de Computadores I DX (landa) ESI EFLAGS SI FLAGS EDI 16 bit 32 bit DI EBP BP ESP SP CS FS DS GS ES SS 16 bit 32 bit 16 bit 16 bit Alfa, beta y landa se les conoce como registros de propósito general AL, AX, EAX, BL, BX, EBX, CL, CX, ECX, DL, DH, EDX, SI, ESI, DI, EDI, BP, EBP, SP, ESP. - AL, AX, EAX: registro acumulador. - BL, BX, EBX: registro base. - CL, CX, ECX: registro contador. - DL, DX, EDX: registro de datos. - SI, ESI: índice de fuente. - DI, EDI: índice de destino. - BP, EBP: puntero de base. - SP, ESP: puntero de pila. Registros de estado del procesador: FLAGS, EFLAGS. Registro de segmentos: - CS: segmento de código. - DS: segmento de datos. - ES: segmento extra. - SS: segmento de pila. - FS, GS: otros segmentos para uso general en acceso a memoria. Estructura y Tecnología de Computadores I 11 Además está EIP: registro de 32 bits que se llama registro de puntero de instrucción y es importante por que contiene la dirección de la siguiente instrucción a ejecutar. El contenido del registro va variando, aumentando o disminuyendo según se va ejecutando el programa. 2.6. El Juego de Instrucciones de IA-32. Hacemos una clasificación: 1) Instrucciones de movimiento de datos, llevan datos de un lugar a otro. 2) Instrucciones de conversión de datos, realizan transformaciones en la representación de los datos. 3) Instrucciones aritméticas. 4) Instrucciones lógicas y de manipulación a nivel de bit. 5) Instrucciones de control de flujo de los programas (saltos, llamadas a subrutinas, interrupciones). 6) Instrucciones de entrada salida, que permiten que la CPU intercambie datos con los dispositivos de entrada salida. 7) Instrucciones de manipulación de cadenas de caracteres o bloques de memoria. 8) Instrucciones de aritmética en punto flotante (son instrucciones para manipular datos almacenados en punto flotante y para realizar operaciones aritméticas sobre ellos). 9) Instrucciones MMX (extensiones para gestión multimedia) 10) Instrucciones SIMD (extensiones para computación tipo SIMD, array, vectores). 11) Otras instrucciones. 12 Estructura y Tecnología de Computadores I Tema 3º - Instrucciones de Movimientos de Datos. 3.1. Introducción. Son instrucciones que mueven información entre diversos lugares de almacenamiento (registros, posiciones de memoria o la pila) Notación para referirnos a los registros: - REG: cualquiera de los registros de propósito general. - REG8, REG16, REG32: nos referimos a registros de 8 o 16 o 32 bits respectivamente. Notación para referirnos a la memoria: - MEM: nos referimos a 1 posición de la memoria (1 byte). Los 4 gigabytes son direccionables con los 32 bits de un registro. - MEM16: zona de memoria en la que se almacena una palabra (16 bits - 2 bytes). Se almacena en 2 posiciones de memoria consecutivas. Byte bajo MEM16 Byte alto - - MEM16 15 87 0 MEM16+1 MEM32: zona de memoria en la que se almacena una palabra doble (32 bits – 4 bytes). Tiene cuatro posiciones de memoria consecutivas. 31 MEM32 24 23 Byte 3 16 15 Byte 2 87 Byte 1 0 Byte 0 MEM32+1 MEM32 MEM32+2 MEM32+3 Byte más significativo Byte menos significativo Para referirnos a las posiciones físicas de la memoria, nunca utilizaremos el valor numérico de la dirección directamente. Siempre nos referiremos a una posición de memoria por medio de etiquetas. En los programas hay una zona en la que definimos las etiquetas y lo que van a almacenar esas etiquetas. El ensamblador y luego el cargador asignaran el valor numérico a cada etiqueta cuando se ejecute el programa. A veces se usa la MEM en sentido general, indicando una ubicación de cualquier tamaño (que se adivina por el contexto) 13 Estructura y Tecnología de Computadores I 3.2. Instrucciones de copia de datos entre lugares de almacenamiento. Mnemónico común: MOV. Función: MOV destino, origen. Lo que hay en origen se copia en destino. Se mantiene el contenido de origen, pero se machaca el contenido de destino, no es un movimiento, es una copia. Utilización: 1) MOV REG, MEM 2) MOV MEM, REG 3) MOV REG, MEM 4) MOV MEM, DATO_INMEDIATO 5) MOV REG DATO_INMEDIATO MEM puede ser “MEM8”, “MEM16”, “MEM32” en función del registro involucrado. MOV no puede realizar operaciones de memoria a memoria, no puede copiar datos entre memoria directamente. Los datos inmediatos son valores que están incluidos dentro de la propia instrucción, pueden ser números o cadenas de caracteres. Formatos soportados por NASM: - números: o en base 10: MOV AX, 13 o en hexadecimal: con sufijo (h): MOV AX, A2h con prefijo (0x): MOV AX, 0xA2 o en octal: con sufijo (q): MOV AX, 777q o en binario: con sufijo (b): MOV AX, 01110b - caracteres: se escribe la codificación en ASCII. Deben ir entre comillas simples: MOV EAX, ‘abcd’. La forma en que se almacena es: d 31 c 24 23 b 16 15 a 87 0 El valor que contiene EAX es 0x 64 63 62 61; ASCII(d)=64, ASCII(c)=63, ASCII(b)=62, ASCII(a)=61. 3.3. Intercambio de contenidos de dos lugares de almacenamiento. XCHG: intercambia el contenido de dos operandos. Utilización: 1) XCHG REG, MEM 2) XCHG REG, REG 14 Estructura y Tecnología de Computadores I Los dos operandos deben tener el mismo tamaño en bits. No puedo intercambiar información entre dos posiciones de memoria directamente (al igual que antes) 3.4. Instrucción para obtención de las direcciones efectivas de la memoria. LEA: instrucción para cargar un registro de propósito general con la dirección efectiva de una posición de memoria Utilización: 1) LEA REG16, MEM :copia los 16 bits más bajos de la posición de memoria etiquetada por MEM en REG16. No copia información sino la dirección. 2) LEA REG32, MEM: copia los 32 bits más bajos de la posición de memoria etiquetada por MEM en REG32. No copia información sino la dirección. 3.5. Instrucciones de manejo de pila. Que se entiende por “pila” en IA-32 : es una estructura en memoria que funciona como una pila LIFO. El siguiente elemento que será sacado o metido en la pila, lo será de la posición de memoria referida por el registro ESP. ESP indica la cabeza de la pila. La pila crece “hacia abajo” en la memoria. Crece hacia posiciones más bajas de memoria. El comienzo de la pila es en una posición elevada. En la pila se puede hacer dos tipos de operaciones: - Introducir valores. - Extraer valores previamente almacenados. La pila sirve para almacenar temporalmente el contenido de los registros o de posiciones de memoria. También se usa para pasar parámetros a llamadas de procedimientos. Hay una pila para cada proceso. Instrucciones: - PUSH: introducir datos en la pila. - POP: extraer datos de la pila. Utilización: 1) PUSH REG16: introduce en la pila 2 byte, comenzando por la parte baja. Byte 1 Byte 0 **revisar** ¿dónde apunta ESP antes y después de introducir los datos? 15 Estructura y Tecnología de Computadores I 2) POP REG16: saca 2 byte de la pila y los coloca en REG16, el primer byte que extrae va a la parte alta y el segundo que saca va a la parte baja. 3) PUSH REG32 & POP REG32:al igual que antes, para introducir o extraer de la pila palabras dobles. Se comienza por la parte más baja. 4) PUSH MEM & POP MEM: MEM puede ser una palabra o una palabra doble (16 o 32 bits), nunca un byte. Con estas instrucciones se puede extraer o introducir en la pila palabras o palabras dobles que se encuentren en la memoria. 5) PUSHA & POPA: Coge todos los registros de propósito general de 16 bits y los copia en la pila. El orden es: AX, CX, DX, BX, SP, BP, SI, DI. Al extraerse de la pila estos registros se colocan, lógicamente, en orden inverso. 6) PUSHAD & POPAD: hacen lo mismo que la instrucción anterior pero con los registros de 32 bits. El orden es: EAX, ECX, DEX, EBX, ESP, EBP, ESI, EDI. 7) PUSHF & POPF: introducir o extraer de la pila el contenido del registro FLAGS (16 bits). 8) PUSHFD & POPFD: introducir o extraer de la pila el contenido del registro EFLAGS (32 bits). 3.6. Otras instrucciones de movimiento de datos. LAHF: copia la parte baja (0-7) de FLAGS en la parte alta (8-15)de AH de EAX SAHF: copia el contenido de AH de EAX en la parte baja de FLAGS 31 16 15 8 7 0 EFLAGS LAHF SAHF EAX AH AL Estructura y Tecnología de Computadores I 16 Tema 4º - Instrucciones de Conversión de Datos. 4.1. Instrucciones de la representación con y sin signo. En la arquitectura IA-32 se pueden representar número con signo. Se utiliza para ello la representación en complemento a 2. Si el bit más significativo es 0 un número positivo. Si el bit más significativo es 1 un número negativo. Si el número es positivo : 0[número en binario] Si el número es negativo: se aplica el Ca2. - Se aplica la inversión a todos los bits del número en binario positivo. - Se suma 1 al resultado. Cuando se expresa un número en Ca2 hay que tener presente el número de bits utilizados en su representación: 0x11 (11 en hexadecimal): - En 8 bits: EF - En 16 bits: FFEF Finalidad de las instrucciones de extensión: convertir la representación de 8 a 16, de 8 a 32, y de 16 a 32 bits, para números representados con o sin signo. Para números sin signo: los bits de mayor orden del nuevo formato extendido se rellenan con “0”`s. Para números con signo: los bits de mayor orden se rellenan con 0`s si el número era positivo y con “1”`s si el número era negativo. Instrucciones de extensión con signo: 1) MOVSX REG16, MEM8 2) MOVSX REG16, REG8 3) MOVSX REG32, MEM8 4) MOVSX REG32, REG8 5) MOVSX REG32, MEM16 6) MOVSX REG32, REG16 Instrucciones de extensión sin signo: Son iguales pero con MOVZX REG16, MEM8. Otras instrucciones de extensión: CWD: extiende con signo AX (16 bits) en el par DX:AX. CDQ: extiende con signo EAX (32 bits) en el par EAX:EDX. 4.2. Conversión Little-Endian Big-Endian. Notación: big o little indica como se almacena la información que se tiene en varios bytes. 17 Estructura y Tecnología de Computadores I Little-Endian: en un conjunto de bytes que representan algo el byte de menor orden (el menos significativo) aparece en la posición de memoria más baja. EAX 0−7 → POSICION EAX 8 −15 → POSICION + 1 EAX → POSICION ⇒ EAX16 −23 → POSICION + 2 EAX 24-31 → POSICION + 3 Donde POSICIÓN es una etiqueta de memoria. Byte 3 31-24 Byte 2 23-16 Byte 1 15-8 Byte 0 7-0 Posición Posición+1 Posición+2 Posición+3 Big-Endian: en un conjunto de bytes que representan un dato. El byte de menor orden, aparece en la dirección de memoria más alta. 11 → POSICION 22 → POSICION + 1 0x11223344 → POSICION ⇒ 33 → POSICION + 2 44 → POSICION + 3 Byte 3 31-24 Byte 2 23-16 Byte 1 15-8 Byte 0 7-0 Posición Posición+1 Posición+2 Posición+3 En la práctica una arquitectura usa una u otra técnica, no se implementan los dos sistemas en la misma arquitectura, normalmente. Instrucción BSWAP: cambia la representación de un número de 32 bits de little-endian a big-endian y viceversa Utilización: BSWAP REG32 Estructura y Tecnología de Computadores I Interés: - 18 IA-32 usa little-endian. Otras maquinas usan big-endian. Cuando hay que intercambiar datos entre computadoras de diferentes endian, entonces hay que transformar los datos almacenados en memoria con BSWAP. 19 Estructura y Tecnología de Computadores I Tema 5º - Instrucciones Aritméticas 5.1. Introducción. Instrucciones aritméticas suministradas: - Suma - Resta - Cambio de signo - Multiplicación - División con obtención de resto - Comparación Registro FLAGS: registro que se encarga de mantener el estado del procesador Funciones: mantener el actual modo del procesador. Informar sobre determinados sucesos que ocurren en la ejecución de ciertas funciones. Bits utilizados: 15 - - - - - 14 13 12 11 10 9 8 7 6 O D I T S Z 5 4 A 3 2 P 1 0 C O: bandera de desbordamiento (overflow). Se pone a “1” después de ejecutar una operación aritmética si el resultado no cabe en el operador destino, supuesto que estemos considerando que se utilizan números en representación con signo. Ej.: AL 0x7F AL AL + 1 En “AL” al final queda 0x80, no es el resultado correcto por que la representación es con signo, el resultado correcto es: 0x080, pero como eso no cabe en 16 bits (capacidad de AL) la bandera O se pone a “1”. S: bandera de signo. Se pone a “1” después de ejecutar una operación aritmética si el resultado es “1”, esto equivale a un número negativo en una representación de números con signo. Z: bandera de cero (zero). Se pone a “1” después de ejecutar una operación aritmética si el resultado es un cero independientemente de la operación. A: bandera de acarreo auxiliar. Se pone a “1” después de ejecutar una operación aritmética en la que hay un desbordamiento en el “nibble” (4 bits ó ½ byte) menos significativos del resultado. P: bandera de paridad. Se pone a “1” después de ejecutar una operación aritmética si la paridad del byte menos significativo del resultado es par. Si es impar se pone a “0”. Estructura y Tecnología de Computadores I 20 5.2. Suma. 5.2.1. instrucciones ADD y ADC. Formato: ADD DESTINO, FUENTE ADC DESTINO, FUENTE Operación: ADD: DESTINO DESTINO + FUENTE ADC: DESTINO DESTINO + FUENTE + C (bandera de acarreo) Sumo el acarreo de la operación anterior. Se usa cuando sumo registros por partes Utilización: ADD REG, REG ADD REG, MEM ADD MEM, REG ADD REG, DATO_INMEDIATO ADD MEM, DATO_INMEDIATO De igual forma para ADC. Los dos operandos deben ser del mismo tamaño. No se puede sumar dos posiciones de memoria de forma directa. 5.2.2. instrucción INC. Función: Suma 1 a un operando. Esta instrucción es más rápida que ‘ADD REG, 1’. Utilización: INC REG INC MEM REG y MEM pueden ser de cualquier tamaño. No afecta a la bandera de acarreo. 5.2.3. instrucción XADD. Instrucción de cambio y suma. Formato: XADD DESTINO, FUENTE Destino y fuente pueden ser REG o MEM, pero no MEM ambos. Ambos de igual tamaño. Funcionamiento: 1) temp destino 2) destino destino + fuente 3) fuente temp Afecta a las banderas de igual forma que ADD. Estructura y Tecnología de Computadores I 5.3. Substracción. 5.3.1. instrucción SUB y SBB. SUB: Formato: SUB DESTINO, FUENTE Función: DESTINO DESTINO – FUENTE Utilización: SUB REG, REG SUB MEM, REG SUB REG, MEM SUB REG, DATO_INMEDIATO SUB MEM, DATO_INMEDIATO Tanto REG como MEM deben ser de igual tamaño. SBB: Formato: SBB DESTINO, FUENTE Función: DESTINO DESTINO – FUENTE – C (bandera de acarreo) 5.3.2. instrucción DEC Resta 1 a un operando. Utilización: DEC REG DEC MEM Afecta de forma normal a las banderas de estado menos a la de acarreo. 5.4. Cambio de signo. Instrucción NEG. Cambia de signo a lo almacenado en el operando, trabajando en Ca2. Utilización: NEG REG NEG MEM 5.5. Comparación de valores. 5.5.1. instrucción CMP. 21 Estructura y Tecnología de Computadores I 22 Es idéntica a SUB pero no deja el resultado en ningún sitio. Como consecuencia de la ejecución de la instrucción se modifican las banderas de estado. Formato: CMP DESTINO, FUENTE Permite hacer una comparación entre fuente y destino. Hay otras instrucciones que actúan según el resultado de CMP pueden ser: - Saltos (condicionados). - Actualización de al algún bit en base a CMP. Utilización: CMP REG, REG (No se puede CMP MEM, MEM) CMP REG, MEM CMP MEM, REG CMP REG, DATO_INMEDIATO CMP MEM, DATO_INMEDIATO Los operandos deben ser de igual tamaño. 5.5.2. instrucción CMPXCHG y CMPXCHG8B. CMPXCHG. Formato: CMPXCHG OP1, OP2 Utilización: CMPXCHG REG, MEM CMPXCHG MEM, REG Función: AL 8 Compara AX16 con OP1, según sea el tamaño de OP1. EAX 32 Si son iguales: Pone Z =”1”. OP2 OP1. Si son distintos: AL 8 AX16 OP1. EAX 32 CMPXCHG8B. Formato: CMPXCHG8B MEM64 Función: Compara la palabra que se forma con 2 registros EDX:EAX (64 bits) con lo almacenado en MEM64. Si son iguales: Pone Z = “1”. ECX:EBX MEM64. Si son distintos: MEM64 EDX:EAX Estructura y Tecnología de Computadores I 23 Sirve para la construcción de semáforos. 5.6. Multiplicación. 5.6.1. instrucción MUL. Función: Sirve para multiplicar números en representación sin signo. Formato: MUL REG MUL MEM Tanto REG como MEM pueden ser de 8, 16 o 32 bits. Función: Si REG o MEM son de 8 bits. AX AL × {REG, MEM}8 Si REG o MEM son de 16 bits. DX :AX AX × {REG, MEM}16 Si REG o MEM son de 32 bits. EDX:EAX EAX × {REG, MEM}32 No hay perdida de bits por desbordamiento. Con respecto a las banderas, las afecta de forma absurda, estropeando los contenidos, excepto de las banderas “C” y “O”. 5.6.2. instrucción IMUL. Función: Instrucciones para multiplicar números en representación con signo. Formato: Los mismos que MUL y además. IMUL REG, REG, DATO_INMEDIATO IMUL REG, MEM, DATO_INMEDIATO IMUL REG, DATO_INMEDIATO IMUL REG, REG IMUL REG, MEM Es decir: IMUL OP1, OP2, DATO_INMEDIATO IMUL OP1, OP2 IMUL OP1, INMEDIATO Función: IMUL OP1, OP2, DATO_INMEDIATO: OP1 OP2 × DATO IMUL OP1, OP2: OP1 OP1 × OP2 IMUL OP1, DATO_INMEDIATO: OP1 OP1 × DATO 24 Estructura y Tecnología de Computadores I Estas son las combinaciones de tamaños de operación soportados por los formatos específicos de IMUL: IMUL OP1, OP2, DATO_INMEDIATO OP1 OP2 DATO_INMEDIATO REG16 REG16 MEM16 DATO_INMEDIATO8 DATO_INMEDIATO16 REG32 REG32 MEM32 DATO_INMEDIATO8 DATO_INMEDIATO32 IMUL OP1, DATO_INMEDIATO OP1 DATO_INMEDIATO REG16 DATO_INMEDIATO8 DATO_INMEDIATO16 REG32 DATO_INMEDIATO8 DATO_INMEDIATO32 OP1 IMUL OP1, OP2 OP2 REG16 REG16 MEM16 REG32 REG32 MEM32 Hay posibilidad de desbordamiento, se perderían los bits más significativos. Se activarían las banderas “C” y “O”. 5.7. División. Instrucciones DIV y IDIV; para divisiones con y sin signo. Formato: DIV REG IDIV MEM {8,16,32} Función: Ejecuta divisiones de los bits dividendo 64 32 16 → : tamaños: : bits divisor 23 16 8 operandos con los siguientes 25 Estructura y Tecnología de Computadores I No se puede dividir con los siguientes formatos: 64 32 16 8 : : : 64 32 16 8 Cociente : AL AX → OPERANDO Resto : AH Cociente : AX DX : AX 2º) Operando de 16 bits: → OPERANDO Resto : DX 1º) Operando de 8 bits: 3º) Operando de 32 bits: Cociente : EAX EDX : EAX → OPERANDO Resto : EDX Para dividir valores con el mismo tamaño de almacenamiento, es necesario extender (a tamaño doble) el dividendo (numerador). La ejecución de esta instrucción estropea el estado de las banderas. Si se produce un error de desbordamiento o por división por 0, el procesador aborta la ejecución del programa. Estructura y Tecnología de Computadores I Tema 6º - Instrucciones Lógicas y de Manipulación a Nivel de Bit. 6.1. Instrucciones lógicas. Instrucciones: AND, OR, XOR, NOT. Formato: INSTRUCCIÓN DESTINO, FUENTE {Para AND, XOR, OR } NOT OPERANDO Funcionalidad: NOT: invierte bit a bit todos los operandos. AND, XOR, OR: realizan la operación bit a bit entre destino y fuente. AND DESTINO, FUENTE: DESTINO DESTINO AND FUENTE OR DESTINO, FUENTE: DESTINO DESTINO OR FUENTE XOR DESTINO, FUENTE: DESTINO DESTINO XOR FUENTE NOT OPERANDO: OPERANDO NOT OPERANDO Utilización: AND REG, REG AND REG, MEM AND MEM, REG AND REG, DATO_INMEDIATO AND MEM, DATO_INMEDIATO NOT REG NOT MEM XOR y OR de igual manera que AND. Los dos operandos deben ser de igual tamaño. 6.2. Instrucciones de desplazamiento. Instrucciones: SHL: desplazamiento a la izquierda. SAL: desplazamiento aritmético a la izquierda. SHR: desplazamiento a la derecha. SAR: desplazamiento aritmético la derecha. SHLD: desplazamiento a la izquierda en doble precisión. SHRD: desplazamiento a la derecha en doble precisión. Formato: SHL DESTINO, CONTADOR SAL DESTINO, CONTADOR SHR DESTINO, CONTADOR SAR DESTINO, CONTADOR 26 Estructura y Tecnología de Computadores I 27 SHLD DESTINO, FUENTE, CONTADOR SHRD DESTINO, FUENTE, CONTADOR Funcionalidad: SHL – SAL: desplazan el contenido DESTINO tantas veces a la izquierda como indique el contador. El hueco de la derecha se rellana con 0´s. Ambas instrucciones son idénticas. El bit que se “pierde” lo “coge” la bandera de acarreo. SHR – SAR: desplazan el contenido DESTINO tantas veces a la derecha como indique el contador. El “hueco” SHR lo rellena de 0´s pero SAR lo que hace es rellenar del bit + significativo que había al inicio. El bit que se pierde se queda en la bandera “C”. SHLD – SHRD: SHLD: 1º) coloca el 2º operando a la derecha del 1º operando y construye con ambos una cadena de bits. 1º Operando 2º Operando 2º) desplaza la cadena entera hacia la izquierda tantas veces como indica el contador. 3º) copia la parte alta de la cadena resultante en el 1º operando. El 2º operando se deja intacto. SHRD: 1º) coloca el 2º operando a la izquierda del 1º operando y con ambos crea una cadena. 2º Operando 1º Operando 2º) desplaza hacia la derecha tantas veces como indica el contador. 3º) se copia la parte baja de la cadena en el 1º operando y se deja intacto el 2º operando. Utilización: SHL REG DATO_INMEDIATO SHL MEM, DATO_INMEDIATO SHL REG, CL (registro contador) SHL MEM, CL SHLD REG, REG, DATO_INMEDIATO SHLD MEM, REG, DATO_INMEDIATO SHLD REG, REG, CL SHLD MEM, REG, CL SHR, SAR, SAL son igual que SHL. SHRD igual que SHLD. La bandera de acarreo siempre tiene el bit expulsado en el último desplazamiento. 28 Estructura y Tecnología de Computadores I 6.3. Instrucciones de rotación. Instrucciones: RCL: rotación a la izquierda pasando a través de la bandera “C”. RCR: rotación a la derecha pasando a través de la bandera “C”. ROL: rotación a la izquierda sin pasar por la bandera “C”. ROR: rotación a la derecha sin pasar por la bandera “C”. Formato: RCL DESTINO, CONTADOR RCR DESTINO, CONTADOR ROL DESTINO, CONTADOR ROR DESTINO, CONTADOR Funcionalidad: Rota tantas veces como expresa el contador. RCL: C DESTINO RCR: DESTINO C ROL: DESTINO C ROR: DESTINO C Utilización: RCL REG, DATO_INMEDIATO RCL MEM, DATO_INMEDIATO RCL REG, CL RCL MEM, CL RCR, ROL y ROR igual que RCL. Estructura y Tecnología de Computadores I 29 6.4. Instrucciones de manipulación de bit. 6.4.1. instrucciones de manipulación de bit de un operando. TEST. Formato: TEST DESTINO, FUENTE Realiza una operación AND bit a bit entre destino y fuente sin almacenar el resultado, sirve para modificar la bandera de estado “Z”. Utilización: TEST REG, REG TEST REG, MEM TEST MEM, REG TEST REG, DATO_INMEDIATO TEST MEM, DATO_INMEDIATO BT. Formato: BT FUENTE, INDICE Copia en la bandera “C” el contenido de la posición índice dentro del operando fuente. Utilización: BT REG, REG BT MEM, REG BT REG, DATO_INMEDIATO BT MEM, DATO_INMEDIATO Empieza del bit menos significativo. BTR, BTS, BTC. Formato: BTR BTS FUENTE, INDICE BTC Estas instrucciones hacen lo mismo que BT y además: BTR: pone el bit implicado a 0. BTC: complementa el bit implicado. BTS: pone el bit a 1. Utilización: Igual que BT. {BTR, BTS, BTC} REG, REG {BTR, BTS, BTC} MEM, REG {BTR, BTS, BTC} REG, DATO_INMEDIATO {BTR, BTS, BTC} MEM, DATO_INMEDIATO BSF. Formato: BSF DESTINO, FUENTE Estructura y Tecnología de Computadores I 30 Busca en fuente el primer bit en “1” comenzando por el menos significativo y terminando por el más significativo. Si lo encuentra pone Z=0 y almacena la posición de ese bit en destino. Utilización: BSF REG, REG BSF REG, MEM BSR. Formato: BSR DESTINO, FUENTE Busca en fuente el primer bit en “1” comenzando por el más significativo y terminando por el menos significativo. Tamaño de operandos: TEST: 8, 16, 32 bits. El resto: 16 o 32 bits. 6.4.2. instrucción de “poner en 1 si se cumple una condición”. Escribir 1 o 0 en un operando (registro o memoria) de 8 bits si se cumple una condición determinada. Formato general: INSTRUCCIÓN REG8 INSTRUCCIÓN MEM8 Las condiciones: Basadas en banderas de estado: - SETC: pone en 1 si C=1. - SETNC: pone en 1 si C=0. - SETZ: pone en 1 si Z=1. - SETNZ: pone en 1 si Z=0. - SETS: pone en 1 si S=1. - SETNS: pone en 1 si S=0. - SETO: pone en 1 si O=1. - SETNO: pone en 1 si O=0. - SETP: pone en 1 si P=1. - SETNP: pone en 1 si P=0. Según el resultado de una comparación sin signo: Deben ejecutarse inmediatamente después de una operación CMP en la que se compara 2 valores representados sin signo. - SETA: pone en 1 si el resultado es >. - SETNBE: pone en 1 si el resultado no es ≤. - SETAE: pone en 1 si el resultado es ≥. - SETNB: pone en 1 si el resultado no es <. - SETB: pone en 1 si el resultado es <. - SETNAB: pone en 1 si el resultado no es ≥. - SETBE: pone en 1 si el resultado es ≤ - SETNA: pone en 1 si el resultado no es >. - SETE: pone en 1 si el resultado es =. - SETNE: pone en 1 si el resultado es ≠. Estructura y Tecnología de Computadores I 31 Según el resultado de una comparación con signo: Deben ejecutarse inmediatamente después de una operación CMP en la que se compara 2 valores representados con signo. - SETG: pone en 1 si el resultado es >. - SETNLE: pone en 1 si el resultado no es ≤. - SETGE: pone en 1 si el resultado es ≥. - SETNL: pone en 1 si el resultado no es <. - SETL: pone en 1 si el resultado es <. - SETNGE: : pone en 1 si el resultado no es ≥. - SETLE: pone en 1 si el resultado es ≤. - SETNG: pone en 1 si el resultado no es >. - SETE: pone en 1 si el resultado es =. - SETNE: pone en 1 si el resultado es ≠. Estructura y Tecnología de Computadores I 32 Tema 7º - Instrucciones de Salto. 7.1. Introducción. Sirven para continuar la ejecución de un programa en una instrucción que no es la que está inmediata después en el código. Modifican el registro de puntero que contiene la siguiente instrucción a ejecutar. Son de tres tipos: - Salto incondicional. - Salto condicionado. - De construcción de bucles. 7.2. Saltos incondicionales. Formato: JMP ETIQUETA Continuar la ejecución del código en la posición de memoria marcada como etiqueta. Hay que colocar esa etiqueta en un punto del código. 7.3. Saltos condicionales. Formato: J[CC] ETIQUETA [CC] Representa a los neumónicos de salto condicional. Función: Se continua la ejecución de la instrucción que está en la posición “etiqueta” si se cumple la condición. Si no se cumple la condición se ejecuta la siguiente a la instrucción de salto. Tipos de condición: - Basadas en banderas. - Basadas en comparaciones con signo. - Basadas en comparaciones sin signo. - Basadas en el contenido del registro ECX. Instrucciones de salto condicional basado en banderas. - JC [ETIQUETA]: salta si C=1. - JNC [ETIQUETA]: salta si C=0. - JZ [ETIQUETA]: salta si Z=1. - JNZ [ETIQUETA]: salta si Z=0. - JS [ETIQUETA]: salta si S=1. - JNS [ETIQUETA]: salta si S=0. - JO [ETIQUETA]: salta si O=1. - JNO [ETIQUETA]: salta si O=0. - JP [ETIQUETA]: salta si P=1. Estructura y Tecnología de Computadores I - 33 JPE [ETIQUETA]: salta si P=1. JNP [ETIQUETA]: salta si P=0. JPO [ETIQUETA]: salta si P=1. Instrucciones de salto condicional basado en operaciones sin signo; deben ir después de instrucciones CMP. Se considera que se compara dos valores representados sin signo. - JA [ETIQUETA]: salta si >. - JNA [ETIQUETA]: salta si no >. - JAE [ETIQUETA]: salta si ≥. - JNAE [ETIQUETA]: salta si no ≥. - JB [ETIQUETA]: salta si <. - JNB [ETIQUETA]: salta si no <. - JBE [ETIQUETA]: salta si ≤. - JNBE [ETIQUETA]: salta si no ≤. - JE [ETIQUETA]: salta si =. - JNE [ETIQUETA]: salta si ≠. Instrucciones de salto condicional basado en operaciones con signo; deben ir después de instrucciones CMP. Se considera que se compara dos valores representados sin signo. - JG [ETIQUETA]: salta si >. - JG [ETIQUETA]: salta si no >. - JGE [ETIQUETA]: salta si ≥. - JNGE [ETIQUETA]: salta si no ≥. - JL [ETIQUETA]: salta si <. - JNL [ETIQUETA]: salta si no <. - JLE [ETIQUETA]: salta si ≤. - JNLE [ETIQUETA]: salta si no ≤. - JE [ETIQUETA]: salta si =. - JNE [ETIQUETA]: salta si ≠. Instrucciones basadas en el contenido del registro ECX. - JCXZ [ETIQUETA]: salta si CX=0. - JECXZ [ETIQUETA]: salta si ECX=0. Estructura y Tecnología de Computadores I 34 7.4. Instrucciones de construcción de bucles. Sirven para construir los saltos que permiten cerrar un bucle. Se suele usar como contador de vueltas el registro ECX. Tipo: - LOOP o Formato: LOOP [ETIQUETA] 1º) ECX ECX – 1. 2º) Si ECX≠0 salta a etiqueta Si ECX=0 ejecuta la siguiente instrucción después de LOOP. - LOOPE o Formato: LOOPE [ETIQUETA] 1º) ECX ECX – 1. 2º) Si ECX≠0 y Z=1 salta a la etiqueta. Sino ejecuta la siguiente instrucción después de LOOPE. - LOOPNE o Formato: LOOPNE [ETIQUETA] 1º) ECX ECX –1. 2º) Si ECX≠0 y Z=0 salta a etiqueta. Sino ejecuta la siguiente instrucción después de LOOPNE. Debido a la forma en que trabajan estos bucles, para que una acción se repita n veces, debemos inicializar el contador con n+1. Estructura y Tecnología de Computadores I 35 Tema 8º - Llamadas a Subrutinas. 8.1. Introducción. Subrutinas: - Es un trozo de código que se accede por medio de un salto que se ejecuta en un determinado punto del programa. - Cuando se termina la ejecución de la subrutina, se debe ejecutar la instrucción que está inmediatamente después de la llamada a la subrutina. - Criterio Básico: el estado del procesador debe ser igual al final de la subrutina que al inicio. Cuando se entre en la subrutina se almacena el estado del procesador y cuando se sale de la subrutina, se recupera el estado. 8.2. Instrucción CALL. Sirve para continuar la ejecución en el comienzo de una subrutina. Formato: CALL [ETIQUETA] Función: 1º) Recordar donde saltar cuando finalice la subrutina. Almacena en la pila la dirección de la instrucción que está después de la CALL. 2º) Salta a la posición indicada por la etiqueta. 8.3. Instrucción RET. Es la instrucción que se coloca al final de una subrutina. Formato: RET Función: 1º) Saca 4 byte de la pila y los interpreta como la dirección de retorno. Es una gran fuente de fallos de programación. 2º) Salta a ese punto de retorno. 8.4. Instrucciones de Interrupción. Sirven para llamar a un tipo especial de subrutinas, las RUTINAS DE SERVICIO DE INTERRUPCION. El objetivo es invocar procedimientos suministrados por el fabricante. Ej.: - Leer de teclado, acceder a disco, escribir en un puerto serie, etc. Estructura y Tecnología de Computadores I 36 Tema 9º - Otras Instrucciones. 9.1. Manipulación directa de Banderas de Estado. CLC: C 0 SETC: C 1 CMC: invertir la bandera; C ¬ C 9.2. Instrucción NOP. Esta instrucción no produce ningún efecto. No hace nada. Se usa para dejar huecos en los binarios cuando están en memoria. Sirve a efectos de depuración de código. 9.3. Instrucción RDTSC. Nos permite medir el tiempo de ejecución. Almacena en EDX:EAX el número de ciclos de reloj transcurridos desde el último “reset” sufrido por el procesador, no desde que el proceso se ejecuta. 9.4. Instrucción de manipulación del Modo Protegido. Para programas del sistema operativo. 9.5. Instrucciones de Entrada / Salida. Instrucciones: IN OPERANDO OUT OPERANDO Se usa para leer / escribir datos en direcciones del subsistema de entrada / salida. A las direcciones de entrada / salida se las conoce como PUERTOS. No se utilizan. Estructura y Tecnología de Computadores I 37 Tema 10º - Acceso a los Recursos del Sistema Operativo. 10.1. Concepto y necesidad de las llamadas al Sistema Operativo. El sistema operativo suministra una serie de funciones. Estas funciones sirven para: - Realización de diversas tareas de índole general. o Lanzamiento de procesos. o Finalización de procesos... - Acceso al sistema de entrada / salida: o Teclado o Pantalla o Dispositivos de i/o o Discos Gestión de archivos Gestión de directorios... Y la realización de todas estas tareas con seguridad. Sólo a través de esas funciones se puede acceder a esos recursos. Además hay funciones para ayudar al usuario en ciertas tareas, no necesariamente hay que recurrir a ellas. 10.2. Funciones de Biblioteca del Sistema Operativo y su utilización. Apéndice D: “Curso de C bajo Unix”; funciones ANSI-C. Dentro del archivo en ensamblador se invoca a la función CALL. Ej.: llamar a la función printf CALL printf Los nombres de las funciones que se invocan han de ser declaradas como EXTERN. El paso de parámetros a las funciones: se realiza a través de la pila. Cuando se invoca a la función se leen los parámetros pero no son sacados de la pila. Si el parámetro es una cadena de caracteres: 1) se almacena a partir de una posición de memoria, 2) se coloca al final un byte con “0”, para indicar el final de la cadena y después un LF (1010). 3) Se introduce en la pila como parámetro la dirección de almacenamiento del comienzo de la cadena. Estructura y Tecnología de Computadores I 38 Si hay varios parámetros: se deben ir introduciendo en la pila en orden inverso al de su aparición en el formato de la función. Devolución de resultados de las funciones: - Si sólo devuelve un número, lo hacen en AL o AX o EAX según sea el tamaño del resultado. - Si es una cadena de caracteres, le debemos haber suministrado como parámetro una dirección de la memoria que esté al inicio de un espacio reservado para almacenar la cadena. Después de invocar CALL (llamada al sistema) hay que eliminar de la pila los parámetros introducidos para ello se puede usar una de las siguientes vías: - realizar tantos “POP” como “PUSH” de palabras se haya realizado para introducir esos parámetros. - Modificar directamente ESP (el puntero de cabeza de la pila). Se le hace volver a su valor original antes de introducir los parámetros de la función. Ej.: Escribir en pantalla: “Resultado = (entero)” EXTERN PRINTF SECTION .TEXT PUSH EAX PUSH DWORD CADENA CALL PRINTF POP EAX ≡ ADD ESP,8 POP EAX SECTION .DATA CADENA DB 'Resultado = %d', 10, 0 Estructura y Tecnología de Computadores I 39 Tema 11º - Los Modos Indirectos. 11.1 Introducción. Concepto: una instrucción utiliza un modo indirecto si para referirse a una determinada posición de memoria, en lugar de expresar directamente el número de dicha dirección, se refiere a ella a través de un lugar de almacenamiento en el que está escrito el número que expresa dicha dirección. Utilización: - En direccionamiento para la instrucción MOV DIRECCIONAMIENTO INDIRECTO. - En instrucciones de salto para expresar la dirección de destino SALTOS INDIRECTOS. - En las llamadas de subrutinas para indicar el punto de comienzo de la subrutina LLAMADAS INDIRECTAS A SUBRUTINAS. 11.2. Direccionamiento Indirecto. En una instrucción MOV, se puede hacer referencia a una dirección de memoria que: - Esté cargada en un registro de 32 bits. - Se puede construir en base a operaciones aritméticas sobre números cargados en registros. Hay cuatro modos: - Direccionamiento indirecto por registro: un registro de 32 bits contiene la dirección involucrada. LEA EBX, [dato] MOV EAX, [EBX] ≡ MOV EAX, [dato] - Direccionamiento indirecto indexado: se hace referencia a una posición de la memoria que se obtiene sumando un número al contenido de un registro. Formato general: MOV destino, [REG + desplazamiento] - Direccionamiento indirecto con base + índice: se hace referencia a una posición de memoria que se obtiene en base a una expresión del tipo: REG1 + REG2 REG1 + A{=2,4,8}× REG - Direccionamiento indirecto con base, índice y desplazamiento: lo mismo que el anterior pero añadiendo un desplazamiento dentro del índice. REG1 + REG2 + desplazamiento REG1 + A{=2,4,8} × REG + desplazamiento Estructura y Tecnología de Computadores I 40 11.3. Saltos Indirectos. Se establece la dirección destino de un salto en base al contenido de: - un registro: JMP REG32 Ej.: LEA EAX, [destino] JMP EAX (saltará a la dirección ‘destino’) - una dirección almacenada en memoria como palabra doble a partir de una ubicación determinada: Ej.: JMP MEM32 LEA EAX, [destino] MOV [dato], EAX JMP [dato] 11.4. Llamadas Indirectas a Subrutinas. Análogas a saltos indirectos. Formato: CALL REG32: Contiene la dirección (en 32 bits) de comienzo de la subrutina. CALL MEM32: Etiqueta hacia una posición de memoria a partir de la que se almacena una dirección de 32 bits que es la dirección de comienzo de la subrutina. Estructura y Tecnología de Computadores I 41 Tema 12º - La Unidad Aritmético Lógica de Punto Flotante. 12.1. Introducción. En IA-32 existen una serie de instrucciones para utilizar la unidad aritmética de punto flotante FPU. Está dentro de la CPU. Es una unidad aritmética especializada en trabajar con punto flotante. La FPU posee sus propios registros internos; tiene ocho registros de datos, un registro de estado y otros. 12.2. Tipos de Datos manejados por la FPU. IA-32 soporta 3 formatos de representación de número en punto flotante. a) Formato de Precisión Simple: 32 bits – 1/8/23 32 bits EXPONENTE (30-23) MANTISA (22-0) SIGNO (31) Numero = (signo) 1. [mantisa] × 2 [exponente -127] Se obtienen 6 dígitos de precisión. Rango: ± 2±128 b) Formato de Precisión Doble: 64 bits – 1/11/52 64 bits EXPONENTE (63-52) MANTISA (51-0) SIGNO (63) Se obtiene 14 dígitos de precisión. Rango: ± 2±1.023 Bit_exponente = exponente + 1.023 c) Formato Precisión Extendida: 80 bits – 1/15/64 Estructura y Tecnología de Computadores I 42 80 bits EXPONENTE (78-64) MANTISA (63-0) SIGNO (79) El primer bit representa la parte entera es una representación no normalizada. Número = (signo) [mantisa] × 2 [exponente] Bit_exponente = exponente +16.383 Se obtienen 19 dígitos de precisión. Rango: ±2±16.383 Internamente la FPU siempre utiliza los números expresados en precisión extendida. IA-32 suministra instrucciones de punto flotante para manipular números representados en cualquier de las tres precisiones. FPU lo convierte a precisión extendida y opera con ellos. 12.3. Registros de FPU. REGISTROS DE DATOS: Son ocho registros con un tamaño cada uno de 80 bits. Almacena un número expresado en precisión extendida. No funciona como los registros de propósito general. - Están organizados como una pila lifo. - Se les denomina ST0, ST1, ..., ST7. - ST0 es la cabecera de la pila y ST7 el fondo de la pila. ST0 corresponde con el número que está en la cabeza, no con la siguiente posición. Cuando se introduce un dato en ST0, lo que había antes pasa a ST1 y así sucesivamente. También se conoce a estos registros como pila-FPU. REGISTRO DE ESTADO FPU: es de 16 bits. Descripción: - 0 a 7 : Banderas de excepción. - Bits de código de condición: 8,9,10,14. o 8 – C0 o 9 – C1 o 10 – C2 o 14 – C3 Estructura y Tecnología de Computadores I 43 12.4. Instrucciones de Movimiento de Datos de la FPU. FLD. Carga en la pila-FPU un número expresado en punto flotante almacenado en: - memoria en {32, 64, 80 bits} - otro registro de la pila, se reintroduce ese valor en la pila. Los de 32 y 64 bits los convierte en uno de 80 bits, hay que recalcularlos de nuevo. Formato y utilización: FLD MEM32 FLD MEM64 FLD MEM80 FLD STi i=0, 1, ...,7. FSTP. Saca el contenido de ST0 y lo lleva a la memoria (32, 64, 80) o un registro de P-FPU (pila FPU). Al sacar el dato el resto de los datos “suben” una posición. El número que está en 32 o 64 bits pierde precisión ya que se almacena en 80 bits. Pasos: 1º) Se copia ST0 en STi 2º) Se “saca” ST0 (ojo que STi pasa a ser STi-1) Formato y utilización: FSTP MEM{32, 64, 80} FSTP STi FST. F:Hace lo mismo que FSTP, pero no saca el valor de ST0 de la pila. Sólo trabaja con dirección de memoria de 32 o de 64 bits, pero nunca con 80 bits. FXCH. Función: Intercambia el contenido de ST0 y STi. Formato: FXCH STi Uso especial: FXCH (sin argumentos, lo que hace es intercambia ST0 y ST1) 12.5. Instrucciones de Conversión de Datos. Sirven para realizar conversiones de valores almacenados como enteros (en Ca2) a valores almacenados en punto flotante. Estructura y Tecnología de Computadores I 44 FILD. Formato: FILD MEM{16, 32, 64} El entero que está en MEM debe estar almacenado en 16, 32 o 64 bits. Función: Convierte de entero a formato extendido y lo mete en ST0 FISTP. Función: Saca el contenido de ST0 y lo almacena en formato de entero en memoria (16, 32, 64) Formato: FISTP MEM{16, 32, 64} 12.6. Instrucciones Aritméticas. 12.6.1. suma en punto flotante. FADD. FADD MEM{32, 64} ≡ ST0 ST0 + MEM (El dato que está en MEM debe estar ya en punto flotante) FADD STi ≡ ST0 ST0 + STi (Estas operaciones no hacen que el resto de valores “descienda” en la pila) FADD TO STi ≡ STi ST0 + STi FADDP. FADDP STi ≡ 1º) STi ST0 + STi 2º) “saca” el valor de ST0 y el resto de valores “suben”. 12.6.2. substracción en punto flotante. FSUB. FSUB MEM{32, 64} ≡ ST0 ST0 - MEM FSUB STi ≡ ST0 ST0 - STi FSUB TO STi ≡ STi ST0 - STi ≡ (FSUB STi, ST0) FSUBR. FSUBR MEM{32, 64} ≡ ST0 MEM - ST0 FSUBR TO STi ≡ STi ← STi - ST0 FSUBT STi , ST0 FSUBP. FSUBP STi ≡ FSUBRP. FSUBRP STi ≡ 1º) STi ST0 – STi 2º) saca ST0 de la pila. 1º) STi STi - ST0 2º) saca ST0 de la pila. Estructura y Tecnología de Computadores I 45 12.6.3. multiplicación en punto flotante. FMUL. FMUL MEM{32, 64} ≡ ST0 ST0 × MEM FMUL STi ≡ ST0 ST0 × STi FMUL TO STi ≡ STi ST0 × STi FMULP. FMULP STi ≡ 1º) STi ST0 × STi 2º) saca ST0 de la pila. 12.6.4. división en punto flotante. FDIV. FDIV MEM{32, 64} ≡ ST0 ST0 / MEM FDIV STi ≡ ST0 ST0 / STi FDIV TO STi ≡ STi ST0 / STi FDIVR. FDIVR MEM ≡ ST0 MEM / ST0 FDIVR STi ≡ ST0 STi / ST0 FDIVR TO STi ≡ STi STi / ST0 FDIVP. FDIVP STi ≡ 1º) STi ST0 / STi 2º) saca ST0 de la pila. FDIVPR. FDIVPR STi ≡ 1º) STi STi / ST0 2º) saca ST0 de la pila. 12.6.5. otras instrucciones aritméticas. FSQRT. FSQRT ≡ ST0 ST0½ FXTRACT. 1º) saca el valor de ST0. 2º) mete en la pila el exponente. 3º) mete en la pila la mantisa. Al final en ST0 queda la mantisa y en ST1 queda el exponente, almacenados en punto flotante. FSCALE. Es la inversa de FXTRACT. Entiende ST1 y ST0 como el exponente y la mantisa. Deja el número en ST0. FRNDINT. Redondea a entero el valor de ST0. FABS. Calcula el valor absoluto de ST0. Pone a 0 el bit de signo. FCHS: cambia el signo de ST0. Estructura y Tecnología de Computadores I 46 12.7. Instrucciones de Comparación. Sirve para comparar números en formato de punto flotante. El resultado va a las banderas C3, C2 y C0. C3 C2 C0 ST0 > operando 0 0 0 ST0 < operando 0 0 1 ST0 = operando 1 0 0 FCOM. FCOM MEM{32, 64} FCOM STi Compara ST0 con el operando. FCOMP. FCOMP MEM{32, 64} FCOMP STi Compara ST0 con operando, deja el resultado de las banderas C3, C2, C0 y saca ST0 de la pila. FCOMPR. Compara ST0 con ST1 y saca los dos de la pila. ST2 pasa a ST0 y ST3 pasa a ST1. FCOMI & FCOMIP. FCOMI STi FCOMIP STi Compara ST0 con STi y deja el resultado de la comparación en el registro EFLAGS. El interés de esta instrucción es que pueden ser seguidas inmediatamente por otras instrucciones de salto condicional. FTST. Compara ST0 con 0. 12.8. Predefinición de constantes. Colocar en ST0 ciertas constantes útiles. FLDZ. FLDZ ≡ ST0 +0 FLD1. FLD1 ≡ ST0 +1 FLDPI. FLDPI ≡ ST0 π FLD2T. FLD2T ≡ ST0 log2(10) FLD2E. FLD2E ≡ ST0 log2(e) FLDG2. FLDG2 ≡ ST0 log10(2) FLDN2. FLDN2 ≡ ST0 ln(2) 12.9. Instrucciones sobre operaciones transcendentales. Funciones trigonométricas. FSIN. FSIN ≡ ST0 sen(ST0) FCOS. FCOS ≡ ST0 cos (ST0) Estructura y Tecnología de Computadores I 47 FSINCOS. FSINCOS ≡ ST0 sen(ST0) ST1 cos(ST0) FPTAN. FPTAN ≡ ST0 tg(ST0) FPATAN. 1º) saca ST0 y ST1 de la pila. 2º) ST0 arctg (ST1/ST0) Condiciones: 1º) ST0 debe estar en radianes. 2º) ST0 debe estar en un rango de ± 263 Funciones logarítmicas. FYL2X. FYL2X ≡ ST0 ST1 × log2(ST0) Saca ST0 y ST1 de la pila, realiza la multiplicación y almacena el resultado en ST0. 12.10. Operaciones con enteros en la unidad de punto flotante. Instrucciones: FIADD, FISUB, FISUBR, FIMUL, FIDIV, FIDIVR, FICOM, FICOMP. Formato: [INSTRUCCION] MEM{16,32} Función: Hacen lo mismo que sus homónimos sin la “I” considerando que el operando es un entero de 16 o 32 bits. Siempre usan ST0 como destino. 12.11. Otras instrucciones. FXAM. Examina el valor de ST0 y devuelve el resultado en C3, C2, C1, C0. Si ST0 es + C1=0 Si ST0 es - C1=1 C3 C2 C1 C0 0 1 0 1 +∞ en ST0. 0 1 1 1 -∞ en ST0. 1 0 0 0 +0 1 0 1 0 -0 FSTSW. Copia el contenido del registro de estado FPU. FSTSW AX ≡ copia el contenido del registro de estado hacia AX. FSTSW MEM16 ≡ copia el contenido del registro de estado hacia MEM. FINIT. Inicializa FPU al estado por defecto. 1º) Deja el registro de estado FPU a 0. Estructura y Tecnología de Computadores I 2º) Deja la pila de FPU vacía. 48 Estructura y Tecnología de Computadores I 49 Tema 13º - Manipulación de Cadenas y Conjuntos de Caracteres. 13.1. Introducción. CADENA: colección de objetos almacenados en posiciones consecutivas de memoria. Los objetos pueden ser byte, palabras, dobles palabras. Existen instrucciones especificas para manipulación. Útiles para manipulación de array... 13.2. Instrucción de Manipulación de Cadenas. Operan sobre conjuntos de posiciones contiguas de la memoria. Operan en memoria. No se suministra explícitamente ningún operando. Los datos que controlan el funcionamiento de estas instrucciones están almacenados en registros de propósito general. Funciones: - Copiar secuencias de byte de una ubicación de memoria a otra. - Comparar secuencias almacenadas en memoria. - Buscar un valor en una secuencia. - Inicializar zonas de memoria a un determinado valor. Formato: [prefijo] [función] Operación: Suele ser una acción repetitiva. Controlada por: - ESI: Contiene la dirección inicial del bloque de datos fuente. - EDI: Dirección inicial del bloque de datos destino. - ECX: Contador. Especifica el número de veces que se ejecuta la operación repetitiva. - Bandera de dirección: bandera “D” (bit 10º) del registro EFLAGS. Controla como varía si hacia delante o hacia atrás: o D=0: ESI y EDI se incrementan después de cada operación unitaria. o D=1: ESI y EDI se decrementan después de cada operación unitaria. CLD : D ← 0 o Manipulación de D STD : D ← 1 - EAX: asume diferentes funciones. [prefijo]: Especifica la repetición. REP REPE REPNE [funcion] 50 Estructura y Tecnología de Computadores I MOVS: mover CMPS: comparar SCAS: escanear LODS: cargar en memoria STOS: almacena desde memoria B − 8 Llevan el sufijo W − 16 para especificar el tamaño de la operación unitaria. D − 32 13.3. Instrucciones derivadas de MOVS Copia un bloque de memoria sobre otro bloque. REP MOVSB Copia byte a byte. REP MOVSW Copia palabra a palabra. REP MOVSD Copia de palabra doble a palabra doble. Sólo se puede usar el prefijo REP o no usarlo, pero entonces lo operación sólo se hace una vez. 13.4. Instrucciones derivadas de CMPS. Compara dos cadenas, la que comienza en la posición indicada por ESI con la que comienza en la posición indicada por EDI. 1º) Se resta el valor de la posición EDI y de la posición ESI. 2º) Se actualiza las banderas de resultado. 1 3º) ESI y EDI varían en 2 según indique el sufijo de CMPS sea 4 B W D REPE Si se coloca prefijo puede ser . ECX debe tener la longitud de la REPNE cadena. REPE la operación de comparación se repite mientras se detecte igualdad entre los elementos comparados. REPNE la operación de comparación se repite mientras se detecte desigualdad entre los elementos comparados. Las banderas se actualizan. Puede ser actualizado análogamente a la instrucción CMP. La utilidad principal es comparar cadenas de caracteres para su ordenación alfabética. EDI inicio de palabra1 ESI inicio de palabra2 REPE CMPSB Si > palabra1 precede a palabra2 Si < palabra2 precede a palabra1 Si = Palabra1 = palabra2 Estructura y Tecnología de Computadores I 51 13.5. Instrucción derivadas de SCAS. Sirve para identificar un elemento (B, W, D) dentro de una cadena. La cadena sobre la que se busca está en EDI. Funcionamiento: SCASB: busca AL en [EDI] Contenido de la dirección que contiene EDI SCASW: busca AX en [EDI] SCASD: busca EAX en [EDI] Se activa las banderas; si Z=1 igualdad. REPE : se repite la comp mientras se detecta igualdad Con repetición REPNE : se repite la comp. mientras sea desigualda d Se repite el número de veces que indique ECX. 13.6. Instrucciones derivadas de STOS. Almacena en memoria el valor especificado en AL (STOSB), AX (STOSW), EAX (STOSD) en la posición indicada por EDI. Luego se in/decrementa EDI según la bandera ‘D’. Puede ser repetitivo, sólo con REP y se repite tantas veces como se haya especificado en ECX. Sirve para iniciar una zona de memoria con un valor constante. 13.7. Instrucción derivada LODS. AL → MOVSB Copia el valor contenido [EDI] sobre AX → MOVSW e in/decrementa EDI EAX → MOVSD según ‘D’. Se puede colocar REP. 52 Estructura y Tecnología de Computadores I Tema 14º - Desarrollo de Aplicaciones. Ejemplo 1º. main() { int a, b, c; a:= 27; b:= 54; c:= a+b; b:= a; printf (“suma = %d\n”,c); } bits 32 global main extern exit extern printf section .text main mov dword [a], 27 mov dword [b], 54 mov EAX, [a] add EAX, [b] mov [c], EAX mov [b], EAX push dword, [c] push dword cadena call printf add ESP, 8 {para dejar la pila 8=4*número_push_dword} call exit como section .data cadena ‘suma = %d’, 10, 0 section .bss a resd 1 {reservo un espacio de palabra doble} b resd 1 c resd 1 estaba Estructura y Tecnología de Computadores I Ejemplo 2º. main() { int a, b, c; a:= 27; b:= 54; c:= 32; a:= (a+b)/c; printf (“resultado = %d\n”,a); } bits 32 global main extern exit extern printf section .text main mov dword [a], 27 mov dword [b], 54 mov dword [c], 32 mov EAX, [a] add EAX, [b] {hace la suma EAXa+b} cdq {extiende EAX de 32 a 64} idiv dword [c] mov [a], EAX push dword [a] push dword cadena call printf add ESP, 8 call exit section .data cadena db ‘resultado = %d’,10,0 section .bbs a resd 1 {reservo un espacio de palabra doble} b resd 1 c resd 1 53 Estructura y Tecnología de Computadores I 54 Ejemplo 3º. float a,c; int b; a:= -1’23e-3; b:= 7; c:=a×b; {debo multiplicar en punto flotante} printf (“producto de a×b = %f \n”,c) printf (“producto de a×b = %e \n”,c) bits 32 global main extern exit extern printf section .text main mov EAX, [dato] mov [a], EAX mov dword [b], 7 fld dword [a] {aquí tengo el contenido de la memoria en ST0} fld dword [b] {después de esto tendré “b” en ST0 y “a” en ST1} fmul ST1 {en ST0 se queda a*b} fstp dword [c] fld [dword] fstp qword [aux] push dword [aux + 4] push dword [aux] push dword cadena1 call printf add ESP, 12 push dword [aux + 4] push dword [aux] push dword cadena2 call printf add ESP, 12 call exit section .data dato dd –1’23e-3 cadena1 db ‘Producto de a×b = %f”,10,0 cadena2 db ‘Producto de a×b = %e”,10,0 section .bbs a resd 1 b resd 1 c resd 1 aux resq 1 Estructura y Tecnología de Computadores I 55 Ejemplo 4º. main () { int a; {aquí se dice que primero reserva espacio para “a” que luego le doy el valor 0. si pusiera a:=0 directamente ya lo habría inicializado en la section data} int i; a:=0; for (i=0;i<10;i++) { a:=a+1; printf (“Contador = %d\n”,a) } } bits 32 global main extern exit extern printf section .text main mov dword [a], 0 mov dword [i],0 lazo cmp dword [i],10 {compara 1 con 10} jnb fin_lazo {controla cada vuelta} inc dword [a] push dword [a] push dword cadena call printf add ESP, 8 {incrementa el contador} inc dword [i] jmp lazo {retorno al inicio} fin_lazo call exit section .data cadena db ‘Contador = %d’,10,0 {se pone db por que se quiere almacenar un entero que es “a” y es de 32 bits} section .bbs a resd 1 i resd 1 Otra forma de hacerlo. bits 32 global main extern exit 56 Estructura y Tecnología de Computadores I extern printf section .text main mov dword [a,], 0 mov ECX, 10 {atención a la entre corchetes} coma que lazo inc dword [a] push ECX push dword [a] push dword cadena call printf add ESP, 8 pop ECX loop lazo Ejemplo 5º. int lista [20] = {2,3,5,8,1,27,...} int r, i; r:=1; while (r==1) { r:=0 for (i=0; i<10;i++) { if (lista[i] > lista [i+1]) { intercambiar (lista[i], lista[i+1]); r:=1; } } } for (i=0; i<20; i++) printf (“lista(%d) = %d \n)”,i, lista[i]); bits 32 global main extern exit extern printf section .text main mov dword [r], 1 lazo_while cmp dword [r],1 jne fin_lazo_while está Estructura y Tecnología de Computadores I 57 mov dword [r],0 mov dword [i],0 lazo_for_1 cmp dword[i],10 jnb fin_lazo_for_1 lea EBX, [lista] mov ECX, [i] mov EAX, [EBX + 4×ECX] {direccionamiento indirecto} mov EDX, [EBX + 4×ECX+4] {direccionamiento indirecto base+indice+desplazamiento} cmp EAX, EDX jbe fin_if xchg EAX, EDX mov [EBX +4×ECX], EAX mov [EBX + 4×ECX+4], EDX mov dword [r], 1 fin_if inc dword [i] jmp lazo_for_1 fin_lazo_for_1 jmp lazo_while fin_lazo_while mov dword [i], 0 lea EBX, [lista] lazo_for_2 cmp dword [i], 20 jnb fin_lazo_for_2 mov EAX, [i] push dword [EBX + 4× EAX] push EAX push dword cadena call printf add ESP, 12 inc dword [i] jmp lazo_for_2 fin_lazo_for_2 call exit section .data lista dd 2,3,5,8,1,27,... cadena db ‘lista (%d)= %d’,10,0 section .bbs r resd 1 i resd 1 Siempre que queramos recuperar una dirección lo haremos con “lea” y no con etiquetas por que puede dar problemas. Cuando uno de los operando es un registro se supone que el almacenarlo en memoria el tamaño que se pone es el del registro y por eso no hace falta poner dword. Sin embargo cuando tengo que almacenar un inmediato en memoria tengo especificar el tamaño con el que lo quiero almacenar. Estructura y Tecnología de Computadores I Ejemplo 6º. y= 5 .0 × X − 7 .0 X + 2 .5 bits 32 global main extern exit extern printf extern scanf extern atof {cambia de ASCII a float} section .text main push dword formato1 call printf add ESP, 4 push dword cadena_leida push dword formato_scanf call scanf add ESP, 8 push dword cadena_leida call atof add ESP, 4 fstp tword [x] fld tword [x] fmul qword [dato1] fsub tword [dato2] fld tword [x] fado dword [dato3] fdivr ST1 fstp tword [y] push word [y+8] push dword [y+4] push dword [y] push dword formato2 call printf add ESP, 14 section .data dato1 dq 5.0 dato2 dq 7.0 dato3 dd 2.5 formato1 db ‘Introduzca un número real:’,0 formato_scanf db ‘%s’,0 cadena_leida db ‘_ _ _ _ _ _ _ _ _ _’,0 formato2 db ‘Resultado % 20,7 Le’10,0 section .bbs x rest 1 y rest 1 58