Estructura de Computadores

Documentos relacionados
Introducción a la Computación. Capítulo 10 Repertorio de instrucciones: Características y Funciones

Estructura de Computadores

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA GRADO EN INGENIERÍA INFORMÁTICA. ESTRUCTURA DE COMPUTADORES

Sesión 11 Implementación de sentencias condicionales

Definición de Memoria

Arquitectura de Computadores y laboratorio Clase 15: Arquitectura MIPS Pt.3. Departamento de Ingeniería de Sistemas Universidad de Antioquia

El lenguaje ensamblador depende directamente de la arquitectura del computador. Por tanto cada arquitectura tiene su propio lenguaje ensamblador.

Apéndice A. Manual de usuario. Guía rápida

REPERTORIO DE INSTRUCCIONES MIPS

El nivel ISA (II)! Conjunto de Instrucciones

Conceptos de Arquitectura de Computadoras Curso 2015

Ficha de Aprendizaje N 13

Documentación del simulador SPIM.

Guía Laboratorio Número 1

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Introducción a la arquitectura de computadores

Tema 2. El lenguaje JAVA

Estructura de Computadores. Capítulo 3b: Programación en

Arquitecturas RISC. Arquitectura de Computadoras y Técnicas Digitales - Mag. Marcelo Tosini Facultad de Ciencias Exactas - UNCPBA

Arquitectura de Computadores II Clase #3

Tema: Microprocesadores

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

ISA (Instruction Set Architecture) Arquitectura del conjunto de instrucciones

COMPUTADORES SEGMENTADOS (DLX)

Tema 2: Arquitectura del repertorio de instrucciones. Visión del computador que tiene el programador en bajo nivel.

Estructura de Computadores

8. Diseño de la codificación binaria del repertorio de Instrucciones.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

4. Operadores Operador asignación

LECCIÓN 14: DISEÑO DE COMPUTADORES MEDIANTE MICROPROGRAMACION

Expresiones y sentencias

Principios de Computadoras II

Objetivos. Objetivos. Arquitectura de Computadores. R.Mitnik

Programación en MIPS

PRÁCTICAS DE ARQUITECTURA DE COMPUTADORES

Ejercicios del tema 5. Jerarquía de de Memoria

1.2.- EL MICROPROCESADOR.

Datos y tipos de datos

FUNCIONAMIENTO DEL ORDENADOR

SISTEMAS OPERATIVOS Arquitectura de computadores

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Elementos de un programa en C

El lenguaje C. 1. Identificadores, constantes y variables

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Estructura de Datos: Archivos

Funciones. Diseño de funciones. Uso de instrucción jal y retorno de subrutina.

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Java para no Programadores

2.4. Modos de direccionamiento Distintas formas que tiene la arquitectura para especificar la ubicación de los operandos.

Arquitectura de Computadores

Departamento de Ingeniería de Sistemas y Automática. STEP 7. Juego de instrucciones

Clasificación del procesador según el número de referencias a memoria.

Circuitos Digitales II y Laboratorio Fundamentos de Arquitectura de Computadores

Arquitectura de Computadores. Apellidos, Nombre:

Curso de Programación Avanzada en C

FUNDAMENTOS DE COMPUTADORES 18 de junio de Examen parcial del 2º cuatrimestre.

TEMA 2. CODIFICACIÓN DE LA INFORMACIÓN

CICLOS DEL PROCESADOR

Práctica 4 - Arquitectura CPU

Convenciones. Introducción. Unidades principales en la implementación. El procesador: camino de datos y control. Tipos de elementos:

PROGRAMACIÓN BÁSICA DE LA COMPUTADORA. 1 Introducción. Tabla 1: Instrucciones MIPS

Contenido. Conjunto de Instrucciones. Formato de la Instrucción. Instrucciones de 1 byte. Formato de la Instrucción 28/09/2011

Tema 4. Operadores y Expresiones

Java para programadores

Operadores. Javier Fernández Rivera -

Tema 5 Diseño del Set de Instrucciones (ISA) Arquitectura de Computadoras

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

Arquitectura de Computadores. Adecuación al diseño de unidades segmentadas (pipelining).

Programación en java. Estructuras algorítmicas

Datos y tipos de datos

Práctica 4. Organización del Computador 1 12 de septiembre de Algunas consideraciones preliminares:

MICROPROCESADOR RISC SINTETIZABLE EN FPGA PARA FINES DOCENTES

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

CPU MEMORIAS CACHE. Memorias caché. Memoria caché = memoria de tamaño pequeño y acceso rápido situada entre la CPU y la memoria principal.

Nivel ISA. Revisión y resultados parcial 1

Estructura del Computador

Tema 2 Introducción a la Programación en C.

ARQUITECTURA DE COMPUTADORES. Tema 2: Lenguaje Máquina, Instrucciones y Modos de Direccionamiento.

Práctica de constantes, expresiones y operadores. Programación en C 1

Estructura de Microprocesadores. Profesor Ing. Johan Carvajal Godínez

ESTRUCTURA Y TECNOLOGÍA A DE COMPUTADORES

Apuntadores (Punteros)

Arquitectura intel Preámbulo de OSO para alumnos formados en el procesador MIPS. Asignatura Sistemas Operativos Murcia abril de 2005

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

Paso de parámetros y gestión del marco de pila

Tema 4: Diseño de un microprocesador

Asignatura de Organización de Computadoras. Alberto Hernández Cerezo. Cristian Tejedor García. Rodrigo Alonso Iglesias. Universidad de Valladolid

1. Introducción a la Arquitectura de Computadoras

Resumen de las instrucciones del 8086/8088

Guía práctica de estudio 05: Diagramas de flujo

Representación de la información

Tema 2. Diseño del repertorio de instrucciones

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Computación II. Introducción a Visual Basic

Operadores y Expresiones

Lenguaje C. Tipos de Datos Simples y Estructuras de Control

Arquitectura de Computadores. Tema 4 PROCESADORES SEGMENTADOS

Transcripción:

Estructura de Computadores Tema 3. Programación en ensamblador Departamento de Informática Grupo de Arquitectura de Computadores, Comunicaciones y Sistemas UNIVERSIDAD CARLOS III DE MADRID

Contenido Fundamentos básicos de la programación en ensamblador Ensamblador del MIPS 32, modelo de memoria y representación de datos Formato de las instrucciones y modos de direccionamiento Llamadas a procedimientos y uso de la pila ARCOS Estructura de Computadores 2

Motivación para aprender ensamblador Para comprender qué ocurre cuando un computador ejecuta una sentencia de un lenguaje de alto nivel. C, C++, Java, PASCAL, Para poder determinar el impacto en tiempo de ejecución de una instrucción de alto nivel. Porque es útil en dominios específicos. Compiladores, SSOO Juegos Sistemas empotrados Etc. ARCOS Estructura de Computadores 3

Motivación para usar MIPS 32 Arquitectura simple. Facilidad de aprendizaje. Ensamblador similar al de otros procesadores RISC Usado en diversos dispositivos 4 ARCOS Estructura de Computadores 4

Qué es un computador? datos Procesador resultados Instrucciones ARCOS Estructura de Computadores 5

Instrucción máquina 001 AB 00000000101 Código de operación Operandos Registros Direcciones de memoria Números ARCOS Estructura de Computadores 6

Fases de ejecución de una instrucción Lectura de la instrucción (ciclo de fetch) MAR PC Lectura MBR Memoria PC PC + 1 RI MBR MAR PC RI 000100 MBR Decodificación de la instrucción Ejecución de la instrucción Dirección Contenido 000100 0010000000000000 Volver a fetch Memoria ARCOS Estructura de Computadores 7

Propiedades de las instrucciones máquina Realizan una única y sencilla tarea Operan sobre un número fijo de operandos Son autocontenidas, incluyen toda la información necesaria para su ejecución Incluye: La operación a realizar Dónde se encuentran los operandos: En registros En memoria En la propia instrucción Dónde dejar los resultados Una referencia a la siguiente instrucción a ejecutar De forma implícita la siguiente De forma explícita en las instrucciones de bifurcación ARCOS Estructura de Computadores 8

Programa Secuencia ordenada de instrucciones máquina que se ejecutan en secuencia 00001001110001101010111101011000 10101111010110000000100111000110 11000110101011110101100000001001 01011000000010011100011010101111 temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; ARCOS Estructura de Computadores 9

Diferentes niveles de lenguajes Lenguaje de alto nivel (ej: C, C++) compilador Lenguaje ensamblador (Ej: MIPS) Lenguaje Máquina (MIPS) Ensamblador temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; lw $t0, 0($2) lw $t1, 4($2) sw $t1, 0($2) sw $t0, 4($2) 0000 1001 1100 0110 1010 1111 0101 1000 1010 1111 0101 1000 0000 1001 1100 0110 1100 0110 1010 1111 0101 1000 0000 1001 0101 1000 0000 1001 1100 0110 1010 1111 ARCOS Estructura de Computadores 10

Lenguaje ensamblador Emplea códigos nemónicos para representar instrucciones add suma lw carga un dato de memoria Emplea nombres simbólicos para designar a datos y referencias $t0 identificador de un registro Cada instrucción en ensamblador se corresponde con una instrucción máquina add $t1, $t2, $t3 ARCOS Estructura de Computadores 11

Modelo de programación de un computador Un computador ofrece un modelo de programación que está formando: Juego de instrucciones (lenguaje ensamblador) Una instrucción incluye: Código de operación Otros elementos: identificadores de registros, direcciones de memoria o números Elementos de almacenamiento Registros Memoria Registros de los controladores de E/S Modos de ejecución ARCOS Estructura de Computadores 12

Lenguaje ensamblador Emplea códigos nemónicos para representar instrucciones add suma lw carga un dato de memoria Emplea nombres simbólicos para designar a datos y referencias $t0 identificador de un registro Cada instrucción en ensamblador se corresponde con una instrucción máquina add $t1, $t2, $t3 ARCOS Estructura de Computadores 13

Arquitectura MIPS MIPS R2000/R3000 Procesador de 32 bits Tipo RISC CPU + coprocesadores auxiliares Coprocesador 0 excepciones, interrupciones y sistema de memoria virtual Coprocesador 1 FPU (Unidad de Punto Flotante) ARCOS Estructura de Computadores 14

Banco de registros Nombre Simbólico del registro Número zero 0 Constante 0 Uso at 1 Reservado para el ensamblador v0, v1 2, 3 Resultado de una rutina (o expresión) a0,, a3 4,, 7 Argumento de entrada para rutinas t0,, t7 8,, 15 Temporal (NO se conserva entre llamadas) s0,, s7 16,, 23 Temporal (se conserva entre llamadas) t8, t9 24, 25 Temporal (NO se conserva entre llamadas) k0, k1 26, 27 Reservado para el sistema operativo gp 28 Puntero al área global sp 29 Puntero a pila fp 30 Puntero a marco de pila ra 31 Dirección de retorno (rutinas) Hay 32 registros Tamaño de 1 palabra (4 bytes) Se nombran con un $ al principio Convenio de uso Reservados Argumentos Resultados Temporales Punteros ARCOS Estructura de Computadores 15

Tipos de instrucciones De transferencia Aritmética Lógicas De desplazamiento De rotación De comparación De bifurcación ARCOS Estructura de Computadores 16

Transferencia de datos Copia de un dato en un registro. Carga inmediata li $t0 5 $t0 5 Registro a registro move $a0 $t0 $a0 $t0 Instrucciones de acceso a memoria (más adelante) De registro a memoria De memoria a registro ARCOS Estructura de Computadores 17

