Tema 2: Arquitectura del repertorio de instrucciones Visión del

Anuncio
Tema 2: Arquitectura del repertorio de instrucciones
Visión del computador que tiene el programador en bajo nivel.
Lo que el programador en lenguaje ensamblador (bajo nivel) debe
conocer para escribir programas:
- Tipos y formatos de las instrucciones.
- Los registros del procesador.
- Los tipos de operandos.
- Los modos de direccionamiento.
(Última modificación el 05/03/07)
1
2. Arquitectura del repertorio de instrucciones (ISA)
2.1 Introducción (diseño del ISA; cómo es una instrucción)
2.2 Los registros (del procesador)
2.2 Tipos de instrucciones (qué operaciones)
2.3 Tipos de operandos
2.4 Modos de direccionamiento (especificación de los operandos)
2.5 Formato de las instrucciones (codificación binaria)
2.6 Resumen de la ISA de la MIPS
2
2.1 Introducción
Diseño del ISA
Es un nivel complicado de diseñar, ya que hay que tener en cuenta:
El software (LANs) que tiene que soportar.
La estructura del hardware que lo soportará.
Es la conexión entre ambos niveles: lenguaje que ambos tienen que
entender.
3
Es un punto de encuentro del diseñador de la estructura y el
programador a bajo nivel del computador (o el escritor del compilador):
- El diseñador de la estructura ve el nivel ISA como la
funcionalidad que ésta debe dar al programador.
- El programador se hace consciente de la estructura definida por el
diseñador: cómo usar los registros, qué operaciones tiene la ALU,
cómo accede a memoria y qué tipos de datos tiene.
Objetivo común de los diseñadores de computadores:
– Encontrar un lenguaje que haga fácil la construcción del
hardware y del software (el compilador).
– Maximizar el rendimiento y minimizar el coste.
4
Características de las instrucciones de bajo nivel
Los programas en este nivel se expresan en lenguaje ensamblador,
swap:muli $2, $5,4
add $2, $4,$2
lw $16, 4($2)
sw $16, 0($2)
jr $31
, y son traducidos a lenguaje máquina.
00000000101000010000000000011000
00000000100011100001100000100001
10001100011000100000000000000000
10101100011000100000000000000100
00000011111000000000000000001000
5
El lenguaje máquina, lo interpreta y ejecuta directamente el hardware
del computador:
Está formado por instrucciones simples: órdenes que el procesador
puede interpretar y ejecutar.
6
Una instrucción de bajo nivel debe contener toda la información
necesaria para ser ejecutada.
Tipos de instrucciones: una instrucción de este nivel especifica una
orden individual al procesador para:
(1) procesar datos, o
(2) controlar la secuencia de ejecución de las instrucciones.
(1) Una instrucción de este tipo debe especificar:
(i) El proceso de datos a realizar.
(ii) Los datos a procesar.
(2) Una instrucción de este tipo debe especificar:
(i) La dirección de la siguiente instrucción a ejecutar (destino del
salto).
(ii) La condición, si la hay, para el cambio de secuencia.
7
(1) Las instrucciones para procesar datos deben especificar el proceso
de datos a realizar y los datos a procesar:
(i) El proceso de datos es básico, el que puede llevar a cabo la
estructura del procesador:
(a) Una operación aritmética o lógica (de la ALU): suma, resta,
AND, OR, desplazamiento…
(b) Un movimiento de datos entre registros y/o memoria.
(ii) Los datos, estarán en registro o en memoria:
(a) Se denominan operandos: habrá que especificar los dos
operandos fuente (con los que se opera) y el destino (resultado
de la operación).
(b) Habrá que especificar la fuente y el destino del movimiento de
los datos.
8
Veamos una instrucción de cada tipo del procesador MIPS:
(1) Proceso de datos:
(i) Operación aritmética o lógica:
Suma
add rd, rs, rt
Poner la suma de los registros rs y rt en el registro rd.
AND
and rd, rs, rt
Poner el Y lógico de los registros rs y rt en el registro rd.
(ii) Movimiento de datos.
Carga palabra
lw rt, address
Carga la palabra (32 bits) en la dirección de memoria address en el
registro rt.
Almacena palabra
sw rt, address
Almacena la palabra en el registro rt en la dirección de memoria
address.
9
(2) Control de secuencia:
Bifurcación si igual
beq rs, rt, label
Salta condicionalmente a la instrucción especificada por label si el
registro rs es igual al registro rt.
Salto
j target
Salta incondicionalmente a la instrucción en target.
10
Sintaxis típica de una instrucción en lenguaje ensamblador
Ejemplo: Lenguaje ensamblador del procesador MIPS R2000/3000
4 campos básicos: etiqueta, nemónico de la instrucción, operandos (2
fuentes y 1 destino) y comentarios (opcional)
11
Fíjate que el número de operandos fuente de una instrucción
aritmética como la suma son dos.
Esto permite tener una ALU más sencilla.
Para evaluar expresiones aritméticas que aparecen en los lenguajes
de alto nivel (LAN) habrá que ejecutar varias instrucciones aritméticas
de bajo nivel.
Ejemplo: la sentencia de alto nivel a=b+c+d+e se implementa con la
secuencia de instrucciones de bajo nivel:
add a, b, c
add a, a, d
add a, a, e
Esto es un ejemplo de la diferencia de nivel de abstracción de un
LAN y un lenguaje ensamblador ó máquina (1 instrucción de alto nivel
equivale a 3 instrucciones de bajo nivel).
12
2.2 Los registros
Pequeña memoria rápida en el procesador para almacenamiento
temporal de información.
Su número y función varían entre los distintos diseños de
arquitecturas del repertorio de instrucciones.
Hoy en día, casi todas las arquitecturas son de registros de
propósito general: conjunto de registros manejables por el
programador, para contener operandos y especificar direcciones de
memoria.
Históricamente existieron otras arquitecturas con otro tipo de
almacenamiento temporal:
- De pila.
- De acumulador.
13
Tipos de arquitecturas del repertorio de instrucciones según el tipo de
almacenamiento temporal para los operandos:
Almacenamiento Ejemplos
temporal
1. Pila
HP 3000
2. Acumulador
PDP-8
Motorola 6809
3. Conjunto de
IBM 360
registros
DEC
VAX,MIPS
Operandos
explícitos
0
1
Operando
destino en …
Pila
Acumulador
2ó3
Registros o
memoria
Dónde están los operandos, en los distintos tipos de arquitectura:
- de pila: implícitamente en la cima de la pila (memoria).
- de acumulador: implícitamente uno de los fuente y el destino en el
registro acumulador y el otro fuente en memoria.
- de registros: en registros o posiciones de memoria (2 ó 3
operandos explícitos).
14
Las arquitecturas de registros dominan hoy día.
Ventajas:
- Los registros son fáciles de usar por el compilador, pueden ser
asociados con las variables, con lo que se consigue:
• una disminución del tiempo de ejecución: reducción del tráfico
con memoria (los registros son más rápidos).
• una mejor densidad de código: menos bits son necesarios para
especificar un registro que una dirección de memoria.
15
Veamos una
atendiendo a:
clasificación
de
las
arquitecturas
de
registros
(1) El número de operandos (2 ó 3) que se especifican
explícitamente las instrucciones aritmético-lógicas.
Si se especifican dos operandos, uno de ellos es fuente y destino.
(2) El número de operandos que pueden estar en memoria en las
instrucciones aritmético-lógicas (de 0 a 3).
16
Las posibles combinaciones de estas 2 características son:
Máximo número de
operandos
explícitos por
instrucción ALU (1)
2
3
2
Número de operandos
que pueden estar en
memoria por
instrucción ALU (2)
0
0
1
2
3
2
3
Ejemplos
IBM RT-PC
SPARC, MIPS
PDP-10, Motorola
68000, IBM 360
PDP-11
VAX
17
Registros del procesador
Son de dos tipos:
(1) Visibles al programador en lenguaje ensamblador: puede ser
utilizados explícitamente en una instrucción.
(2) De control y de estado, usados por:
(a) La unidad de control para controlar el funcionamiento de la
CPU: proceso de instrucciones y accesos a memoria.
(b) El SO para controlar la ejecución de los programas.
18
(1) Registros manejables por el programador:
Junto con la ALU forman el camino de datos.
Se utilizan para contener los operandos de las instrucciones máquina
o para especificar una dirección de memoria.
Pueden ser referenciados explícitamente en las instrucciones
máquina.
Por ejemplo en la MIPS se referencian por un número:
add $9, $17, $2 ó lw $16, 4($2)
19
Los compiladores pueden usarlos para asociarlos con variables y
disminuir el tráfico con memoria.
El ejemplo anterior (a=b+c+d+e)
add a, b, c
add a, a, d
add a, a, e
en realidad se implementa asociando las variables con registros:
a - $8, b - $9, c - $10, d - $11, e - $12,
de forma que el compilador generaría:
add $8, $t9, $10
add $8, $8, $11
add $8, $8, $12
20
Cuestiones de diseño de los registros manejables por el programador:
(a) Respecto al uso que le puede dar el programador:
(1) De propósito general: pueden contener datos y especificar
direcciones (MIPS).
(2) De datos: sólo pueden contener datos.
(3) De dirección: sólo para especificar direcciones (modos de
direccionamiento indirecto ó base+desplazamiento).
(b) Número de registros:
La experiencia dice que entre 8 – 32
Menos Æ no suficientes para contener variables Æ muchas
referencias a memoria.
Más Æ no reduce notablemente las referencias a memoria y aumenta
la longitud de las instrucciones (más número de bits para especificar
los registros).
21
(c) Tamaño de los registros:
Habrá que decidir si todos los registros tienen el mismo tamaño
(MIPS) o no.
(1) Los que han de contener direcciones, lo suficientemente largos
para contener direcciones completas.
(2) Los que han de contener datos, lo suficientemente largos para
contener la mayoría de los tipos de datos: una palabra (tamaño
habitual de los datos a procesar).
22
(2) Registros de control y estado del funcionamiento de la CPU:
En la mayoría de las máquinas, no son manejables por el
programador.
Algunos lo serán mediante instrucciones ejecutadas en modo
supervisor (control del SO).
(a) Registros de control:
(1) Contador de programa: contiene la dirección de la instrucción a
ejecutar.
(2) Registro de instrucción: contiene la instrucción a ejecutar.
(3) Registro de dirección de memoria: contiene la dirección de una
posición de memoria a ser leída o escrita.
(4) Registro de buffer de memoria: contiene la palabra de datos a
escribir en memoria o que ha sido leída.
23
En esta figura vemos los registros de control.
24
(b) Registro de estado (del programa en ejecución)
Contiene los códigos de condición y otra información de estado.
(i) Los códigos de condición (indicadores o ‘flags’) son valores
binarios (bits) que especifican si se ha producido una determinada
circunstancia en una operación ALU.
Pueden ser de signo, cero, acarreo, overflow…
Son utilizados implícitamente en las instrucciones de salto condicional.
(ii) Además de los códigos de condición la palabra de estado puede
contener bits para:
(1) Habilitación/deshabilitación de interrupciones.
(2) Modo supervisor/usuario (de funcionamiento de la CPU).
25
Ejemplos de organización de registros: 2 microprocesadores
contemporáneos (1978):Motorola MC68000, Intel 8086.
26
Motorola MC68000:
Registros de 32 bits: 8 de datos y 9 de dirección:
(1) Los de datos:
También se usan como registros índice (un modo de
direccionamiento).
Permiten operaciones con 8,16 y 32 bits según determine el código de
operación (MIPS).
(2) Los de direcciones:
A7 y A7’ punteros de pila para usuarios y para SO respectivamente.
(3) Contador de programa de 32 bits y registro de estado de 16.
Decisiones de diseño:
(1) Repertorio de instrucciones regular sin registros de uso especial.
(2) División en dos grupos, ahorro de 1 bit (compromiso razonable
entre generalidad total y código más compacto).
27
Intel 8086
Enfoque diferente en la organización de los registros: cada registro
tiene un uso particular aunque algunos pueden tener uso general.
4 registros de datos de 16 bits, direccionables también como bytes.
Uso general en algunas instrucciones e implícito en otras, p.e. la
multiplicación usa siempre el acumulador.
Registros de segmento uso dedicado e implícito, apuntan a los
segmentos de datos, código y pila (base + desplazamiento).
Los índice implícitos en algunas operaciones: contienen
desplazamientos dentro de cada segmento(base + desplazamiento).
Decisiones de diseño: codificación compacta Æ flexibilidad reducida.
28
Intel 80386
Microprocesador de 32 bits, diseñado como una ampliación del 8086
(16 bits).
Conserva la organización de registros original integrada en la nueva
organización Æ proporciona compatibilidad ascendente para los
programas del 8086.
Tuvieron que limitar la flexibilidad al diseñar la organización de los
registros.
El Pentium tiene la misma organización de registros que el 386.
29
Características del banco de registros del MIPS R2000
30
(1) Banco de registros de propósito general:
32 Registros de 32 bits (CPU).
Se identifican como $0 a $31. Ejemplo: add $2, $3, $4 ($2=$3+$4)
El registro $0 tiene permanentemente el valor 0.
(2) Dos registros especiales de 32 bits (CPU):
HI y LO: almacenan los resultados de multiplicaciones y divisiones.
(3) Banco de registros de reales (FPU)
32 registros de 32 bits que puede utilizarse como:
- 32 registros de 32 bits con formato IEEE 754 de simple
precisión. Se identifican por $f0, $f2, $f4, …, $f30.
- 16 registros de 64 bits con formato IEEE 754 de doble
precisión. Se identifican por $f0, $f2, $f4, …, $f30.
31
Convención en el uso de los registros en la MIPS.
Nombre
del
registro
zero
at
v0
v1
a0
a1
a2
a3
t0..t7
s0..s7
t8, t9
k0, k1
gp
sp
fp
ra
Número
Uso
0
1
2
3
4
5
6
7
8..15
16..23
24, 25
26, 27
28
29
30
31
Constante 0
Reservada para ensamblador
Para devolver resultados de funciones
“
Argumento 1 a una rutina
Argumento 2
“
Argumento 3
“
Argumento 4
“
Temporal (no se guarda valor entre llamadas)
Temporal (el valor se guarda entre llamadas)
Temporal (no se guarda valor entre llamadas)
Reservado para el kernel del sistema operativo
Puntero al área global (apunta al bloque de datos)
Puntero de pila
Puntero de marco de pila
Dirección de retorno, usado por llamadas a rutina
32
Esta es la visión de los registros de la MIPS que nos da el PCSpim.
33
Descargar