Aritméticas Realiza operaciones aritméticas de entero (ALU) o aritmética de coma flotante (FPU) Ejemplos de operaciones con enteros Sumar add $t0, $t1, $t2 $t0 $t1 + $t2 suma con desbordamiento addi $t0, $t1, 5 $t0 $t1 + 5 suma con desbordamiento addu $t0, $t1, $t2 $t0 $t1 + $t2 suma sin desbordamiento Restar sub $t0 $t1 1 Multiplicar mul $t0 $t1 $t2 Dividir div $t0, $t1, $t2 $t0 $t1 / $t2 división entera rem $t0, $t1, $t2 $t0 $t1 % $t2 resto de división entera ARCOS Estructura de Computadores 18

Ejemplo int a = 5; int b = 7; int c = 8; int d; li $t0, 5 li $t1, 7 li $t2, 8 d = a * (b + c) add $t1, $t1, $t2 mul $t3, $t1, $t0 ARCOS Estructura de Computadores 19

Ejemplo int a = 5; int b = 7; int c = 8; int d; d=-(a*(b-10)+c) li $t0, 5 li $t1, 7 li $t2, 8 li $t3 10 sub $t1, $t1, $t3 add $t1, $t1, $t2 mul $t0, $t0, $t1 li $t1, -1 mul $t0, $t0, $t1 ARCOS Estructura de Computadores 20

Lógicas Operaciones booleanas Ejemplos: AND and $t0 $t1 $t2 ($t0 = $t1 && $t2) OR or $t0 $t1 $t2 ($t0 = $t1 $t2) ori $t0 $t1 80 ($t0 = $t1 80) NOT not $t0 $t1 ($t0 =! $t1) XOR or $t0 $t1 $t2 ($t0 = $t1 ^ $t2) AND OR NOT XOR 1100 1010 1000 1100 1010 1110 10 01 1100 1010 0110 ARCOS Estructura de Computadores 21

Ejemplo li $t0, 5 li $t1, 8 Cuál es el valor de $t2? and $t2, $t1, $t0 ARCOS Estructura de Computadores 22

Solución li $t0, 5 li $t1, 8 and $t2, $t1, $t0 Cuál es el valor de $t2? 000. 0101 $t0 000.. 1000 $t1 and 000.. 0000 $t2 ARCOS Estructura de Computadores 23

Desplazamientos De movimiento de bits Ejemplos: Desplazamiento lógico a la derecha 0 srl $t0 $t0 4 ($t0 = $t0 >> 4 bits) 01110110101 Desplazamiento lógico a la izquierda sll $t0 $t0 5 ($t0 = $t0 << 5 bits) 01110110101 0 Desplazamiento aritmético a la derecha mantiene el signo sra $t0 $t0 2 ($t0 = $t0 >> 2 bits) 11110110101 ARCOS Estructura de Computadores 24

Rotaciones De movimiento de bits Ejemplos: Rotación a la izquierda rol $t0 $t0 4 ($t0 = $t0 >> 4 bits) Rotación a la derecha ror $t0 $t0 5 ($t0 = $t0 << 5 bits) 01110110101 01110110101 ARCOS Estructura de Computadores 25

Instrucciones de comparación seq $t0, $t1, $t2 if ($t1 == $t2) $t0 = 1; else $t0 = 0 sneq $t0, $t1, $t2 if ($t1!=$t2) $t0 = 1; else $t0 = 0 sge $t0, $t1, $t2 if ($t1 >= $t2) $t0 = 1; else $t0 = 0 sgt $t0, $t1, $t2 if ($t1 > $t2) $t0 = 1; else $t0 = 0 sle $t0, $t1, $t2 if ($t1 <= $t2) $t0 = 1; else $t0 = 0 slt $t0, $t1, $t2 if ($t1 < $t2) $t0 = 1; else $t0 = 0 ARCOS Estructura de Computadores 26

Instrucciones de comparación seq $t0, $t1, $t2 sneq $t0, $t1, $t2 sge $t0, $t1, $t2 sgt $t0, $t1, $t2 sle $t0, $t1, $t2 slt $t0, $t1, $t2 Set if equal Set if no equal Set if greater or equal Set if greater than Set if less or equal Set if less than ARCOS Estructura de Computadores 27

Instrucciones de bifurcación Cambian la secuencia de ejecución de las instrucciones de un programa Distintos tipos: Bifurcación o salto condicional: beq $t0 $t1 0xE00012 Salta a la posición 0xE00012, si valor $t0 == $t1 beqz $t1 direccion Salta a la instrucción etiqueta con direccion si $t1 == 0 Bifurcación o salto incondicional: El salto se realiza siempre j 0x10002E b direccion Llamadas a funciones: jal 0x20001E jr $ra ARCOS Estructura de Computadores 28

Instrucciones de bifurcación beqz $t0, direccion Branch if $t0 == 0 beq $t0, $t1 direccion Branch if equal (t0 == t1) bneq $t0, $t1 direccion Branch if not equal (t0 t1) bge $t0, $t1 direccion Branch if greater or equal (t0 t1) bgt $t0, $t1 direccion Branch if greater than (t0 > t1) ble $t0, $t1 direccion Branch if less or equal (t0 t1) blt $t0, $t1 direccion Branch if less than (t0 <t1) ARCOS Estructura de Computadores 29

Estructuras de control while } int i; i=0; while (i < 10) { /* acción */ i = i + 1 ; } li $t0 0 li $t1 10 while: bge $t0 t1 fin # acción addi $t0 $t0 1 b while fin:... ARCOS Estructura de Computadores 30

Ejemplo Calcular la suma 1 + 2 + 3 +. + 10 } i=0; s=0; while (i < 10) { s = s + i; i = i + 1; } li $t0 0 li $t1 0 li $t2 10 while: bge $t0 t2 fin add $t1 $t1 $t0 addi $t0 $t0 1 b while fin:... Resultado en $t1 ARCOS Estructura de Computadores 31

Ejemplo Calcular el número de 1 s que hay en un registro ($t0). Resultado en $t3 } i = 0; n = 45; #numero s=0; while (i < 32) { b = ultimo bit de n s = s + b; se desplaza n un bit a la derecha i = i + 1 ; } li $t0 0 #i li $t1 45 #n li $t2 32 li $t3 0 #s while: bge $t0 t2 fin and $t4 $t1 1 add $t3 $t3 $t4 srl $t1 $t1 1 addi $t0 $t0 1 b while fin:... ARCOS Estructura de Computadores 32

Ejemplo Obtener los 16 bits superiores de un registro ($t0) y dejarlos en los 16 bits inferiores de otro ($t1) srl $t1, $t0, 16 0 01110110101 Se desplaza a la derecha 16 Posiciones (de forma lógica) ARCOS Estructura de Computadores 33

Estructuras de control if int b1 = 4; int b2 = 2; if (b2 == 8) { b1 = 0; }... li $t0 4 li $t1 2 li $t2 8 bneq $t0 $t2 fin li $t0 0 fin:... ARCOS Estructura de Computadores 34

Estructuras de control if-else int a=1; int b=2; if (a < b) { // acción 1 } else { // acción 2 } li $t1 1 li $t2 2 blt $t1 $t2 then # cond. else:... # acción 2 b fin # incond. then:... # acción 1 fin:... ARCOS Estructura de Computadores 35

Ejemplo Determinar si el contenido de un registro ($t2) es par. Si es par se almacena en $t1 un 1, sino se almacena un 0 li $t2 9 li $t1 2 rem $t1 $t2 $t1 # se obtiene el resto beq $t1 $0 then # cond. else: li $t1 0 b fin # incond. then: li $t1 1 fin:... ARCOS Estructura de Computadores 36

Ejemplo Determinar si el contenido de un registro ($t2) es par. Si es par se almacena en $t1 un 1, sino se almacena un 0. En este caso consultando el último bit li $t2 9 li $t1 1 and $t1 $t2 $t1 # se obtiene el último bit beq $t1 $0 then # cond. else: li $t1 0 b fin # incond. then: li $t1 1 fin:... ARCOS Estructura de Computadores 37

Ejemplo Calcular a n a en $t0 n en $t1 El resultado en $t2 } a=8 n=4; i=0; p = 1; while (i < n) { p = p * a i = i + 1 ; } li $t0 8 li $t1 4 li $t2 1 li $t4 0 while: bge $t4 $t1 fin mul $t2 $t2 $t0 addi $t4 $t4 1 b while fin: move $t2 $t4 ARCOS Estructura de Computadores 38

Contenido Fundamentos básicos de la programación en ensamblador Ensamblador del MIPS 32, modelo de memoria y representación de datos Formato de las instrucciones y modos de direccionamiento Llamadas a procedimientos y uso de la pila ARCOS Estructura de Computadores 39

Simulador SPIM http://pages.cs.wisc.edu/~larus/spim.html SPIM es un simulador de una arquitectura MIPS Aplicación multiplataforma: Linux Windows MacOS Permite simular una arquitectura MIPS ARCOS Estructura de Computadores 40

Tarea Instalar en el simulador SPIM que se va a utilizar en las prácticas. http://pages.cs.wisc.edu/~larus/spim.html Probar en el simulador pequeños programas en ensamblador ARCOS Estructura de Computadores 41

MIPS: Visión general ARCOS Estructura de Computadores 42

Arquitectura MIPS MIPS R2000/R3000 Procesador de 32 bits Tipo RISC CPU + coprocesadores auxiliares Coprocesador 0 excepciones, interrupciones y sistema de memoria virtual Coprocesador 1 FPU (Unidad de Punto Flotante) ARCOS Estructura de Computadores 43

Banco de registros 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Hay 32 registros 4 bytes de tamaño (una palabra) Se nombran con un $ al principio Convenio de uso Reservados Argumentos Resultados Temporales Punteros 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ARCOS Estructura de Computadores 44

Banco de registros 0 $zero 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Valor cableado a cero No puede modificarse 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ARCOS Estructura de Computadores 45

Banco de registros 0 $zero 1 2 Valores temporales 3 4 5 6 7 8 $t0 $t8 9 $t1 $t9 10 $t2 11 $t3 12 $t4 13 $t5 14 $t6 15 $t7 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ARCOS Estructura de Computadores 46

Banco de registros 0 $zero $s0 1 $s1 2 Valores guardados $s2 3 $s3 4 $s4 5 $s5 6 $s6 7 $s7 8 $t0 $t8 9 $t1 $t9 10 $t2 11 $t3 12 $t4 13 $t5 14 $t6 15 $t7 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ARCOS Estructura de Computadores 47

Banco de registros 0 $zero $s0 1 $s1 2 $v0 $s2 3 $v1 $s3 4 $a0 $s4 5 $a1 $s5 6 $a2 $s6 7 $a3 $s7 8 $t0 $t8 9 $t1 $t9 10 $t2 11 $t3 12 $t4 Paso de parámetros y 13 $t5 Gestión de subrutinas $sp 14 $t6 $fp 15 $t7 $ra 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ARCOS Estructura de Computadores 48

Banco de registros 0 $zero $s0 1 $at $s1 2 $v0 $s2 3 $v1 $s3 4 $a0 $s4 5 $a1 $s5 6 $a2 $s6 7 $a3 $s7 8 $t0 $t8 9 $t1 $t9 10 $t2 $k0 11 $t3 $k1 12 $t4 Otros $gp 13 $t5 $sp 14 $t6 $fp 15 $t7 $ra 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ARCOS Estructura de Computadores 49

Distribución de la memoria Hay 4 GB de memoria direccionables en total Parte de esa memoria la utilizan los distintos segmentos de un proceso Otra parte de la memoria está reservada: Un mini-sistema operativo reside en los primeros 4 MB de memoria ARCOS Estructura de Computadores 50

Distribución de la memoria de un programa ARCOS Estructura de Computadores 51

Mapa de memoria de un programa Segmento de Pila Segmento de Datos Segmento de Texto $fp 01011001 $sp 01011001 $gp 01011001 pc 01011001 El programa de usuario se divide en segmentos Segmento de pila Variables locales Contexto de funciones Segmento de datos Datos estáticos Segmento de código (texto) Código ARCOS Estructura de Computadores 52

Estructura de un programa ARCOS Estructura de Computadores 53

Simulador SPIM Banco de registros $0, $1, $2, $f0, $f1, Segmento de código Segmento de datos Segmento de pila Otros ARCOS Estructura de Computadores 54

Ejemplo: Hola mundo.data msg_hola:.asciiz "hola mundo\n" hola.s.text.globl main main: # printf("hola mundo\n") ; li $v0 4 la $a0 msg_hola syscall ARCOS Estructura de Computadores 55

Ejemplo: Hola mundo # comentario hasta fin de la línea etiqueta: instrucción/pseudoinstrucción.directiva operandos.data msg_hola:.asciiz "hola mundo\n" hola.s.text.globl main main: # printf("hola mundo\n") ; li $v0 4 la $a0 msg_hola syscall ARCOS Estructura de Computadores 56

Ejemplo: Hola mundo.data msg_hola:.asciiz "hola mundo\n" hola.s.text.globl main main: # printf("hola mundo\n") ; li $v0 4 #código de llamada la $a0 msg_hola syscall ARCOS Estructura de Computadores 57

Programa en ensamblador: directivas de preproceso.data.text Directivas Uso Siguientes elementos van al segmento de dato Siguientes elementos van al segmento de código.ascii tira de caracteres.asciiz tira de caracteres.byte 1, 2, 3.half 300, 301, 302.word 800000, 800001.float 1.23, 2.13.double 3.0e21 Almacena cadena caracteres NO terminada en carácter nulo Almacena cadena caracteres terminada en carácter nulo Almacena bytes en memoria consecutivamente Almacena medias palabras en memoria consecutivamente Almacena palabras en memoria consecutivamente Almacena float en memoria consecutivamente Almacena double en memoria consecutivamente.space 10 Reserva un espacio de 10 bytes en el segmento actual.extern etiqueta n.globl etiqueta.align n Declara que etiqueta es global de tamaño n Declara etiqueta como global Alinea el siguiente dato en un límite de 2^n ARCOS Estructura de Computadores 58

Definición de datos estáticos ARCOS Estructura de Computadores 59

Llamadas al sistema El simulador incluye un pequeño sistema operativo. Ofrece 17 servicios. Invocación: Código de servicio en $v0. Otros parámetros en registros concretos. Invocación mediante instrucción syscall. ARCOS Estructura de Computadores 60

Llamadas al sistema Servicio Código de llamada ($v0) Argumentos print_int 1 $a0 = integer print_float 2 $f12 = float print_double 3 $f12 = double print_string 4 $a0 = string Resultado read_int 5 integer en $v0 read_float 6 float en $f0 read_double 7 double en $f0 read_string 8 $a0=buffer, $a1=longitud sbrk 9 $a0=cantidad dirección en $v0 exit 10 ARCOS Estructura de Computadores 61

Llamadas al sistema Servicio Código de llamada ($v0) Argumentos print_char 11 $a0 (código ASCII) Resultado read_char 12 $v0 (código ASCII) open 13 Equivalente a $v0 = open($a0, $a1, $a2) read 14 Equivalente a $v0 = read ($a0, $a1, $a2) write 15 Equivalente a $v0 = write($a0, $a1, $a2) close 16 Equivalente a $v0 = close($a0) exit2 17 Termina el programa y hace que spim devuelva el código de error almacenado en $a0 ARCOS Estructura de Computadores 62

Ejemplo ARCOS Estructura de Computadores 63

Ejemplo ARCOS Estructura de Computadores 64

Modelo de memoria. Direccionamiento por bytes Los computadores actuales direccionan la memoria por bytes. Un computador con direcciones de n bits puede direccionar 2 n bytes Un computador con direcciones de 32 bits (MIPS 32) puede direccionar 2 32 bytes de memoria= 4 GB Las direcciones que genera un computador se refieren a bytes ARCOS Estructura de Computadores 65

Espacio de direcciones. Direccionamiento por bytes Direcciones de bytes Byte (contenido) 0 1 2 3 4 5 6 00001101 Dirección: 6 (000110) Contenido: 00001101 (9) 2 n -1 ARCOS Estructura de Computadores 66

Espacio de direcciones. Direccionamiento por bytes Direcciones de bytes Byte (contenido) 0x0F000000 0x0F000001 0x0F000002 00001101 0x0F000003 Dirección: 0x0F000002 Contenido: 00001101 (9) ARCOS Estructura de Computadores 67

Espacio de direcciones Direcciones de bytes 0 1 2 3 4 5 6 00001101 Byte (contenido) Por razones de velocidad, las memorias principales suelen tener un ancho de palabra de 32 o 64 bits El acceso a la memoria se realiza por palabras El mapa de memoria y la construcción de la memoria son diferentes.? 2 n -1 ARCOS Estructura de Computadores 68

Espacio de direcciones y memoria física Lógicamente Físicamente Direcciones de bytes Byte (contenido) Direcciones de palabras Palabra de 32 bits (contenido) 0 7 1 8 2 4 3 3 4 5 6 0 7 8 4 3 4 8 12 16 byte 0 byte 1 byte 2 byte 3 2 n -4 2 n -1 Un computador de 32 bits que direcciona la memoria por bytes tiene un espacio de direcciones de 3 32 bytes y 2 30 palabras ARCOS Estructura de Computadores 69

Acceso a memoria Para un computador de 32 bits con direccionamiento por bytes: La palabra tiene 32 bits (cuatro bytes) Se pueden direccionar 2 32 bytes La memoria está formada por 2 30 palabras Existen instrucciones que permite acceder a: Bytes almacenados en una dirección: A 31 A 0 Palabras almacenadas a partir de una dirección: A 31 A 0 El acceso físico a la memoria se realiza a una palabra completa con la dirección: A 31 A 2 Un byte situado en la dirección A 31 A 0 se encuentra En la palabra de memoria A 31 A 2 En el byte A 1 A 0 dentro de la palabra ARCOS Estructura de Computadores 70

Espacio de direcciones y acceso a bytes Direcciones de bytes Byte (contenido) lb $t1, 0x6 0 1 2 3 4 5 6 00001101 Dirección: 6 (000110) Contenido: 00001101 (9) $t1 31 24 23 16 15 8 7 0 2 n -1 ARCOS Estructura de Computadores 71

Espacio de direcciones y acceso a bytes Direcciones de bytes Byte (contenido) lb $t1, 0x6 0 1 2 3 4 5 6 00001101 Dirección: 6 (000110) Contenido: 00001101 (9) $t1 00000000 00000000 00000000 00001101 31 24 23 16 15 8 7 0 2 n -1 ARCOS Estructura de Computadores 72

Espacio de direcciones y acceso a bytes Direcciones de bytes Byte (contenido) lb $t1, 0x6 0 1 2 3 4 5 6 11111101 Dirección: 6 (000110) Contenido: 11111101 (-3 en complemento a 2) $t1 31 24 23 16 15 8 7 0 2 n -1 ARCOS Estructura de Computadores 73

Espacio de direcciones y acceso a bytes Direcciones de bytes Byte (contenido) lb $t1, 0x6 0 1 2 3 4 5 6 11111101 Dirección: 6 (000110) Contenido: 11111101 (-3 en complemento a 2) $t1 11111111 11111111 11111111 11111101 31 24 23 16 15 8 7 0 2 n -1 ARCOS Estructura de Computadores 74

Espacio de direcciones y acceso a bytes Direcciones de bytes Byte (contenido) lbu $t1, 0x6 0 1 2 3 4 5 6 11111101 Dirección: 6 (000110) Contenido: 11111101 (-3 en complemento a 2) $t1 31 24 23 16 15 8 7 0 2 n -1 ARCOS Estructura de Computadores 75

Espacio de direcciones y acceso a bytes Direcciones de bytes Byte (contenido) lbu $t1, 0x6 0 1 2 3 4 5 6 11111101 Dirección: 6 (000110) Contenido: 11111101 (-3 en complemento a 2) $t1 00000000 00000000 0000000 11111101 31 24 23 16 15 8 7 0 2 n -1 ARCOS Estructura de Computadores 76

Espacio de direcciones y acceso a físico a bytes Lógicamente Byte lbu $t1, 0x5 Físicamente Palabra de 32 bits 0 7 1 8 2 4 3 3 4 5 5 3 6 2 7 7 0 7 8 4 3 4 5 3 2 7 8 12 16 byte 0 byte 1 byte 2 byte 3 $t1 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 77

Espacio de direcciones y acceso a físico a bytes Lógicamente Byte lbu $t1, 0x5 Físicamente Palabra de 32 bits 0x5 0 7 1 8 2 4 3 3 4 5 5 3 6 2 7 7 0 7 8 4 3 4 5 3 2 7 8 12 16 byte 0 byte 1 byte 2 byte 3 Para acceder al byte de la dirección 0x5 = 00000.000101 $t1 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 78

Espacio de direcciones y acceso a físico a bytes Lógicamente Byte lbu $t1, 0x5 Físicamente Palabra de 32 bits 0x5 0 7 1 8 2 4 3 3 4 5 5 3 6 2 7 7 0 7 8 4 3 4 5 3 2 7 8 12 16 byte 0 byte 1 byte 2 byte 3 Se transfiere la segunda palabra: 00000.000101 30 $t1 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 79

Espacio de direcciones y acceso a físico a bytes Lógicamente Byte lbu $t1, 0x5 Físicamente Palabra de 32 bits 0x5 0 7 1 8 2 4 3 3 4 5 5 3 6 2 7 7 0x1 0 7 8 4 3 4 5 3 2 7 8 16 byte 0 byte 1 byte 2 byte 3 Se transfiere al procesador 5 3 2 7 $t1 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 80

Espacio de direcciones y acceso a físico a bytes Lógicamente Byte lbu $t1, 0x5 Físicamente Palabra de 32 bits 0 7 1 8 2 4 3 3 4 5 5 3 6 2 7 7 0 7 8 4 3 4 5 3 2 7 8 12 16 byte 0 byte 1 byte 2 byte 3 $t1 5 3 2 7 Se copia el byte 01 (A1 A0) de la palabra 0 0 0 3 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 81

Almacenamiento de palabras en la memoria Direcciones de bytes Byte (contenido) 4 bytes forman una palabra 0 1 2 3 4 5 6 7 8 Palabra almacenada a partir del byte 0 Palabra almacenada a partir del byte 4 2 n -1 ARCOS Estructura de Computadores 82

Almacenamiento de palabras en la memoria Direcciones de bytes Byte (contenido) 0 1 2 3 4 5 6 7 8? Palabra de 32 bits byte0 byte1 byte2 byte3 31 24 23 16 15 8 7 0 + significativo - significativo 2 n -1 ARCOS Estructura de Computadores 83

Almacenamiento de palabras en la memoria Palabra de 32 bits byte0 byte1 byte2 byte3 31 24 23 16 15 8 7 0 + significativo - significativo A A+1 A+2 A+3 byte0 byte1 byte2 byte3 BigEndian A A+1 A+2 A+3 byte3 byte2 byte1 byte0 LittleEndian El número 27 (10 = 11011 (2 = 000000000000000000000000000011011 A A+1 A+2 A+3 00000000 00000000 00000000 00011011 BigEndian A A+1 A+2 A+3 00011011 00000000 00000000 00000000 LittleEndian ARCOS Estructura de Computadores 84

Espacio de direcciones y acceso a palabras Lógicamente lw $t1, 0x4 Byte 0 1 2 3 4 00000000 5 00000000 6 00000001 7 00001101 Dirección 4 (000110) Contenido: 00000000000000000000000100001101 (2 = 269 (10 Computador BigEndian $t1 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 85

Espacio de direcciones y acceso a físico a palabras Lógicamente Byte lw $t1, 0x4 Físicamente Palabra de 32 bits 0 1 2 3 4 00000000 5 00000000 6 00000001 7 00001101 0 4 00000000 00000000 00000001 00001101 8 12 16 byte 0 byte 1 byte 2 byte 3 $t1 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 86

Espacio de direcciones y acceso a físico a palabras Lógicamente Byte lw $t1, 0x4 Físicamente Palabra de 32 bits 0x4 0 1 2 3 4 00000000 5 00000000 6 00000001 7 00001101 0 4 00000000 00000000 00000001 00001101 8 12 byte 0 byte 1 byte 2 byte 3 Para acceder a la palabra de la dirección 0x4 = 00000.000100 $t1 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 87

Espacio de direcciones y acceso a físico a palabras Lógicamente Byte lw $t1, 0x4 Físicamente Palabra de 32 bits 0x4 0 1 2 3 4 00000000 5 00000000 6 00000001 7 00001101 0 4 00000000 00000000 00000001 00001101 8 12 byte 0 byte 1 byte 2 byte 3 Se transfiere al procesador 00000000 00000000 00000001 00001101 $t1 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 88

Espacio de direcciones y acceso a físico a palabras Lógicamente Byte lw $t1, 0x4 Físicamente Palabra de 32 bits 0 1 2 3 4 00000000 5 00000000 6 00000001 7 00001101 0 4 00000000 00000000 00000001 00001101 8 12 byte 0 byte 1 byte 2 byte 3 Se copia la palabra 00000000 00000000 00000001 00001101 $t1 00000000 00000000 00000001 00001101 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 89

Diferencias entre lw, lb, lbu, la Direcciones de bytes Byte (contenido) lw $t1, 0x0F000000 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 ARCOS Estructura de Computadores 90

Diferencias entre lw, lb, lbu, la Direcciones de bytes Byte (contenido) lw $t1, 0x0F000000 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 Se copia la palabra $t1 11001011 00010010 00001000 00000010 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 91

Diferencias entre lw, lb, lbu, la Direcciones de bytes Byte (contenido) lbu $t1, 0x0F000002 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 Se copia el byte $t1 00000000 00000000 00000000 00001000 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 92

Diferencias entre lw, lb, lbu, la Direcciones de bytes Byte (contenido) la $t1, 0x0F000000 Se copia la dirección, no el contenido 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 $t1 00001111 00000000 00000000 00000000 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 93

Ejemplo Direcciones Byte (contenido) de bytes li $t1, 18 li $t2, 24 0x0F000000 0x0F000001 0x0F000002 0x0F000003 0x0F000004 0x0F000005 0x0F000006 0x0F000007 ARCOS Estructura de Computadores 94

Ejemplo Direcciones Byte (contenido) de bytes li $t1, 18 li $t2, 24 0x0F000000 0x0F000001 0x0F000002 0x0F000003 0x0F000004 0x0F000005 0x0F000006 0x0F000007 $t1 00000000 00000000 00000000 00010010 31 24 23 16 15 8 7 0 $t2 00000000 00000000 00000000 00011000 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 95

Ejemplo Direcciones de bytes Byte (contenido) sw $t1, 0x0F000000 0x0F000000 00000000 0x0F000001 00000000 0x0F000002 00000000 0x0F000003 00010000 0x0F000004 0x0F000005 0x0F000006 0x0F000007 $t1 00000000 00000000 00000000 00010010 31 24 23 16 15 8 7 0 $t2 00000000 00000000 00000000 00011000 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 96

Ejemplo Direcciones de bytes Byte (contenido) sw $t1, 0x0F000000 sw $t2, 0x0F000004 0x0F000000 00000000 0x0F000001 00000000 0x0F000002 00000000 0x0F000003 00010000 0x0F000004 00000000 0x0F000005 00000000 0x0F000006 00000000 0x0F000007 00011000 $t1 00000000 00000000 00000000 00010010 31 24 23 16 15 8 7 0 $t2 00000000 00000000 00000000 00011000 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 97

Ejemplo Direcciones de bytes Byte (contenido) lw $t3, 0x0F000000 0x0F000000 00000000 0x0F000001 00000000 0x0F000002 00000000 0x0F000003 00010000 0x0F000004 00000000 0x0F000005 00000000 0x0F000006 00000000 0x0F000007 00011000 $t1 00000000 00000000 00000000 00010010 31 24 23 16 15 8 7 0 $t2 $t3 00000000 00000000 00000000 00011000 31 24 23 16 15 8 7 0 00000000 00000000 00000000 00010010 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 98

Datos no alineados Lógicamente Byte lw $t1, 0x05???? Físicamente Palabra de 32 bits 0 1 2 3 4 5 00000000 6 00000000 7 00000001 8 00001101 Palabra 0 4 00000000 00000000 00000001 12 00001101 16 20 byte 0 byte 1 byte 2 byte 3 La palabra que está almacenada a partir de la dirección 0x05 no está alineada porque se encuentra en dos palabras de memoria distintas ARCOS Estructura de Computadores 99

Alineación de datos dirección 0 4 8 12 16 20 24 31 23 15 7 0 Esta palabra está alineada, el resto no ARCOS Estructura de Computadores 100

Alineación de datos En general: Un dato que ocupa K bytes está alineado cuando la dirección D utilizada para accederlo cumple que: D mod K = 0 La alineación supone que: Los datos que ocupan 2 bytes se encuentran en direcciones pares Los datos que ocupan 4 bytes se encuentran en direcciones múltiplo de 4 Los datos que ocupan 8 bytes (double) se encuentran en direcciones múltiplo de 8 ARCOS Estructura de Computadores 101

Alineación de datos En general los computadores no permiten el acceso a datos no alineados Objetivo: minimizar el número de accesos a memoria El compilador se encarga de asignar a los datos las direcciones adecuadas Algunas arquitecturas como Intel permiten el acceso a datos no alineados El acceso a un dato no alineado implica varios accesos a memoria Palabra de 32 bits 0 4 00000000 00000000 00001110 8 00001101 16 20 byte 0 byte 1 byte 2 byte 3 ARCOS Estructura de Computadores 102

Resumen Un programa para poder ejecutarse debe estar cargado junto con sus datos en memoria Todas las instrucciones y los datos se almacenan en memoria, por tanto todo tiene una dirección de memoria Las instrucciones y los datos En un computador como el MIPS 32 (de 32 bits) Los registros son de 32 bits En la memoria se pueden almacenar bytes (8 bits) Instrucciones lb, lbu, sb, sbu En la memoria se pueden almacenar palabras (32 bits) Instrucciones lw, sw ARCOS Estructura de Computadores 103

Instrucciones y pseudoinstrucciones Una instrucción en ensamblador se corresponde con una instrucción máquina Ocupa 32 bits addi $t1, $t1, 2 Una pseudoinstrucción en ensamblador se corresponde con varias instrucciones máquina. li $t1, 0x00800010 No cabe en 32 bits, pero se puede utilizar como pseudoinstrucción. Es equivalente a: lui $t1, 0x0080 ori $t1, $t1, 0x0010 ARCOS Estructura de Computadores 104

Otro ejemplo de pseudoinstrucción La pseudoinstrucción move move reg2,reg1 Se convierte en: add reg2,$zero,reg1 ARCOS Estructura de Computadores 105

Otros usos de la instrucción lw, lb Direcciones de bytes Byte (contenido) 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 $t0 $t1 31 24 23 16 15 8 7 0 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 106

Otros usos de la instrucción lw, lb Direcciones de bytes Byte (contenido) la $t0, 0x0F000002 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 $t0 $t1 31 24 23 16 15 8 7 0 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 107

Otros usos de la instrucción lw, lb Direcciones de bytes Byte (contenido) la $t0, 0x0F000002 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 Se copia la dirección, no el contenido $t0 $t1 00001111 00000000 00000000 00000010 31 24 23 16 15 8 7 0 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 108

Otros usos de la instrucción lw, lb Direcciones de bytes Byte (contenido) lbu $t0, ($t1) 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 $t0 $t1 00001111 00000000 00000000 00000010 31 24 23 16 15 8 7 0 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 109

Otros usos de la instrucción lw, lb Direcciones de bytes Byte (contenido) lbu $t0, ($t1) 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 Se copia el byte almacenado en la dirección almacenada en $t0 $t0 $t1 00001111 00000000 00000000 00000010 31 24 23 16 15 8 7 0 00000000 00000000 00000000 00001000 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 110

Otros usos de la instrucción lw, lb Direcciones de bytes Byte (contenido) lw $t0, ($t1) 0x0F000000 0xCB 0x0F000001 0x12 0x0F000002 0x08 0x0F000003 0x02 Se copia la palabra almacenada en la dirección almacenada en $t0 $t0 $t1 00001111 00000000 00000000 00000000 31 24 23 16 15 8 7 0 11001011 00010010 00001000 00000010 31 24 23 16 15 8 7 0 ARCOS Estructura de Computadores 111

Otros usos de la instrucción lw, lb lbu $t0, 0x0F000002 Direccionamiento directo. Se carga en $t0 el byte almacenado en la posición de memoria 0x0F000002 lbu $t0, ($t1) Direccionamiento indirecto de registro. Se carga en $t0 el byte almacenado en la posición de memoria almacenada en $t1 lbu $t0, 80($t1) Direccionamiento relativo. Se carga en $t0 el byte almacenado en la posición de memoria que se obtiene de sumar el contenido de $t1 con 80 ARCOS Estructura de Computadores 112

Instrucciones de escritura en memoria sw $t0, 0x0F000000 Copia la palabra almacenada en $t0 en la dirección 0x0F000000 sb $t0, 0x0F000000 Copia la byte almacenada en $t0 en la dirección 0x0F000000 ARCOS Estructura de Computadores 113

Tipo de datos básicos enteros int resultado ; int op1 = 100 ; int op2 = -10 ;... main () { resultado = op1 + op2 ;... }.data resultado:.word 0 op1:.word 100 op2:.word -10....text.globl main main: lw $t1 op1 lw $t2 op2 add $t3 $t1 $t2 la $t4 resultado sw $t3 ($t4)... ARCOS Estructura de Computadores 114

Ejercicio Indique un fragmento de código en ensamblador con la misma funcionalidad que: int b; int a = 100 ; int c = 5 ; int d main () { } d = 80; b = -(a+b*c+a); Asumiendo que a, b, c y d son variables que residen en memoria ARCOS Estructura de Computadores 115

Tipo de datos básicos vectores.data.align 2 #siguiente dato alineado a 4 int vec[5] ;... vec:.space 20 #5 elem.*4 bytes main () { v[4] = 8; }.text main:....globl main la $t1 vec li $t2 8 sw $t2 16($t1) ARCOS Estructura de Computadores 116

Tipo de datos básicos vectores.data.align 2 #siguiente dato alineado a 4 int vec[5] ;... main () { v[4] = 8; } vec:.space 20 #5 elem.*4 bytes.text.globl main main: li $t0 16 la $t1 vec add $t3, $t1, $t0 li $t2 8 sw $t2, ($t3)... ARCOS Estructura de Computadores 117

Tipo de datos básicos vectores.data int vec[5] ;... main () { v[4] = 8; }.align 2 #siguiente dato alineado a 4 vec:.space 20 #5 elem.*4 bytes.text main:....globl main li $t2 8 li $t1 16 sw $t2 vec($t1) ARCOS Estructura de Computadores 118

Ejercicio Si V es un array de números enteros (int) V representa la dirección de inicio de vector En qué dirección se encuentra el elemento V[5]? Qué instrucción permite cargar en el registro $t0 el valor v[5]? ARCOS Estructura de Computadores 119

Tipo de datos básicos vectores.data.align 2 #siguiente dato alineado a 4 int vec[5] ; int mat[2][3] = {{11,12,13}, {21,22,23}};... main () { m[0][1] = m[0][0] + m[1][0] ;... } vec:.space 20 #5 elem.*4 bytes mat:.word 11, 12, 13.word 21, 22, 23....text.globl main main:... lw $t1 mat+0 lw $t2 mat+12 add $t3 $t1 $t2 sw $t3 mat+4 ARCOS Estructura de Computadores 120

Tipo de datos básicos string.data char c1 ; char c2= h ; char *ac1 = hola ;... main () { printf( %s,ac1) ;... } c1:.space 1 # 1 byte c2:.byte h ac1:.asciiz hola....text.globl main main: li $v0 4 la $a0 ac1 syscall... ARCOS Estructura de Computadores 121

Vectores y cadenas En general: lw $t0, 4($s3) # $t0 M[$s3+4] sw $t0, 4($s3) # M[$s3+4] $t0 ARCOS Estructura de Computadores 122

Ejercicio Escriba un programa en ensamblador equivalente a: int vec[100] ;... main () { int i = 0; for (i = 0; i < 100; i++) vec[i] = 5; } Asumiendo que en $a0 se encuentra almacenada la dirección del vector ARCOS Estructura de Computadores 123

Ejercicio Escriba un programa en ensamblador equivalente a: int vec[100] ;... main () { int i = 0; suma = 0; } for (i = 0; i < 100; i++) suma = suma + vec[i]; Asumiendo que en $a0 se encuentra almacenada la dirección del vector y que el resultado ha de almacenarse en $v0 ARCOS Estructura de Computadores 124

Ejercicio Escriba un programa que: Calcule la longitud de la cadena de caracteres: La dirección de la cadena se encuentra en $a0 El resultado se dejará en $v0 ARCOS Estructura de Computadores 125

Ejercicio Escriba un programa que: Indique el número de veces que aparece un carácter en una cadena de caracteres La dirección de la cadena se encuentra en $a0 El carácter a buscar se encuentra en $a1 El resultado se dejará en $v0 ARCOS Estructura de Computadores 126

Instrucciones de coma flotante Banco de registros de coma flotante (32 registros) $f0, $f1,.. $31 Para valores de simple precisión: $f0,.. $f31 Para valores de doble precisión (64 bits) se utilizan por parejas: $f0, $f2, $f4,. FPU $f1 $f0 $f3 $f2 $f31 $f30 B.R. ALU BUS ARCOS Estructura de Computadores 127

Operaciones en coma flotante Aritmética de coma flotante IEEE 754 en la FPU Ejemplos: Suma simple precisión add.s $f0 $f1 $f4 f0 = f1 + f4 Suma doble precisión add.d $f0 $f2 $f4 FPU $f1 $f0 $f3 $f2 $f31 $f30 (f0,f1) = (f2,f3) + (f4,f5) Otras operaciones en simple precisión: add.s, sub.s, mul.s, div.s, abs.s Operaciones en doble precisión: add.d, sub.d, mul.d, div.d, abs.d BUS ALU B.R. ARCOS Estructura de Computadores 128

Tipo de datos básicos float.data float resultado ; float op1 = 100 ; float op2 = -10 ;... resultado:.float op1:.float 100 op2:.float -10....text.globl main main () { resultado = op1 + op2 ;... } main: l.s $f0 op1 l.s $f1 op2 add.s $f3 $f1 $f2 s.s $f3 resultado... ARCOS Estructura de Computadores 129

Tipo de datos básicos double.data double resultado ; double op1 = 100 ; double op2 = -10.27 ;... resultado:.double op1:.double 100 op2:.double -10.27....text.globl main main () { resultado = op1 * op2 ;... } main: l.d $f0 op1 # ($f0,$f1) l.d $f2 op2 # ($f2,$f3) mul.d $f6 $f0 $f2 s.s $f6 resultado... ARCOS Estructura de Computadores 130

Operaciones con registros mtc1 $t0 $f1 CPU FPU t0 t1 B.R. enteros $f1 $f0 $f3 $f2 $f31 $f30 B.R. U.C ALU ALU BUS BUS ARCOS Estructura de Computadores 131

Operaciones con registros mfc1 $t0 $f1 CPU FPU t0 t1 B.R. enteros $f1 $f0 $f3 $f2 $f31 $f30 B.R. U.C ALU ALU BUS BUS ARCOS Estructura de Computadores 132

Operaciones de conversión cvt.s.w $f2 $f1 Convierte un entero ($f1) a simple precisión ($f2) cvt.w.s $f2 $f1 Convierte de simple precisión ($f1) a entero ($f2) cvt.d.w $f2 $f0 Convierte un entero ($f0) a doble precisión ($f2) cvt.w.d $f2 $f0 Convierte de doble precisión ($f0) a entero ($f2) cvt.d.s $f2 $f0 Convierte de simple precisión ($f0) a doble ($f2) cvt.s.d $f2 $f0 Convierte de doble precisión ($f0) a simple($f2) ARCOS Estructura de Computadores 133

Ejemplo float PI = 3,1415; int radio = 4; float longitud; longitud = PI * radio;.text main:.globl main li.s $f0 3.1415 li $t0 4 mtc1 $t0 $f1 # 4 en Ca2 cvt.s.w $f2 $f1 # 4 ieee754 mul.s $f0 $f2 $f1 ARCOS Estructura de Computadores 134

Ejemplo float PI = 3,1415; int radio = 4; float longitud; longitud = PI * radio;.text main:.globl main li.s $f0 3.1415 li $t0 4 CPU t0 t1 B.R. enteros FPU $f1 $f0 $f3 $f2 $f31 $f30 B.R. mtc1 $t0 $f1 # 4 en Ca2 cvt.s.w $f2 $f1 # 4 ieee754 mul.s $f0 $f2 $f1 U.C ALU ALU BUS BUS ARCOS Estructura de Computadores 135

Ejercicio Escriba un programa que: Cargue el valor 3.141516 en el registro $f0 Permita obtener el valor del exponente y de la mantisa almacenada en el registro $f0 (en formato IEEE 754) Exponente en el registro $v0 Mantisa en el registro $v1 ARCOS Estructura de Computadores 136

Contenido Fundamentos básicos de la programación en ensamblador Ensamblador del MIPS 32, modelo de memoria y representación de datos Formato de las instrucciones y modos de direccionamiento Llamadas a procedimientos y uso de la pila ARCOS Estructura de Computadores 137

Información de una instrucción El tamaño de la instrucción se ajusta al de palabra (o múltiplo) Se divide en campos: Operación a realizar Operandos a utilizar Puede haber operando implícitos El formato de una instrucción indica los campos y su tamaño: Uso de formato sistemático Tamaño de un campo limita los valores que codifica ARCOS Estructura de Computadores 138

Información de una instrucción Se utiliza unos pocos formatos: Una instrucción pertenecen a un formato Según el código de operación se conoce el formato asociado Ejemplo: formatos en MIPS Tipo R aritméticas Tipo I transferencia inmediato op. rs rt rd shamt func. 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits op. rs rt offset 6 bits 5 bits 5 bits 16 bits Tipo J saltos op. 6 bits offset 26 bits ARCOS Estructura de Computadores 139

Campos de una instrucción En los campos se codifica: Operación a realizar (código Op.) Instrucción y formato de la misma Operandos a utilizar Ubicación de los operandos Ubicación del resultado Ubicación de la siguiente instrucción (si op. salto) Implícito: PC PC + 4 (apuntar a la siguiente instrucción) Explícito: j 0x01004 (modifica el PC) ARCOS Estructura de Computadores 140

Ubicaciones posibles para los operandos En la propia instrucción En los registros del procesador En memoria principal En unidades de Entrada/Salida (I/O) ARCOS Estructura de Computadores 141

Modos de direccionamiento El modo de direccionamiento es un procedimiento que permite determinar la ubicación de un operando o una instrucción Tipos: Inmediato Directo De registro Indirecto Indirecto de registro Relativo A registro base A registro índice A contador de programa Implícito De pila ARCOS Estructura de Computadores 142

Direccionamiento inmediato El operando es parte de la instrucción. Ejemplo: li $a0 25 addi $t1 $t2 50 Es rápido: no es necesario acceder a memoria. No siembre cabe el valor en una palabra: li $t1, 0x00800010 No cabe en 32 bits, es equivalente a: lui $t1, 0x0080 ori $t1, $t1, 0x0010 ARCOS Estructura de Computadores 143

Direccionamiento de registro El operando se encuentra en el registro. Ejemplo: move $a0 $a1 Copia en el registro $a0 el valor que hay en el registro $a1. El identificador de $a0 y $a1 está en codificado la instrucción. op rs rt 16 bits Operando B.Reg. Ventajas: Acceso a registros es rápido El número de registros es pequeño => pocos bits para sucodificación, instrucciones más cortas ARCOS Estructura de Computadores 144

Direccionamiento directo El operando se encuentra en memoria, y la dirección está codificada en la instrucción. Ejemplo: lw $t1, 0xFFF03000 Carga en $t1 lo que hay en la posición de memoria 0xFFF03000 memoria Operando op rs rt 16 bits Problemas: Acceso a memoria es lento comparado con los registros Direcciones largas => instrucciones más largas ARCOS Estructura de Computadores 145

Direccionamiento indirecto de registro Se indica en la instrucción el registro que almacena la dirección del operando Ejemplo: lw $a0 ($a1) Carga en $a0 lo que hay en la dirección de memoria que almacenada en $a1. B.Reg. dirección memoria operando op rs rt 16 bits Ventajas: Instrucciones cortas ARCOS Estructura de Computadores 146

Direccionamiento indirecto a memoria Se indica en la instrucción la dirección de la dirección del operando (no disponible en el MIPS) Ejemplo: LD R1 [DIR] (IEEE 694) Carga en R1 lo que hay en la dirección de memoria que está almacenada en la dirección de memoria DIR. memoria operando dirección2 op direccion1 Problemas: Puede requerir varios accesos a memoria Es más lento ARCOS Estructura de Computadores 147

Direccionamiento relativo a registro base Ejemplo: lw $a0 12($t1) Carga en $a0 lo que hay en la posición de memoria dada por $t1 + 12 Instrucción Codop Registro R Desplazamiento Registros Memoria Dirección de memoria + Operando ARCOS Estructura de Computadores 148

Utilidad: acceso a vectores Se carga en el registro la dirección de inicio del vector int vec[5] ;... main () { v[4] = 8;.data.align 2 #siguiente dato alineado a 4 vec:.space 20 #5 elem.*4 bytes.text.globl main main:... la $t1 vec li $t2 8 sw $t2 16($t1) } ARCOS Estructura de Computadores 149

Direccionamiento relativo a registro índice Ejemplo: lw $a0 direccion($t1) Carga en $a0 lo que hay en la posición de memoria dada por $t1 + direccion $t1 representa un índice Instrucción Codop Registro R dirección Registros Memoria Índice/desplazamiento + Operando ARCOS Estructura de Computadores 150

Utilidad: acceso a vectores Se carga en el registro la dirección de inicio del vector int vec[5] ;... main () { v[3] = 8; v[4] = 8;.data.align 2 #siguiente dato alineado a 4 vec:.space 20 #5 elem.*4 bytes.text.globl main main: li $t1 12 li $t2 8 sw $t2 vec($t1) addi $t1 $t1 4 sw $t2 vec($t1)... } ARCOS Estructura de Computadores 151

Direccionamiento relativo a contador de programa Ejemplo: beqz $t1 etiqueta Si $t1 es 0, se actualiza el PC => PC = PC + etiqueta Etiqueta representa un desplazamiento Instrucción Codop desplazamiento PC + ARCOS Estructura de Computadores 152

Contador de programa en el MIPS 32 Los registros tienen 32 bits El contador de programa tiene 32 bits Las instrucciones ocupan 32 bits (una palabra) El contador de programa almacena la dirección donde se encuentra una instrucción La siguiente instrucción se encuentra 4 bytes después. Por tanto el contador de programa se actualiza: PC = PC + 4 Dirección: Instrucción: 0x00400000 or $2,$0,$0 0x00400004 slt $8,$0,$5 0x00400008 beq $8,$0,3 0x0040000c add $2,$2,$4 0x00400010 addi $5,$5,-1 0x00400014 j 0x100001 ARCOS Estructura de Computadores 153

Direccionamiento relativo a PC en el MIPS La instrucción beq en la instrucción: 6 5 5 CO rs rt $9,$0, etiqueta se codifica 16 Dato inmediato Etiqueta tiene que codificarse en el campo Dato inmediato Cómo se actualiza el PC si $9 == $0 y cuento vale fin cuando se genera código máquina? bucle: beq $t0,$1, fin add $t8,$t4,$4t4 addi $t0,$0,-1 j bucle fin: ARCOS Estructura de Computadores 154

Direccionamiento relativo a PC en el MIPS Si se cumple la condición PC = PC + (etiqueta* 4) Por tanto en: bucle: beq $t0,$1, fin add $t8,$t4,$4t4 addi $t0,$0,-1 j bucle fin: fin == 3 ARCOS Estructura de Computadores 155

Utilidad: desplazamientos en bucles fin representa la dirección donde se encuentra la instrucción move li $t0 8 li $t1 4 li $t2 1 li $t4 0 while: bge $t4 $t1 fin mul $t2 $t2 $t0 addi $t4 $t4 1 b while fin: move $t2 $t4 ARCOS Estructura de Computadores 156

Utilidad: desplazamientos en bucles li $t0 8 li $t1 4 li $t2 1 li $t4 0 while: bge $t4 $t1 fin mul $t2 $t2 $t0 addi $t4 $t4 1 b while fin: move $t2 $t4 Dirección 0x0000100 0x0000104 0x0000108 0x000010C 0x0000110 0x0000114 0x0000118 0x000011C 0x0000120 Contenido li $t0 8 li $t1 4 li $t2 1 li $t4 0 bge $t4 $t1 fin mul $t2 $t2 $t0 addi $t4 $t4 1 b while move $t2 $t4 ARCOS Estructura de Computadores 157

Utilidad: desplazamientos en bucles li $t0 8 li $t1 4 li $t2 1 li $t4 0 while: bge $t4 $t1 fin mul $t2 $t2 $t0 addi $t4 $t4 1 b while fin: move $t2 $t4 fin representa un desplazamiento respecto al PC actual => 3 PC = PC + 3 * 4 while representa un desplazamiento respecto al PC actual =>-5 PC = PC + (-5)*4 Dirección 0x0000100 0x0000104 0x0000108 0x000010C 0x0000110 0x0000114 0x0000118 0x000011C 0x0000120 Contenido li $t0 8 li $t1 4 li $t2 1 li $t4 0 bge $t4 $t1 fin mul $t2 $t2 $t0 addi $t4 $t4 1 b while move $t2 $t4 ARCOS Estructura de Computadores 158

Diferencia entre las instrucción b y j Instrucción j direccion op. 6 bits direccion 26 bits Dirección de salto => PC = direccion Instrucción b desplazamiento op. 6 bits 5 bits 5 bits desplazamiento 16 bits Dirección de salto => PC = PC + desplazamiento ARCOS Estructura de Computadores 159

Direccionamiento implícito El operando no está codificado en la instrucción, pero forma parte de esta. Ejemplo: beqz $a0 etiqueta1 Si registro $a0 es cero, salta a etiqueta. $a0 es un operando, $zero es el otro. op rs 16 bits Ventajas Es rápido: no es necesario acceder a memoria. Instrucciones más cortas ARCOS Estructura de Computadores 160

Direccionamiento de pila PUSH Reg Apila el contenido del registro (dato) cima $sp dato cima $sp crece hacia direcciones bajas ARCOS Estructura de Computadores 161

Direccionamiento de pila POP Reg Desapila el contenido del registro (dato) Copia dato en el registro Reg dato cima $sp dato cima $sp crece hacia direcciones bajas ARCOS Estructura de Computadores 162

Direccionamiento de pila 163 MIPS no dispone de instrucciones PUSH o POP. El registro puntero de pila ($sp) es visible al programador. Se va a asumir que el puntero de pila apunta al último elemento de la pila PUSH $t0 sub $sp, $sp, 4 sw $t0, ($sp) POP $t0 lw $t0, ($sp) add $sp, $sp, 4 ARCOS Estructura de Computadores 163

Ejemplos de tipos de direccionamiento la $t0 label inmediato El segundo operando de la instrucción es una dirección PERO no se accede a esta dirección, la propia dirección es el operando lw $t0 label directo a memoria El segundo operando de la instrucción es una dirección Hay que acceder a esta dirección para tener el valor con el que trabajar bne $t0 $t1 label relativo a registro PC El tercer operando de la instrucción representa un desplazamiento PERO no se accede a esta dirección, la propia dirección es PARTE del operando En el formato de esta instrucción, label se codifica como un número en complemento a dos que representa el desplazamiento (como palabras) relativo al registro PC ARCOS Estructura de Computadores 164

Modos de direccionamiento en el MIPS Direccionamientos: Inmediato valor De registro $r Directo dir Indirecto de registro ($r) Relativo a registro desplazamiento($r) Relativo a PC beq etiqueta Relativo a pila desplazamiento($sp) ARCOS Estructura de Computadores 165

Formato de instrucciones Una instrucción máquina es autocontenida e incluye: Código de operación Dirección de los operandos Dirección del resultado Dirección de la siguiente instrucción Tipos de representación de los operandos Una instrucción se divide en campos Ejemplo de campos en una instrucción del MIPS: op. rs rt rd shamt func. ARCOS Estructura de Computadores 166

Formato de instrucciones Una instrucción normalmente ocupa una palabra pero puede ocupar más en algunos computadores En el caso del MIPS todas las instrucciones ocupan una palabra Campo de código: Con n bits se pueden codificar 2 n instrucciones Si se quiere codificar más se utiliza un campo de extensión Ejemplo: en el MIPS las instrucciones aritméticas tienen como código de op = 0. La función concreta se codifica en el campo func. Tipo R aritméticas op. rs rt rd shamt func. ARCOS Estructura de Computadores 167

Formato de una instrucción 168 Especifica el significado de cada uno de los bits que forma la instrucción. Longitud del formato: Número de bits que componen la instrucción. La instrucción se divide en campos. Normalmente una arquitectura ofrece unos pocos formatos de instrucción. Simplicidad en el diseño de la unidad de control. Uso sistemático: Campos del mismo tipo siempre igual longitud. Selección mediante código de operación. Normalmente el primer campo. ARCOS Estructura de Computadores 168

Longitud de formato 169 Alternativas: Longitud única: Todas las instrucciones tienen la misma longitud de formato. MIPS32: 32 bits PowerPC: 32 bits Longitud variable: Distintas instrucciones tienen distinta longitud de formato. Cómo se sabe la longitud de la instrucción? Cod. Op. IA32 (Procesadores Intel): Número variable de bytes. ARCOS Estructura de Computadores 169

170 Ejemplo: Formato de las instrucciones del MIPS 6 5 5 5 5 6 CO rs rt rd sa func 6 26 add $t0, $t0, $t1 CO Dato inmediato 6 5 5 16 addi $t0, $t0, 1 CO rs rt Dato inmediato ARCOS Estructura de Computadores 170

Ejemplo de formato en el MIPS MIPS Instruction: add $8,$9,$10 Formato a utilizar: 6 5 5 5 5 6 CO rs rt rd sa func Representación decimal de cada campo: 0 9 10 8 0 32 Representación binaria de cada campo 000000 01001 01010 01000 00000 100000 ARCOS Estructura de Computadores 171

Ejemplo de formato en el MIPS MIPS Instruction: addi $21,$22,-50 Formato a utilizar: 6 5 5 CO rs rt 16 Dato inmediato Representación decimal de cada campo: 8 22 21-50 Representación binaria de cada campo 001000 10110 10101 1111111111001110 ARCOS Estructura de Computadores 172

Cómo utilizar addi con un valor de 32 bits? Qué ocurre si se utiliza desde el ensamblador? addi $t0,$t0, 0xABABCDCD El valor inmediato es de 32 bits. Esta instrucción no se puede codificar en una palabra de 32 bits. ARCOS Estructura de Computadores 173

Cómo utilizar addi con un valor de 32 bits? Qué ocurre si se utiliza desde el ensamblador? addi $t0,$t0, 0xABABCDCD El valor inmediato es de 32 bits. Esta instrucción no se puede codificar en una palabra de 32 bits. Solución Desde el ensamblador se puede utilizar, pero al final se traduce en: lui $at, 0xABAB ori $at, $at, 0xCDCD add $t0, $t0, $at El registro $at está reservado para el ensamblador por convenio ARCOS Estructura de Computadores 174

Pregunta 175 Cómo sabe la unidad de control el formato de la instrucción que está ejecutando? Cómo sabe la unidad de control el número de operandos de una instrucción? Cómo sabe la unidad de control el formato de cada operación? ARCOS Estructura de Computadores 175

Código de operación 176 Tamaño fijo: n bits 2 n códigos de operación. m códigos de operación log 2 m bits. Campos de extensión MIPS (instrucciones aritméticas-lógicas) Tipo R aritméticas op. rs rt rd shamt func. Tamaño variable: Instrucciones más frecuentes = Tamaños más cortos. ARCOS Estructura de Computadores 176

Ejemplo Sea un computador de 16 bits de tamaño de palabra, que incluye un repertorio con 60 instrucciones máquina y con un banco de registros que incluye 8 registros. Se pide: Indicar el formato de la instrucción ADDx R1 R2 R3, donde R1, R2 y R3 son registros. ARCOS Estructura de Computadores 177

Solución palabra -> 16 bits 60 instrucciones 8 registros (en BR) ADDx R1(reg.), R2(reg.), R3(reg.) Palabra de 16 bits define el tamaño de la instrucción 16 bits ARCOS Estructura de Computadores 178

Solución palabra -> 16 bits 60 instrucciones 8 registros (en BR) ADDx R1(reg.), R2(reg.), R3(reg.) Supongo un solo formato de instrucciones para todas Para 60 instrucciones necesito 6 bits (mínimo) 6 bits 16 bits Código de operación ARCOS Estructura de Computadores 179

Solución palabra -> 16 bits 60 instrucciones 8 registros (en BR) ADDx R1(reg.), R2(reg.), R3(reg.) Para 8 registros necesito 3 bits (mínimo) 16 bits 6 bits 3 bits 3 bits 3 bits Código de operación Operandos (3 registros) ARCOS Estructura de Computadores 180

Solución palabra -> 16 bits 60 instrucciones 8 registros (en BR) ADDx R1(reg.), R2(reg.), R3(reg.) Sobra 1 bit (16-6-3-3-3 = 1), usado de relleno 16 bits 6 bits 3 bits 3 bits 3 bits 1 bit Código de operación Operandos (3 registros) ARCOS Estructura de Computadores 181

Ejercicio Sea un computador de 16 bits, que direcciona la memoria por bytes y que incluye un repertorio con 60 instrucciones máquina. El banco de registros incluye 8 registros. Indicar el formato de la instrucción ADDV R1, R2, M, donde R1 y R2 son registros y M es una dirección de memoria. ARCOS Estructura de Computadores 182

Ejercicio Sea un computador de 32 bits, que direcciona la memoria por bytes. El computador incluye 64 instrucciones máquina y 128 registros. Considere la instrucción SWAPM dir1, dir2, que intercambia el contenido de las posiciones de memoria dir1 y dir2. Se pide: Indicar el espacio de memoria direccionable en este computador. Indicar el formato de la instrucción anterior. Especifique un fragmento de programa en ensamblador del MIPS 32 equivalente a la instrucción máquina anterior. Si se fuerza a que la instrucción quepa en una palabra, qué rango de direcciones se podría contemplar considerando que las direcciones se representan en binario puro. ARCOS Estructura de Computadores 183

CISC-RISC CISC: Complex Instruction Set Architecture. Muchas instrucciones. Complejidad variable. Diseño irregular. RISC: Reduced Instruction Set Code Instrucciones bastante simples. Número reducido de instrucciones. Instrucciones de tamaño fijo. Banco de registros grande. La mayoría de las instrucciones usan registros. Paso de parámetros a través del banco de registros. Arquitecturas segmentadas. ARCOS Estructura de Computadores 184

Modelos de ejecución 185 Una máquina tiene un modelo de ejecución asociado. Modelo de ejecución indica el número de direcciones y tipo de operandos que se pueden especificar en una instrucción. 0 direcciones Pila. 1 dirección Registro acumulador 2 direcciones Registros, Registro-Memoria, Memoria- Memoria. 3 direcciones Registros, Registro-Memoria, Memoria- Memoria ARCOS Estructura de Computadores 185

Modelo de 3 direcciones 186 Registros Los 3 operandos son registros. Requiere operaciones de carga/almacenamiento. ADD.R0,.R1,.R2 Memoria-Memoria Los 3 operandos son direcciones de memoria. ADD /DIR1, /DIR2, /DIR3 Registro-Memoria Híbrido. ADD.R0, /DIR1, /DIR2 ADD.R0,.R1, /DIR1 ARCOS Estructura de Computadores 186

Caso práctico 187 X = A + B * C /DA /DB /DC A B C Modelo de ejecución /DX X ARCOS Estructura de Computadores 187

3 direcciones: R-R 188 LOAD.R0, /DB LOAD.R1, /DC MUL.R0,.R0,.R1 LOAD.R2, /DA ADD.R0,.R0,.R2 STORE.R0, /DX 6 instrucciones 4 acceso a memoria de datos 10 accesos a registros ARCOS Estructura de Computadores 188

3 direcciones: M-M 189 MUL /DX, /DB, /DC ADD /DX, /DX, /DA 2 instrucciones 6 acceso a memoria de datos 0 accesos a registro ARCOS Estructura de Computadores 189

Modelo de 2 direcciones 190 Registros Los 2 operandos son registros. Requiere operaciones de carga/almacenamiento. ADD.R0,.R1 (R0 <- R0 + R1) Memoria-Memoria Los 2 operandos son direcciones de memoria. ADD /DIR1, /DIR2 (MP[DIR1] <- MP[DIR1] + MP[DIR2]) Registro-Memoria Híbrido. ADD.R0, /DIR1 (R0 <- R0 + MP[DIR1]) ARCOS Estructura de Computadores 190

2 direcciones: R-R 191 LOAD.R0, /DB LOAD.R1, /DC MUL.R0,.R1 LOAD.R3, /DA ADD.R0,.R3 STORE.R0, /DX 6 instrucciones 4 acceso a memoria de datos 8 accesos a registro ARCOS Estructura de Computadores 191

2 direcciones: M-M 192 MOVE /DX, /DB MUL /DX, /DC ADD /DX, /DA 3 instrucciones 6 acceso a memoria de datos 0 accesos a registro ARCOS Estructura de Computadores 192

2 direcciones: R-M 193 LOAD.R0, /DB MUL.R0, /DC ADD.R0, /DA STORE.R0, /DX 4 instrucciones 4 accesos a memoria de datos 4 accesos a registro ARCOS Estructura de Computadores 193

Modelo de 1 dirección 194 Todas las operaciones utilizan un operando implícito: Registro acumulador Ejemplo: ADD R1 -> AC <- AC + R1 Operaciones de carga y almacenamiento siempre sobre acumulador. Posibilidad de movimiento entre registro acumulador y otros registros ARCOS Estructura de Computadores 194

1 dirección 195 LOAD /DB MUL /DC ADD /DA STORE /DX 4 instrucciones 4 accesos a memoria de datos 0 accesos a registro ARCOS Estructura de Computadores 195

Modelo de 0 direcciones 196 Todas las operaciones referidas a la pila. Operandos en la cima de la pila. Al hacer la operación se retiran de la pila. Resultado se coloca en la cima de la pila. Dos operaciones especiales: PUSH POP ARCOS Estructura de Computadores 196

Operación sobre la pila 197 PUSH 5 PUSH 7 ADD POP /DX PUSH 5 PUSH 7 7 5 ADD 12 POP /DX ARCOS Estructura de Computadores 197

0 direcciones 198 PUSH /DB PUSH /DC MUL PUSH /DA ADD POP /DX 6 instrucciones 4 accesos a memoria de datos 10 accesos a memoria de pila ARCOS Estructura de Computadores 198

199 Recordatorio: Información de instrucción Información: Operación a realizar. Operandos. Resultado. Ubicación de siguiente instrucción. Parte de la información puede ser implícita. ARCOS Estructura de Computadores 199

Contenido Fundamentos básicos de la programación en ensamblador Ensamblador del MIPS 32, modelo de memoria y representación de datos Formato de las instrucciones y modos de direccionamiento Llamadas a procedimientos y uso de la pila ARCOS Estructura de Computadores 200

Lenguajes de alto nivel: Funciones 201 int main() { int z; z=factorial(x); print_int(z); } int factorial(int x) { int i; int r=1; for (i=1;i<=x;i++) { r*=i; } return r; } ARCOS Estructura de Computadores 201

Ensamblador: Subrutina 202 factorial: jal factorial jr $ra ARCOS Estructura de Computadores 202

Ensamblador: Lenguaje máquina 203 0x00401000 0x00001000 0x00001004 jal 0x00401000 jr $ra $ra = PC = 0x00001004 PC = 0x00401000 ARCOS Estructura de Computadores 203

Ensamblador: Lenguaje máquina 204 0x00401000 0x00001000 0x00001004 jal 0x00401000 jr $ra $ra = 0x00001004 ARCOS Estructura de Computadores 204

Ensamblador: Lenguaje máquina 205 0x00401000 0x00001000 0x00001004 jal 0x00401000 jr $ra PC = $ra = 0x00001004 $ra = 0x00001004 ARCOS Estructura de Computadores 205

Ensamblador: Lenguaje máquina 206 0x00401000 0x00001000 0x00001004 jal 0x00401000 jr $ra PC = $ra = 0x00001004 ARCOS Estructura de Computadores 206

jal/jr 207 Qué hace la instrucción jal? $ra $PC $PC Dirección de salto Qué hace la instrucción jr? $PC $ra ARCOS Estructura de Computadores 207

Llamadas anidadas 0x00401000 jal 0x000080000 0x00008000 0x00001000 0x00001004 jal 0x00401000 jr $ra jr $ra $ra = PC = 0x00001004 PC = 0x00401000 ARCOS Estructura de Computadores 208

Llamadas anidadas 0x00401000 0x00401020 0x00401024 jal 0x000080000 0x00008000 0x00001000 0x00001004 jal 0x00401000 jr $ra jr $ra $ra = PC = 0x00401024 PC = 0x00008000 ARCOS Estructura de Computadores 209

Llamadas anidadas 0x00401000 0x00001000 0x00001004 jal 0x00401000 0x00401020 0x00401024 jal 0x000080000 jr $ra 0x00008000 jr $ra PC = $ra = 0x00401024 ARCOS Estructura de Computadores 210

Llamadas anidadas 0x00401000 0x00401020 0x00401024 jal 0x000080000 0x00008000 0x00001000 0x00001004 jal 0x00401000 jr $ra jr $ra? PC = $ra = 0x00401024 ARCOS Estructura de Computadores 211

Llamadas anidadas 0x00401000 0x00001000 0x00001004 jal 0x00401000 0x00401020 0x00401024 jal 0x000080000 jr $ra? 0x00008000 jr $ra PC = $ra = 0x00401024 Se ha perdido la dirección de retorno ARCOS Estructura de Computadores 212

Dónde guardar la dirección de retorno? El computador dispone de dos elementos para almacenamiento Registros Memoria No se pueden utilizar los registros porque su número es limitado Se guarda en memoria principal En una zona del programa que se denomina pila ARCOS Estructura de Computadores 213

Ejecución de un programa Memoria Principal Sistema Operativo Disco instrucciones Programa en ejecucion datos pila Fichero ejecutable ARCOS Estructura de Computadores 214

Mapa de memoria de un proceso memoria Segmento de Texto Segmento de Datos Segmento de Pila pc 01011001 $sp 01011001 El programa de usuario se divide en segmentos Segmento de pila Variables locales Contexto de funciones Segmento de datos Datos estáticos, variables globales Segmento de código (texto) Código, instrucciones máquina ARCOS Estructura de Computadores 215

Pila PUSH Reg Apila el contenido del registro (dato) cima $sp dato cima $sp crece hacia direcciones bajas ARCOS Estructura de Computadores 216

Pila POP Reg Desapila el contenido del registro (dato) Copia dato en el registro Reg dato cima $sp dato cima $sp crece hacia direcciones bajas ARCOS Estructura de Computadores 217

Antes de empezar 218 MIPS no dispone de instrucciones PUSH o POP. El registro puntero de pila ($sp) es visible al programador. Se va a asumir que el puntero de pila apunta al último elemento de la pila PUSH $t0 subu $sp, $sp, 4 sw $t0, ($sp) POP $t0 lw $t0, ($sp) addu $sp, $sp, 4 ARCOS Estructura de Computadores 218

Pila uso de push y pop consecutivos push $a0 push $t1 push $t2 push $s2... pop $s2 pop $t2 pop $t1 pop $a0 ARCOS Estructura de Computadores 219

Pila uso de push y pop consecutivos push $a0 push $t1 push $t2 push $s2... sub $sp $sp 4 sw $a0 ($sp) sub $sp $sp 4 sw $t1 ($sp) sub $sp $sp 4 sw $t2 ($sp) sub $sp $sp 4 sw $s2 ($sp)... pop $s2 pop $t2 pop $t1 pop $a0 lw $s2 ($sp) add $sp $sp 4 lw $s2 ($sp) add $sp $sp 4 lw $s2 ($sp) add $sp $sp 4 lw $s2 ($sp) add $sp $sp 4 ARCOS Estructura de Computadores 220

Marco de pila uso de multiples push y pop agrupados push $a0 push $t1 push $t2 push $s2 sub $sp $sp 16 sw $a0 12($sp) sw $t1 8($sp) sw $t2 4($sp) sw $s2 ($sp)...... pop $s2 pop $t2 pop $t1 pop $a0 lw $s2 ($sp) lw $t2 4($sp) lw $t1 8($sp) lw $a0 12($sp) add $sp $sp 16 ARCOS Estructura de Computadores 221

222 Ejemplo (1) Se parte de un código en lenguaje de alto nivel int main() { int z; z=factorial(5); print_int(z);... } int factorial(int x) { int i; int r=1; for (i=1;i<=x;i++) { r*=i; } return r; } ARCOS Estructura de Computadores 222

223 Ejemplo (1) Pensar en el paso de parámetros Los parámetros se pasan en $a0, $a1, $a2 y $a3 Los resultados se recogen en $v0, $v1 Más adelante se verá con más detalle En la llamada z=factorial(5); Un parámetro de entrada: en $a0 Un resultado en $v0 ARCOS Estructura de Computadores 223

224 Ejemplo (2) Se pasa a ensamblador cada función El parámetro se pasa en $a0 El resultado se devuelve en $v0 int main() { int z; z=factorial(5); print_int(z);... } li $a0, 5 # argumento jal factorial # llamada move $a0, $v0 # resultado li $v0, 1 syscall # llamada para # imprimir un int... } # imprimir un int int factorial(int x) { int i; int r=1; for (i=1;i<=x;i++) { r*=i; } return r; } factorial: li $s1, 1 #s1 para r li $s0, 1 #s0 para i bucle: bgt $s0, $a0, fin mul $s1, $s1, $s0 addi $s0, $s0, 1 b bucle fin: move $v0, $s1 #resultado jr $ra ARCOS Estructura de Computadores 224

225 Ejemplo (3) Se analizan los registros que se modifican int factorial(int x) { int i; int r=1; for (i=1;i<=x;i++) { r*=i; } return r; } factorial: li $s1, 1 #s1 para r li $s0, 1 #s0 para i bucle: bgt $s0, $a0, fin mul $s1, $s1, $s0 addi $s0, $s0, 1 b bucle fin: move $v0, $s1 #resultado jr $ra La función factorial trabaja (modifica) con los registros $s0, $s1 Si estos registros se modifican dentro de la función, podría afectar a la función que realizó la llamada (la función main) Por tanto, la función factorial debe guardar el valor de estos registros en la pila al principio y restaurarlos al final ARCOS Estructura de Computadores 225

226 Ejemplo (4) Se guardan los registros en la pila int factorial(int x) { int i; int r=1; for (i=1;i<=x;i++) { r*=i; } return r; } No es necesario guardar $ra. La rutina factorial es terminal Se guarda en la pila $s0 y $s1 porque se modifican Si se hubiera utilizado $t0 y $t1 no habría hecho falta hacerlo factorial: sub $sp, $sp, 8 sw $s0, 4($sp) sw $s1, ($sp) li $s1, 1 #s1 para r li $s0, 1 #s0 para i bucle: bgt $s0, $a0, fin mul $s1, $s1, $s0 addi $s0, $s0, 1 b bucle fin: move $v0, $s1 #resultado lw $s1, ($sp) lw $s0, 4($sp) add $sp, $sp, 8 jr $ra ARCOS Estructura de Computadores 226

Ejemplo 2 227 int main() { int z; int f1 (int a, int b) { int r; } z=f1(5, 2); print_int(z); } r = a + a + f2(b); return r; int f2(int c) { int s; } s = c * c * c; return s; ARCOS Estructura de Computadores 227

Ejemplo 2. Invocación 228 int main() { int z; } z=f1(5, 2); print_int(z); li $a0, 5 # primer argumento li $a1, 2 # segundo argumento jal f1 # llamada move $a0, $v0 # resultado li $v0, 1 syscall # llamada para # imprimir un int Los parámetros se pasan en $a0 y $a1 El resultado se devuelve en $v0 ARCOS Estructura de Computadores 228

Ejemplo 2. Cuerpo de f1 229 int f1 (int a, int b) { int r; } r = a + a + f2(b); return r; f1: add $s0, $a0, $a0 move $a0, $a1 jal f2 add $v0, $s0, $v0 jr $ra int f2(int c) { int s; } s = c * c * c; return s; ARCOS Estructura de Computadores 229

230 Ejemplo 2. Se analizan los registros que se modifican en f1 int f1 (int a, int b) { int r; } r = a + a + f2(b); return r; int f2(int c) { int s; f1: add $s0, $a0, $a0 move $a0, $a1 jal f2 add $v0, $s0, $v0 jr $ra f1 modifica $s0, $a0 y $ra, por lo tanto se guardan en la pila El registro $ra se modifica en la instrucción jal f2 El registro $a0 se modifica al pasar el argumento a f2 } s = c * c * c; return s; ARCOS Estructura de Computadores 230

231 Ejemplo 2. Cuerpo de f1 guardando en la pila los registros que se modifican int f1 (int a, int b) { int r; } r = a + a + f2(b); return r; int f2(int c) { int s; } s = c * c * c; return s; f1: sub $sp, $sp, 12 sw $s0, 8($sp) sw $a0, 4($sp) sw $ra, ($sp) add $s0, $a0, $a0 move $a0, $a1 jal f2 add $v0, $s0, $v0 lw $ra, ($sp) lw $a0, 4($sp) lw $s0, 8($sp) add $sp, $sp, 12 jr $ra ARCOS Estructura de Computadores 231

Ejemplo 2. Cuerpo de f2 232 int f1 (int a, int b) { int r; } r = a + a + f2(b); return r; f2: mul $t0, $a0, $a0 int f2(int c) { int s; } s = c * c * c; return s; mul $t0, $t0, $a0 jr $ra La función f2 no modifica el registro $ra porque no llama a ninguna otra función El registro $t0 no es necesario guardarlo porque no se ha de preservar su valor ARCOS Estructura de Computadores 232

Marco de pila El marco de pila es el espacio de la pila en el que se almacenan: Los registros guardados por la función La dirección de retorno (en $ra) Variables locales ARCOS Estructura de Computadores 233

Convenio de paso de parámetros 234 Convenio que describe: Uso del banco de registros generales. Uso del banco de registros FPU. Uso de la pila. Afecta a código llamante y código llamado. Distintos compiladores usan distintos convenios. ABI Application Binary Interface. Aquí se usará el convenio o32 (MIPS). ARCOS Estructura de Computadores 234

Convención en el uso de los registros Registro Uso Preservar el valor $v0-$v1 Resultados No $a0..$a3 Argumentos Si $t0..$t9 Temporales No $s0..$s7 Salvados Si $sp Puntero de pila Si $fp Puntero marco de pila Si $ra Dirección de retorno si ARCOS Estructura de Computadores 235

Subrutinas paso a paso 236 Subrutina que hace la llamada Subrutina llamada Salvaguarda de registros que no quiera que modifique la subrutina llamada Paso de parámetros Llamada a subrutina Reserva del marco de pila Salvaguarda de registros Ejecución de subrutina Restauración de valores guardados Liberación de marco de pila Salida de subrutina Restauración de registros guardados ARCOS Estructura de Computadores 236

Tipos de subrutinas 237 Subrutina terminal. No invoca a ninguna otra subrutina. Subrutina no terminal. Invoca a alguna otra subrutina. Si la rutina es terminal se pueden ahorrar pasos ARCOS Estructura de Computadores 237

Salvaguarda de registros 238 Una subrutina puede modificar libremente los registros $t. Antes de invocar una subrutina se deben guardar los registros $t de los que se quiera preservar su valor. Registros $t pila ARCOS Estructura de Computadores 238

Paso de parámetros 239 Los primeros parámetros se pasan mediante registros $a0, $a1, $a2, $a3 $f12, $f14 (coma flotante) Resto de parámetros a través de pila En cualquiera caso hay que dejar hueco para los parámetros $a0, $a1, $a2 y $a3 en la pila Este espacio solamente se acaba usando si se acaba llamando a otra subrutina ARCOS Estructura de Computadores 239

Paso de 2 parámetros 240 Banco de registros Hueco para $a0 $a0 Parámetro 1 Hueco para $a1 $a1 Parámetro 2 Hueco para $a2 $a2 Parámetro 3 Hueco para $a3 $a3 Parámetro 4 Registros $t pila ARCOS Estructura de Computadores 240

Paso de 6 parámetros 241 Banco de registros Hueco para $a0 $a0 Hueco para $a1 $a1 Hueco para $a2 Hueco $a2 para $a3 $a3 Parámetro 5 Parámetro 6 Parámetro 1 Parámetro 2 Parámetro 3 Parámetro 4 Registros $t pila ARCOS Estructura de Computadores 241

Llamada a subrutina 242 Instrucción de salto and link jal etiqueta bal etiqueta bltzal $reg, etiqueta bgezal $reg, etiqueta jalr $reg jalr $reg, $reg ARCOS Estructura de Computadores 242

Reserva del marco de pila 243 El marco de pila es el espacio de la pila en el que se almacenan las: Los registros guardados por la función La dirección de retorno (en $ra) Variables locales Para reservar el marco de pila, restar su tamaño al puntero de pila. Debe ser múltiplo de 8 (por convenio) ARCOS Estructura de Computadores 243

Marco de pila 244 Marco de pila Registros guardados por la función Dirección de retorno Variables locales Parámetros $t pila ARCOS Estructura de Computadores 244

Salvaguarda de registros 245 La subrutina debe guardar en la pila. Los registros $s que vaya a modificar. El registro $ra en las subrutinas no terminales. ARCOS Estructura de Computadores 245

Ejecución de la subrutina 246 La subrutina deja los valores de retorno en: Normalmente los registros $v0 y $v1 Para coma flotante $f0 y $f2. Si hace falta más espacio se deja información en la pila. ARCOS Estructura de Computadores 246

Al final 247 Restauración de valores guardados Se restauran los valores que se guardaron Liberación del marco de pila. Se suma a $sp el tamaño del marco de pila Se vuelve a la subrutina llamante. jr $ra ARCOS Estructura de Computadores 247

Reglas 248 Sección de parámetros. Sección de registro de retorno. Sección de registros preservados. Sección de relleno. Sección de almacenamiento local. ARCOS Estructura de Computadores 248

Sección de parámetros 249 Solamente para subrutinas no terminales. Reglas: El tamaño debe permitir almacenar cualquier subrutina que se pueda llamar de la actual. Tamaño mínimo de 4 palabras. Los cuatro primero parámetros no se copian físicamente en la pila, pero hay que dejar el hueco. La subrutina invocada podría decidir preservar los registros $a en los huecos. ARCOS Estructura de Computadores 249

Ejemplo 250 int func(int x1, int x2, int x3, int x4, char c) {/*..*/} int main(int argc, char** argv) { int x,y=1,z=2,k=3,j=4; char c= a ; x=func(y,z,k,j,c); Sección parámetros: 5 palabras return 0; } ARCOS Estructura de Computadores 250

Sección de registro de retorno 251 Solamente para subrutinas no terminales. Sección de una palabra. Protocolo: Al entrar en la subrutina se guarda el registro $ra. Al salir de la subrutina se restaura el registro $ra. ARCOS Estructura de Computadores 251

Registros preservados 252 Se debe salvaguardar los registros $s y $a que se usen en la subrutina. Reglas: Una palabra por registro preservado. Los registros se preservan al entrar en la subrutina. Los registros se restauran al salir de la subrutina. Toda esta zona debe tener un tamaño múltiplo de doble palabra (múltiplo de 8 bytes). Puede incluir una sección de relleno. ARCOS Estructura de Computadores 252

Sección de almacenamiento local 253 Se usa para: Variables locales que necesiten almacenarse en memoria Reglas: El tamaño de la sección debe ser múltiplo de 8 bytes. Organización de la sección es responsabilidad de la subrutina. La sección solamente se usa por la subrutina. El acceso a las variables locales almacenadas en la pila se hace utilizando el registro $sp como registro base ARCOS Estructura de Computadores 253

Ejemplo 254 int main(int argc, char ** argv) { int z; z=factorial(5); $t0 print_int(z); return 0; } Sección de parámetros: 4 Sección de registro de retorno: 1 Sección registros preservados: 0 Sección de relleno: 0 Sección de almacenamiento local: 0 Prólogo # z=factorial(5) li $a0, 5 jal factorial move $a0, $v0 li $v0, 1 syscall Epílogo ARCOS Estructura de Computadores 254

Prólogo/Epílogo 255 Marco de pila: 4 huecos para parámetros $a. Registro de retorno. Tamaño del marco de pila: 24 bytes Qué salvar? Al menos $ra y $a0 ARCOS Estructura de Computadores 255

Prólogo/Epílogo 256 sub $sp, $sp, 24 sw $ra, 4($sp) sw $a0, 20($sp) Cuerpo lw $ra, 4($sp) lw $a0, 20($sp) add $sp, $sp, 24 Relleno $ra Hueco $a3 Hueco $a2 Hueco $a1 $a0 pila El puntero de pila apunta al último elemento de la pila $sp ARCOS Estructura de Computadores 256