17.04.2015 Views

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

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

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

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Tema</strong> 2: <strong>Arquitectura</strong> <strong><strong>de</strong>l</strong> <strong>repertorio</strong> <strong>de</strong> <strong>instrucciones</strong><br />

<strong>Visión</strong> <strong><strong>de</strong>l</strong> computador que tiene el programador en bajo nivel<br />

Lo que el programador en lenguaje ensamblador <strong>de</strong>be conocer para<br />

escribir programas:<br />

- Los registros <strong><strong>de</strong>l</strong> procesador<br />

- Tipos <strong>de</strong> <strong>instrucciones</strong><br />

- Tipos <strong>de</strong> operandos<br />

- Modos <strong>de</strong> direccionamiento<br />

- Formato <strong>de</strong> las <strong>instrucciones</strong><br />

1<br />

2. <strong>Arquitectura</strong> <strong><strong>de</strong>l</strong> <strong>repertorio</strong> <strong>de</strong> <strong>instrucciones</strong> (ISA)<br />

2.1 Introducción (diseño <strong><strong>de</strong>l</strong> ISA; cómo es una instrucción)<br />

2.2 Los registros (<strong><strong>de</strong>l</strong> procesador)<br />

2.2 Tipos <strong>de</strong> <strong>instrucciones</strong> (qué operaciones)<br />

2.3 Tipos <strong>de</strong> operandos<br />

2.4 Modos <strong>de</strong> direccionamiento (especificación <strong>de</strong> los operandos)<br />

2.5 Formato <strong>de</strong> las <strong>instrucciones</strong> (codificación binaria)<br />

2.6 Resumen <strong>de</strong> la ISA <strong>de</strong> la MIPS<br />

2


2.1 Introducción<br />

Diseño <strong><strong>de</strong>l</strong> ISA<br />

Es un nivel complicado <strong>de</strong> diseñar<br />

Al hacerlo, hay que tener en cuenta:<br />

el software (compilador <strong>de</strong> LANs) que tiene que soportar<br />

la estructura <strong><strong>de</strong>l</strong> hardware que lo soportará<br />

Es la conexión entre ambos niveles: lenguaje que ambos tienen que<br />

enten<strong>de</strong>r<br />

3<br />

Es un punto <strong>de</strong> encuentro <strong>de</strong> el diseñador <strong>de</strong> la estructura y<br />

el programador a bajo nivel <strong><strong>de</strong>l</strong> computador (o el escritor <strong><strong>de</strong>l</strong><br />

compilador):<br />

- el diseñador <strong>de</strong> la estructura ve el nivel ISA como la<br />

funcionalidad que ésta <strong>de</strong>be dar al programador<br />

- el programador se hace consciente <strong>de</strong> la estructura <strong>de</strong>finida por el<br />

diseñador: cómo usa los registros, qué operaciones tiene la ALU,<br />

cómo acce<strong>de</strong> a memoria y qué tipos <strong>de</strong> datos tiene<br />

Objetivo común <strong>de</strong> los diseñadores <strong>de</strong> computadores:<br />

– encontrar un lenguaje que haga fácil la construcción <strong><strong>de</strong>l</strong><br />

hardware y <strong><strong>de</strong>l</strong> software (el compilador)<br />

– maximizar el rendimiento y minimizar el coste<br />

4


Cómo es una instrucción<br />

Los programas en este nivel se expresan en lenguaje ensamblador<br />

swap:muli $2, $5,4<br />

add $2, $4,$2<br />

lw $16, 4($2)<br />

sw $16, 0($2)<br />

jr $31<br />

El lenguaje ensamblador es ‘equivalente’ al lenguaje máquina<br />

00000000101000010000000000011000<br />

00000000100011100001100000100001<br />

10001100011000100000000000000000<br />

10101100011000100000000000000100<br />

00000011111000000000000000001000<br />

5<br />

El lenguaje máquina, lo interpreta y ejecuta directamente el hardware<br />

<strong><strong>de</strong>l</strong> computador<br />

Formado por <strong>instrucciones</strong> (máquina) simples<br />

Instrucción máquina = especifica una operación que <strong>de</strong>be realizar el<br />

procesador<br />

6


Una instrucción especifica tanto la operación a realizar como los<br />

operandos a utilizar en esta operación<br />

(1) Las operaciones son básicas (las que realiza la estructura <strong><strong>de</strong>l</strong><br />

computador):<br />

- aritmético-lógicas (<strong>de</strong> la ALU): suma, resta, AND, OR,<br />

<strong>de</strong>splazamientos<br />

- movimientos <strong>de</strong> datos entre registros y memoria<br />

(2) Los operandos: objetos con los que se opera (fuentes) y el<br />

resultado <strong>de</strong> la operación (<strong>de</strong>stino); estarán en registro o memoria<br />

7<br />

Sintaxis típica <strong>de</strong> una instrucción en lenguaje ensamblador<br />

Ejemplo: Lenguaje ensamblador <strong><strong>de</strong>l</strong> procesador MIPS R2000/3000<br />

4 campos básicos: etiqueta, nemónico <strong>de</strong> la instrucción, operandos (2<br />

fuentes y 1 <strong>de</strong>stino) y comentarios (opcional)<br />

8


Fíjate que el número <strong>de</strong> operandos fuente <strong>de</strong> una instrucción<br />

aritmética como la suma son dos<br />

Esto permite tener una ALU más sencilla<br />

Para evaluar expresiones aritméticas que aparecen en los lenguajes<br />

<strong>de</strong> alto nivel (LAN) habrá que ejecutar varias <strong>instrucciones</strong> aritméticas<br />

<strong>de</strong> bajo nivel<br />

Ejemplo: la sentencia <strong>de</strong> alto nivel a=b+c+d+e se implementa con la<br />

secuencia <strong>de</strong> <strong>instrucciones</strong> <strong>de</strong> bajo nivel:<br />

add a, b, c<br />

add a, a, d<br />

add a, a, e<br />

Esto es un ejemplo <strong>de</strong> la diferencia <strong>de</strong> nivel <strong>de</strong> abstracción <strong>de</strong> un LAN<br />

y un lenguaje ensamblador ó máquina (1 instrucción <strong>de</strong> alto nivel<br />

equivale a 3 <strong>de</strong> bajo)<br />

9<br />

2.2 Los registros<br />

Pequeña memoria rápida en el procesador para almacenamiento<br />

temporal <strong>de</strong> información<br />

Su número y función varían entre los distintos diseños <strong>de</strong><br />

arquitecturas <strong><strong>de</strong>l</strong> <strong>repertorio</strong> <strong>de</strong> <strong>instrucciones</strong><br />

Hoy en día, casi todas las arquitecturas son con registros <strong>de</strong><br />

propósito general: conjunto <strong>de</strong> registros manejables por el<br />

programador, para contener operandos y especificar direcciones <strong>de</strong><br />

memoria<br />

Este no es el único tipo <strong>de</strong> arquitectura veamos qué tipos <strong>de</strong><br />

arquitectura hay en función <strong>de</strong> cómo se pue<strong>de</strong>n especificar en una<br />

instrucción los operandos<br />

10


Tipos <strong>de</strong> arquitecturas <strong><strong>de</strong>l</strong> <strong>repertorio</strong> <strong>de</strong> <strong>instrucciones</strong><br />

Una primera clasificación (histórica) según el tipo <strong>de</strong><br />

almacenamiento temporal para los operandos<br />

Esto <strong>de</strong>termina el número <strong>de</strong> operandos explícitos por instrucción<br />

Almacenamiento Ejemplos Operandos Operando<br />

temporal<br />

explícitos <strong>de</strong>stino en …<br />

1. Pila HP 3000 0 Pila<br />

2. Acumulador PDP-8 1 Acumulador<br />

Motorola 6809<br />

3. Conjunto <strong>de</strong><br />

registros<br />

IBM 360<br />

DEC<br />

VAX,MIPS<br />

2 ó 3 Registros o<br />

memoria<br />

11<br />

Dón<strong>de</strong> están los operandos, en los distintos tipos <strong>de</strong> arquitectura:<br />

- arquitectura <strong>de</strong> pila: implícitamente en la cima <strong>de</strong> la pila (memoria)<br />

- arquitectura <strong>de</strong> acumulador: implícitamente uno <strong>de</strong> los fuente y el<br />

<strong>de</strong>stino en el registro acumulador y el otro fuente en memoria<br />

- arquitectura <strong>de</strong> registros: en registros o posiciones <strong>de</strong> memoria, 2<br />

ó 3 operandos explícitos<br />

Según el tipo <strong>de</strong> arquitectura <strong>de</strong> registros:<br />

i) se podrá hacer operaciones ALU con datos en memoria, ó<br />

ii) habrá que cargarlos en registros para operar con ellos (MIPS)<br />

12


Veamos como se traduciría la secuencia <strong>de</strong> código C = A + B para<br />

las 3 clases <strong>de</strong> arquitectura:<br />

(A, B y C son variables: los valores <strong>de</strong> A, B, C están en memoria y<br />

los valores <strong>de</strong> A y B no cambian)<br />

Pila Acumulador Registro<br />

PUSH A LOAD A LOAD R1, A<br />

PUSH B ADD B ADD R1, B<br />

ADD STORE C STORE C, R1<br />

POP C<br />

13<br />

(1) Pila<br />

Ventajas:<br />

- evaluación sencilla <strong>de</strong> expresiones (polaca inversa)<br />

- <strong>instrucciones</strong> cortas: como máximo se especifica un operando<br />

Inconveniente:<br />

- muchas transferencias con memoria<br />

(2) Acumulador<br />

Ventajas:<br />

- minimización <strong>de</strong> los estados internos <strong>de</strong> la máquina<br />

- <strong>instrucciones</strong> cortas: sólo se especifica un operando<br />

Inconveniente:<br />

- muchas (menos que las <strong>de</strong> pila) transferencias con memoria<br />

14


(3) Registros<br />

Las arquitecturas <strong>de</strong> registros dominan hoy día<br />

Ventajas:<br />

- Los registros son fáciles <strong>de</strong> usar por el compilador, pue<strong>de</strong>n ser<br />

asociados con las variables, con lo que se consigue:<br />

• una disminución <strong><strong>de</strong>l</strong> tiempo <strong>de</strong> ejecución: reducción <strong><strong>de</strong>l</strong> tráfico<br />

<strong>de</strong> memoria (los registros son más rápidos)<br />

• una mejor <strong>de</strong>nsidad <strong>de</strong> código: menos bits necesarios<br />

especificar un registro que una dirección <strong>de</strong> memoria<br />

15<br />

Veamos una clasificación <strong>de</strong> las arquitecturas <strong>de</strong> registros<br />

atendiendo a:<br />

(1) el número <strong>de</strong> operandos (2 ó 3) que se especifican<br />

explícitamente las <strong>instrucciones</strong> aritmético-lógicas<br />

Si se especifican dos operandos, uno <strong>de</strong> ellos es fuente y <strong>de</strong>stino<br />

(2) el número <strong>de</strong> operandos que pue<strong>de</strong>n estar en memoria en las<br />

<strong>instrucciones</strong> aritmético-lógicas (<strong>de</strong> 0 a 3)<br />

16


Las posibles combinaciones <strong>de</strong> estas 2 características son:<br />

Máximo número <strong>de</strong><br />

operandos<br />

explícitos por<br />

instrucción ALU (1)<br />

Número <strong>de</strong> operandos<br />

que pue<strong>de</strong>n estar en<br />

memoria por<br />

instrucción ALU (2)<br />

Ejemplos<br />

2 0 IBM RT-PC<br />

3 0 SPARC, MIPS<br />

2 1 PDP-10, Motorola<br />

68000, IBM 360<br />

2 2 PDP-11<br />

3 3 VAX<br />

17<br />

Los tres tipos más comunes <strong>de</strong> arquitecturas <strong>de</strong> registro atendiendo<br />

a estas dos características son:<br />

Tipo Ventajas Inconvenientes<br />

Registro-registro<br />

(3,0)<br />

Cargaalmacenamiento<br />

Codificación simple <strong>de</strong><br />

<strong>instrucciones</strong> <strong>de</strong><br />

longitud fija<br />

Necesarias más<br />

<strong>instrucciones</strong> que<br />

arquitecturas con<br />

Nºciclos/instrucción referencias a memoria<br />

similares<br />

Registro-<br />

Fácil codificación <strong>de</strong> Se <strong>de</strong>struye un operando<br />

memoria (2,1)<br />

Memoriamemoria<br />

(3,3)<br />

las <strong>instrucciones</strong><br />

No hay que cargar los<br />

datos en registros<br />

Variación en el tamaño <strong>de</strong><br />

las <strong>instrucciones</strong><br />

18


Registros <strong><strong>de</strong>l</strong> procesador<br />

Son <strong>de</strong> dos tipos:<br />

(1) visibles al programador en lenguaje ensamblador: pue<strong>de</strong> ser<br />

utilizados explícitamente en una instrucción<br />

(2) <strong>de</strong> control y <strong>de</strong> estado: usados por<br />

(a) la unidad <strong>de</strong> control para controlar el funcionamiento <strong>de</strong> la CPU:<br />

proceso <strong>de</strong> <strong>instrucciones</strong> y accesos a memoria<br />

(b) el SO para controlar la ejecución <strong>de</strong> los programas<br />

19<br />

(1) Registros manejables por el programador:<br />

Junto con la ALU forman el camino <strong>de</strong> datos<br />

Se utilizan para contener los operandos <strong>de</strong> las <strong>instrucciones</strong> máquina<br />

o para especificar una dirección <strong>de</strong> memoria<br />

Pue<strong>de</strong>n ser referenciados explícitamente en las <strong>instrucciones</strong> máquina<br />

Por ejemplo en la MIPS mediante un número:<br />

add $9, $17, $2 ó lw $16, 4($2)<br />

20


Los compiladores pue<strong>de</strong>n usarlos para asociarlos con variables y<br />

disminuir el tráfico con memoria<br />

El ejemplo anterior (a=b+c+d+e)<br />

add a, b, c<br />

add a, a, d<br />

add a, a, e<br />

en realidad se implementa asociando las variables con registros:<br />

a - $8, b - $9, c - $10, d - $11, e - $12,<br />

<strong>de</strong> forma que el compilador generaría:<br />

add $8, $t9, $10<br />

add $8, $8, $11<br />

add $8, $8, $12<br />

21<br />

Cuestiones <strong>de</strong> diseño <strong>de</strong> los registros manejables por el programador:<br />

(a) Respecto al uso que le pue<strong>de</strong> dar el programador:<br />

(1) <strong>de</strong> propósito general: pue<strong>de</strong>n contener datos y especificar<br />

direcciones (MIPS)<br />

(2) <strong>de</strong> datos: sólo pue<strong>de</strong>n contener datos<br />

(3) <strong>de</strong> dirección: sólo para especificar direcciones (modos <strong>de</strong><br />

direccionamiento indirecto ó base+<strong>de</strong>splazamiento)<br />

(b) Número <strong>de</strong> registros<br />

La experiencia dice que entre 8 – 32<br />

Menos no suficientes para contener variables muchas referencias<br />

a memoria<br />

Más no reduce notablemente las referencias a memoria y aumenta<br />

la longitud <strong>de</strong> las <strong>instrucciones</strong> (más número <strong>de</strong> bits para especificar<br />

los registros)<br />

22


(c) Tamaño <strong>de</strong> los registros<br />

Habrá que <strong>de</strong>cidir si todos los registros tienen el mismo tamaño<br />

(MIPS) o no<br />

(1) los que han <strong>de</strong> contener direcciones, lo suficientemente largo<br />

para contener direcciones completas<br />

(2) los que han <strong>de</strong> contener datos, lo suficientemente largos para<br />

contener la mayoría <strong>de</strong> los tipos <strong>de</strong> datos: una palabra<br />

A menudo es posible usar dos registros <strong>de</strong> datos contiguos<br />

como uno solo para contener valores <strong>de</strong> doble longitud<br />

(MIPS: los registros para punto flotante doble precisión)<br />

23<br />

(2) Registros <strong>de</strong> control y estado <strong><strong>de</strong>l</strong> funcionamiento <strong>de</strong> la CPU:<br />

En la mayoría <strong>de</strong> las máquinas, no manejables por el usuario<br />

Algunos serán manejables por <strong>instrucciones</strong> ejecutadas en modo<br />

supervisor (control <strong><strong>de</strong>l</strong> SO)<br />

(a) Registros <strong>de</strong> control<br />

(1) Contador <strong>de</strong> programa: contiene la dirección <strong>de</strong> la instrucción a<br />

ejecutar<br />

(2) Registro <strong>de</strong> instrucción: contiene la instrucción a ejecutar<br />

(3) Registro <strong>de</strong> dirección <strong>de</strong> memoria: contiene la dirección <strong>de</strong> una<br />

posición <strong>de</strong> memoria para ser leída o escrita<br />

(4) Registro <strong>de</strong> buffer <strong>de</strong> memoria: contiene la palabra <strong>de</strong> datos a<br />

escribir en memoria o que ha sido leída<br />

24


En esta figura vemos los registros <strong>de</strong> control<br />

25<br />

(b) Registro <strong>de</strong> estado (<strong><strong>de</strong>l</strong> programa en ejecución)<br />

Contiene los códigos <strong>de</strong> condición y otra información <strong>de</strong> estado<br />

(i) Los códigos <strong>de</strong> condición (indicadores o ‘flags’) son valores<br />

binarios (bits) que especifican si se ha producido una <strong>de</strong>terminada<br />

circunstancia en una operación ALU<br />

Pue<strong>de</strong>n ser <strong>de</strong> signo, cero, acarreo, overflow,…<br />

Son utilizados implícitamente en las <strong>instrucciones</strong> <strong>de</strong> salto condicional<br />

(ii) A<strong>de</strong>más <strong>de</strong> los códigos <strong>de</strong> condición la palabra <strong>de</strong> estado pue<strong>de</strong><br />

contener bits para:<br />

(1) habilitación/<strong>de</strong>shabilitación <strong>de</strong> interrupciones<br />

(2) modo supervisor/usuario (<strong>de</strong> funcionamiento <strong>de</strong> la CPU)<br />

26


Ejemplos <strong>de</strong> organización <strong>de</strong> registros: 2 microprocesadores<br />

contemporáneos (1978):Motorola MC68000, Intel 8086<br />

27<br />

Motorola MC68000:<br />

Registros <strong>de</strong> 32 bits: 8 <strong>de</strong> datos y 9 <strong>de</strong> dirección<br />

(1) Los <strong>de</strong> datos:<br />

También se usan como registros índice (un modo <strong>de</strong> direccionamiento)<br />

Permiten operaciones con 8,16 y 32 bits según <strong>de</strong>termine el código <strong>de</strong><br />

operación (MIPS)<br />

(2) Los <strong>de</strong> direcciones:<br />

A7 y A7’ punteros <strong>de</strong> pila para usuarios y para SO respectivamente<br />

(3) Contador <strong>de</strong> programa <strong>de</strong> 32 bits y registro <strong>de</strong> estado <strong>de</strong> 16<br />

Decisiones <strong>de</strong> diseño:<br />

(1) <strong>repertorio</strong> <strong>de</strong> <strong>instrucciones</strong> regular sin registros <strong>de</strong> uso especial<br />

(2) división en dos grupos, ahorro <strong>de</strong> 1 bit (compromiso razonable<br />

entre generalidad total y código más compacto)<br />

28


Intel 8086<br />

Enfoque diferente en la organización <strong>de</strong> los registros: cada registro<br />

tiene un uso particular aunque algunos pue<strong>de</strong>n tener uso general<br />

4 registros <strong>de</strong> datos <strong>de</strong> 16 bits, direccionables también como bytes<br />

Uso general en algunas <strong>instrucciones</strong> e implícito en otras, p.e. la<br />

multiplicación usa siempre el acumulador<br />

Registros <strong>de</strong> segmento uso <strong>de</strong>dicado e implícito, apuntan a los<br />

segmentos <strong>de</strong> datos, código y pila (base + <strong>de</strong>splazamiento)<br />

Los índice implícitos en algunas operaciones: contienen<br />

<strong>de</strong>splazamientos <strong>de</strong>ntro <strong>de</strong> cada segmento(base + <strong>de</strong>splazamiento)<br />

Decisiones <strong>de</strong> diseño: codificación compacta flexibilidad reducida<br />

29<br />

Intel 80386<br />

Microprocesador <strong>de</strong> 32 bits, diseñado como una ampliación <strong><strong>de</strong>l</strong> 8086<br />

(16 bits)<br />

Conserva la organización <strong>de</strong> registros original integrada en la nueva<br />

organización proporciona compatibilidad ascen<strong>de</strong>nte para los<br />

programas <strong><strong>de</strong>l</strong> 8086<br />

Tuvieron que limitar la flexibilidad al diseñar la organización <strong>de</strong> los<br />

registros<br />

El Pentium tiene la misma organización <strong>de</strong> registros que el 386<br />

30


Características <strong><strong>de</strong>l</strong> banco <strong>de</strong> registros <strong><strong>de</strong>l</strong> MIPS R2000<br />

31<br />

(1) Banco <strong>de</strong> registros <strong>de</strong> propósito general:<br />

32 Registros <strong>de</strong> 32 bits (CPU)<br />

Se i<strong>de</strong>ntifican como $0 a $31. Ejemplo: add $2, $3, $4 ($2=$3+$4)<br />

El registro $0 tiene permanentemente el valor 0<br />

(2) Dos registros especiales <strong>de</strong> 32 bits (CPU)<br />

HI y LO: almacenan los resultados <strong>de</strong> multiplicaciones y divisiones.<br />

(3) Banco <strong>de</strong> registros <strong>de</strong> reales (FPU)<br />

32 registros <strong>de</strong> 32 bits que pue<strong>de</strong> utilizarse como:<br />

- 32 registros <strong>de</strong> 32 bits con formato IEEE 754 <strong>de</strong> simple<br />

precisión. Se i<strong>de</strong>ntifican por $f0, $f2, $f4, …, $f30<br />

- 16 registros <strong>de</strong> 64 bits con formato IEEE 754 <strong>de</strong> doble<br />

precisión. Se i<strong>de</strong>ntifican por $f0, $f2, $f4, …, $f30<br />

32


Convención en el uso <strong>de</strong> los registros en la MIPS<br />

Nombre Número Uso<br />

<strong><strong>de</strong>l</strong><br />

registro<br />

zero 0 Constante 0<br />

at 1 Reservada para ensamblador<br />

v0 2 Para <strong>de</strong>volver resultados <strong>de</strong> funciones<br />

v1 3 “<br />

a0 4 Argumento 1 a una rutina<br />

a1 5 Argumento 2 “<br />

a2 6 Argumento 3 “<br />

a3 7 Argumento 4 “<br />

t0..t7 8..15 Temporal (no se guarda valor entre llamadas)<br />

s0..s7 16..23 Temporal (el valor se guarda entre llamadas)<br />

t8, t9 24, 25 Temporal (no se guarda valor entre llamadas)<br />

k0, k1 26, 27 Reservado para el kernel <strong><strong>de</strong>l</strong> sistema operativo<br />

gp 28 Puntero al área global (apunta al bloque <strong>de</strong> datos)<br />

sp 29 Puntero <strong>de</strong> pila<br />

fp 30 Puntero <strong>de</strong> marco <strong>de</strong> pila<br />

ra 31 Dirección <strong>de</strong> retorno, usado por llamadas a rutina<br />

33<br />

Esta es la visión <strong>de</strong> los registros <strong>de</strong> la MIPS que nos da el PCSpim<br />

34


2.2 Tipos <strong>de</strong> <strong>instrucciones</strong><br />

Las <strong>instrucciones</strong> soportadas por la mayoría <strong>de</strong> las arquitecturas<br />

pue<strong>de</strong>n clasificarse según la siguiente tabla:<br />

35<br />

(I) Aritméticas y lógicas<br />

Aritméticas<br />

En todas las máquinas<br />

La mayoría suma, resta, multiplicación y división<br />

Tipos <strong>de</strong> operandos:<br />

- todas con enteros con signo<br />

- algunas con enteros sin signo (MIPS)<br />

- a menudo con punto flotante (MIPS)<br />

- a veces para BCD<br />

Otras operaciones aritméticas posibles:<br />

- valor absoluto<br />

- cambio <strong>de</strong> signo<br />

- incremento y <strong>de</strong>cremento<br />

36


Lógicas<br />

En todas las máquinas<br />

Operaciones sobre datos lógicos: operaciones lógicas bit a bit<br />

Operaciones lógicas en la MIPS: AND, OR, NOR y XOR<br />

Ejemplo: sean los valores en registros:<br />

R1 = 10100101 y R2 = 00001111<br />

R1 AND R2 = 00000101<br />

A<strong>de</strong>más operaciones <strong>de</strong> <strong>de</strong>splazamiento (MIPS) y rotación:<br />

37<br />

38


Examples of ALU Instructions<br />

Instruction Meaning Machine<br />

MULF A, B, C<br />

multiply the32-bit floating point values at mem loc’ns.<br />

A and B, store at C<br />

VAX11<br />

nabs r3, r1 Store abs value of r1 in r3 PPC601<br />

ori $2, $1, 255 Store logical OR of reg $1 with 255 into reg $2<br />

MIPSR3000<br />

DEC R2<br />

SHL AX, 4<br />

Decrement the 16-bit value stored in reg R2<br />

DECPDP11<br />

Shift the16-bit value in reg AX left by 4 bit pos’ns.<br />

Intel8086<br />

39<br />

(II) Transferencia <strong>de</strong> datos<br />

Operación: copiar un dato <strong>de</strong> un sitio a otro<br />

Existe en todas las máquinas<br />

Debe especificar:<br />

- operandos fuente y <strong>de</strong>stino (en registro o memoria)<br />

- longitud datos a transferir<br />

Opción <strong>de</strong> diseño: dón<strong>de</strong> especifico el tamaño <strong><strong>de</strong>l</strong> dato:<br />

- en el código <strong>de</strong> operación (MIPS: lb ó lw)<br />

- en el operando (VAX)<br />

Operación muy sencilla en el caso registro-registro (no en la MIPS)<br />

Si es con memoria, habrá que calcular la dirección <strong><strong>de</strong>l</strong> dato y hacer el<br />

acceso a memoria (más lenta que los registros)<br />

40


Examples of Data Movement<br />

Instructions Instruction Meaning Machine<br />

MOV A, B<br />

LDA A, Addr<br />

lwz R3, A<br />

lw $3, addr<br />

mov R4, dout<br />

IN AL, KBD<br />

Move 16 bits from memory location A to Location B<br />

VAX11<br />

Load accumulator A with the byte at memory location<br />

Addr<br />

M6800<br />

Move 32-bit data from memory location A to register<br />

R3<br />

PPC601<br />

Load the 32-bit integer at memory location addr into<br />

register $3<br />

MIPS R3000<br />

Move 16-bit data from R4 to output port dout<br />

DEC PDP11<br />

Load a byte from in port KBD to accumulator<br />

Intel Pentium<br />

41<br />

(IV) Control (<strong>de</strong> flujo <strong>de</strong> ejecución)<br />

En las <strong>instrucciones</strong> vistas hasta ahora la instrucción que se ejecutará<br />

a continuación es la siguiente en memoria<br />

Las <strong>instrucciones</strong> <strong>de</strong> control cambian esta secuencia <strong>de</strong> ejecución<br />

(ruptura <strong>de</strong> secuencia)<br />

Para ello tendrán que especificar que instrucción se ejecutará a<br />

continuación<br />

La operación que realiza la CPU es actualizar el registro contador <strong>de</strong><br />

programa (PC) para que contenga la dirección en memoria <strong>de</strong> la<br />

próxima instrucción a ejecutar<br />

42


Tipos <strong>de</strong> rupturas <strong>de</strong> secuencia:<br />

(1) Bifurcaciones (branch): rupturas <strong>de</strong> secuencias condicionales<br />

La condición pue<strong>de</strong> ser el valor <strong>de</strong> un bit <strong>de</strong> estado, la comparación<br />

(con cero) <strong><strong>de</strong>l</strong> valor <strong>de</strong> un registro (MIPS) ó la comparación <strong>de</strong> los<br />

valores <strong>de</strong> 2 registros (MIPS)<br />

(2) Saltos (jump): rupturas <strong>de</strong> secuencia no condicionales<br />

(3) Llamadas y retornos <strong>de</strong> procedimientos: para ejecutar un<br />

procedimiento y retornar al programa principal<br />

43<br />

(V) Sistema<br />

En todas las máquinas<br />

Llamadas al sistema operativo (MIPS:syscall) para que realice<br />

algún servicio: entrada/salida, <strong>de</strong>tener la ejecución <strong><strong>de</strong>l</strong> programa,…<br />

(VI) Punto flotante<br />

en la MIPS<br />

44


Operaciones con reales<br />

En casi todas las máquinas<br />

La MIPS las tiene<br />

(VII) Decimal<br />

Para operar con datos BCD<br />

No las tiene<br />

(VIII) Ca<strong>de</strong>nas<br />

Para copiar o mover ca<strong>de</strong>nas <strong>de</strong> caracteres<br />

No las tiene<br />

45<br />

Veamos un resumen <strong><strong>de</strong>l</strong> <strong>repertorio</strong> <strong>de</strong> <strong>instrucciones</strong> <strong>de</strong> la MIPS:<br />

MIPS IV Instruction Set<br />

(1) Arithmetic and Logical Instructions<br />

(2) Constant-Manipulating Instructions<br />

(3) Comparison Instructions<br />

(4) Branch Instructions<br />

(5) Jump Instructions<br />

(6) Load Instructions<br />

(7) Store Instructions<br />

(8) Data Movement Instructions<br />

(9) Floating-Point Instructions<br />

(10) Exception and Interrupt Instructions<br />

46


(1) Arithmetic and Logical Instructions<br />

Addition (with overflow)<br />

add rd, rs, rt<br />

Put the sum of registers rs and rt into register rd<br />

Addition immediate (with overflow)<br />

addi rt, rs, imm<br />

Put the sum of register rs and the sign-exten<strong>de</strong>d immediate into<br />

register rt<br />

If the addition results in 32-bit 2’s complement arithmetic overflow then<br />

the <strong>de</strong>stination register is not modified and an Integer Overflow<br />

exception occurs<br />

47<br />

AND<br />

and rd, rs, rt<br />

Put the logical AND of registers rs and rt into register rd<br />

AND immediate<br />

andi rt, rs, imm<br />

Put the logical AND of register rs and the zero-exten<strong>de</strong>d immediate<br />

into register rt<br />

Divi<strong>de</strong><br />

div rs, rt<br />

Divi<strong>de</strong> register rs by register rt. Leave the quotient in register lo and the<br />

remain<strong>de</strong>r in register hi<br />

Multiply<br />

mult rs, rt<br />

Multiply registers rs and rt. Leave the low-or<strong>de</strong>r word of the product in<br />

register lo and the high-or<strong>de</strong>r word in register hi<br />

48


NOR<br />

nor rd, rs, rt<br />

Put the logical NOR of registers rs and rt into register rd<br />

OR<br />

or rd, rs, rt<br />

Put the logical OR of registers rs and rt into register rd<br />

OR immediate<br />

ori rt, rs, imm<br />

Put the logical OR of register rs and the zero-exten<strong>de</strong>d immediate into<br />

register rt<br />

49<br />

Shift left logical<br />

sll rd, rt, shamt<br />

Shift left logical variable<br />

sllv rd, rt, rs<br />

Shift right arithmetic<br />

sra rd, rt, shamt<br />

Shift right arithmetic variable<br />

srav rd, rt, rs<br />

Shift right logical<br />

srl rd, rt, shamt<br />

Shift right logical variable<br />

srlv rd, rt, rs<br />

Shift register rt left (right) by the distance indicated by immediate shamt<br />

or the register rs and put the result in register rd<br />

50


Subtract (with overflow)<br />

sub rd, rs, rt<br />

Put the difference of registers rs and rt into register rd.<br />

If the subtraction results in 32-bit 2’s complement arithmetic<br />

overflow then the <strong>de</strong>stination register is not modified and an Integer<br />

Overflow exception occurs<br />

Exclusive OR<br />

xor rd, rs, rt<br />

Put the logical XOR of registers rs and rt into register rd.<br />

XOR immediate<br />

xori rt, rs, imm<br />

Put the logical XOR of register rs and the zero-exten<strong>de</strong>d immediate<br />

into register rt<br />

51<br />

(2) Constant-Manipulating Instructions<br />

Load upper immediate<br />

lui rt, imm<br />

Load the lower halfword of the immediate imm into the upper halfword<br />

of register rt. The lower bits of the register are set to 0<br />

Cargar una palabra inmediata en un registro<br />

No hay una instrucción máquina para ello<br />

Se pue<strong>de</strong> hacer con un lui y un ori<br />

Por ejemplo lui $t0, 0x1234 # t0=0x12340000<br />

ori $t1, $t0, 0x5678<br />

# t1=0x12340000 OR 0x00005678<br />

cargaría la palabra 0x12345678 en el registro t1<br />

52


(3) Comparison Instructions<br />

Set less than<br />

slt rd, rs, rt<br />

Set register rd to 1 if register rs is less than rt, and to 0 otherwise<br />

Set less than immediate<br />

slti rt, rs, imm<br />

Set register rt to 1 if register rs is less than the sign-exten<strong>de</strong>d<br />

immediate, and to 0 otherwise<br />

53<br />

(4) Branch Instructions<br />

Branch on equal<br />

beq rs, rt, label<br />

Conditionally branch to instruction specified by label if register rs<br />

equals rt<br />

Branch on greater than equal zero<br />

bgez rs, label<br />

Conditionally branch to instruction specified by label if register rs is<br />

greater than or equal to 0<br />

Branch on greater than zero<br />

bgtz rs, label<br />

Conditionally branch to instruction specified by label if register rs is<br />

greater than 0<br />

54


Branch on less than equal zero<br />

blez rs, label<br />

Conditionally branch to instruction specified by label if register rs is<br />

less than or equal to 0<br />

Branch on less than zero<br />

bltz rs, label<br />

Conditionally branch to instruction specified by label if register rs is<br />

less than 0<br />

Branch on not equal<br />

bne rs, rt, label<br />

Conditionally branch to instruction specified by label if register rs is<br />

not equal to rt<br />

55<br />

(5) Jump instructions<br />

Jump<br />

j target<br />

Unconditionally jump to the instruction at target<br />

Jump and link<br />

jal target<br />

Unconditionally jump to the instruction at target; save the address of<br />

the next instruction in register $ra<br />

Jump register<br />

jr rs<br />

Unconditionally jump to the instruction whose address is in register rs<br />

56


(6) Load Instructions<br />

Load byte<br />

lb rt, address<br />

Load unsigned byte<br />

lbu rt, address<br />

Load the byte at address into register rt; the byte is<br />

sign-exten<strong>de</strong>d by lb, but not by lbu<br />

57<br />

Load halfword<br />

lh rt, address<br />

Load unsigned halfword<br />

lhu rt, address<br />

Load the 16-bit quantity (halfword) at address into register rt; the<br />

halfword is sign-exten<strong>de</strong>d by lh, but not by lhu<br />

Load word<br />

lw rt, address<br />

Load the 32-bit quantity (word) at address into register rt<br />

58


(7) Store Instructions<br />

Store byte<br />

sb rt, address<br />

Store the low byte from register rt at address<br />

Store halfword<br />

sh rt, address<br />

Store the low halfword from register rt at address<br />

Store word<br />

sw rt, address<br />

Store the word from register rt at address<br />

59<br />

(8) Data Movement Instructions<br />

Move from hi<br />

mfhi rd<br />

Move from lo<br />

mflo rd<br />

Move the hi (lo) register to register rd<br />

Move to hi<br />

mthi rs<br />

Move to lo<br />

mtlo rs<br />

Move register rs to the hi (lo) register<br />

Mover un registro a otro<br />

No existe una instrucción máquina para ello<br />

Se pue<strong>de</strong> hacer con un add rd, rs, $zero #rd=rs+0<br />

60


(9) Floating-Point Instructions<br />

No las veremos<br />

(10) Exception and Interrupt Instructions<br />

System call<br />

syscall<br />

Register $v0 contains the number of the system call (see Figure A.17)<br />

provi<strong>de</strong>d by SPIM<br />

61<br />

2.4. Tipos <strong>de</strong> operandos<br />

El tipo <strong>de</strong> un dato viene <strong>de</strong>terminado por la operación<br />

que se realice con él<br />

Categorías generales más importantes:<br />

(1) Direcciones<br />

(2) Números<br />

(3) Caracteres<br />

(4) Datos lógicos<br />

62


(1) Direcciones<br />

En las <strong>instrucciones</strong> <strong>de</strong> control <strong>de</strong> secuencia el operando es una<br />

dirección <strong>de</strong> memoria <strong>de</strong> la instrucción a la que se salta<br />

Pue<strong>de</strong>n consi<strong>de</strong>rarse como números enteros sin signo<br />

En la MIPS serán números <strong>de</strong> 32 bits<br />

63<br />

(2) Números<br />

Son usuales tres tipos <strong>de</strong> datos numéricos:<br />

(i) Enteros<br />

- con signo, representados en complemento a 2<br />

- sin signo<br />

Tamaños: byte, media palabra (half-word), palabra (word)<br />

(ii) Punto flotante<br />

IEEE 754: simple precisión (32 bits) y doble precisión (64 bits)<br />

(iii) Decimal<br />

En BCD (Decimal codificado en binario):<br />

- empaquetado: 2 dígitos <strong>de</strong>cimales por byte. Ejemplo: 01001001 -> 49<br />

- no empaquetado: 1 dígito/byte. Ejemplo: 00000100 00001001 -> 49<br />

MIPS no los tiene<br />

64


(3) Caracteres<br />

Códigos binarios para representar caracteres<br />

mediante secuencias <strong>de</strong> bits<br />

Estándares:<br />

- ASCII <strong>de</strong> 8 bits<br />

- EBCDIC <strong>de</strong> 8 bits (utilizado por los gran<strong>de</strong>s computadores IBM)<br />

MIPS no tiene <strong>instrucciones</strong> específicas para tratamiento <strong>de</strong><br />

caracteres<br />

(4) Datos lógicos<br />

Un objeto <strong>de</strong> n bits es consi<strong>de</strong>rado como n datos <strong>de</strong> 1 bit<br />

Utilizados en operaciones lógicas<br />

65<br />

Formatos numéricos <strong><strong>de</strong>l</strong> Pentium II<br />

66


2.4. Modos <strong>de</strong> direccionamiento<br />

Distintas formas que tiene la arquitectura para especificar los<br />

operandos<br />

Objetivos:<br />

- referenciar un rango elevado <strong>de</strong> posiciones <strong>de</strong> memoria principal<br />

(número <strong>de</strong> bits para el direccionamiento limitado)<br />

- dar soporte a las estructuras <strong>de</strong> datos <strong>de</strong> alto nivel<br />

Pue<strong>de</strong> ser:<br />

- para datos, sobre los que opera la instrucción<br />

- para <strong>instrucciones</strong>, especifica la dirección <strong>de</strong> la siguiente<br />

instrucción a ejecutar (en <strong>instrucciones</strong> <strong>de</strong> control)<br />

Veremos:<br />

- aspectos <strong><strong>de</strong>l</strong> almacenamiento <strong>de</strong> datos en memoria: alineación y<br />

or<strong>de</strong>n <strong>de</strong> los bytes<br />

- los distintos modos <strong>de</strong> direccionamiento<br />

67<br />

2.4.1. Necesida<strong>de</strong>s <strong>de</strong> direccionamiento<br />

Dón<strong>de</strong> pue<strong>de</strong> estar un operando:<br />

- en la propia instrucción<br />

- en un registro<br />

- en memoria<br />

68


A simple vista, lo lógico sería que en la propia instrucción se<br />

especificase el operando, su dirección en memoria o el registro que lo<br />

contiene<br />

No siempre lo más indicado por las siguientes razones:<br />

- ahorro <strong>de</strong> espacio: direccionamientos indirectos,<br />

base+<strong>de</strong>splazamiento e in<strong>de</strong>xado, ocupan menos bits que una<br />

dirección<br />

- código reubicable: con los direccionamientos relativos a una<br />

dirección base (almacenada en un registro)<br />

- estructuras <strong>de</strong> datos: direccionamientos relativos a la dirección<br />

base (en un registro) <strong>de</strong> la tabla, con un <strong>de</strong>splazamiento (en un<br />

registro o una constante), direccionamientos<br />

auto-incremento/<strong>de</strong>cremento y escalado o índice<br />

69<br />

2.4.2. Interpretación <strong>de</strong> las direcciones <strong>de</strong> memoria<br />

¿Qué objeto es accedido dada una dirección y una longitud?<br />

Dos convenios para or<strong>de</strong>nar en memoria los bytes <strong>de</strong> un objeto<br />

multibyte:<br />

- little endian: el byte en la dirección menos significativa es el <strong><strong>de</strong>l</strong><br />

extremo menos significativo<br />

- big endian: el byte en la dirección menos significativa es el <strong><strong>de</strong>l</strong><br />

extremo más significativo<br />

70


Convenios para clasificar los bytes <strong>de</strong> una palabra:<br />

- Little Endian: La dirección <strong>de</strong> un dato es la dirección <strong>de</strong> la parte<br />

menos significativa <strong><strong>de</strong>l</strong> dato<br />

- Big Endian: La dirección <strong>de</strong> un dato es la dirección <strong>de</strong> la parte más<br />

significativa <strong><strong>de</strong>l</strong> dato<br />

Aspecto importante cuando se intercambia información entre distintas<br />

máquinas<br />

71<br />

Alineación <strong>de</strong> los datos en memoria<br />

Algunas arquitecturas exigen que los objetos mayores <strong>de</strong> un byte<br />

estén alineados en memoria<br />

Definición: un acceso a un objeto <strong>de</strong> tamaño t bytes en el byte <strong>de</strong><br />

dirección D se alinea si D mod t = 0 (mod: resto <strong>de</strong> la división D/t)<br />

Es <strong>de</strong>cir, la dirección <strong><strong>de</strong>l</strong> objeto <strong>de</strong>be ser múltiplo <strong>de</strong> su tamaño en<br />

bytes<br />

72


El alineamiento permite simplificar los accesos a memoria: hardware<br />

más sencillo y la misma velocidad <strong>de</strong> acceso para cualquier palabra en<br />

memoria<br />

Ejemplo ‘little-endian’:<br />

73<br />

Ejemplo: doble palabra alineada y no alineada<br />

74


2.4.3. Descripción <strong>de</strong> los distintos modos <strong>de</strong> direccionamiento<br />

75<br />

Para especificar algunos modos <strong>de</strong> direccionamiento usaremos la<br />

siguiente notación:<br />

A = especificación <strong>de</strong> una dirección <strong>de</strong> memoria (Address)<br />

R = especificación <strong>de</strong> un registro (Register)<br />

EA = dirección real <strong><strong>de</strong>l</strong> operando en memoria (Effective address)<br />

(X) = contenido <strong>de</strong> la posición <strong>de</strong> memoria X o <strong><strong>de</strong>l</strong> registro X<br />

76


(1) Direccionamiento por registro<br />

El campo <strong>de</strong> dirección especifica un registro don<strong>de</strong> está el operando<br />

OPERANDO = (R)<br />

n bits <strong><strong>de</strong>l</strong> campo <strong>de</strong> dirección necesarios para referenciar 2 n registros<br />

Ventajas : campo <strong>de</strong> direcciones pequeño y no hay accesos a<br />

memoria<br />

Desventaja: espacio <strong>de</strong> posiciones limitado<br />

Ejemplo: add r4, r3 equivale a r4 = r4 + r3<br />

77<br />

(2) Direccionamiento inmediato<br />

El operando está en la propia instrucción<br />

OPERANDO = Operand<br />

Para <strong>de</strong>finir constantes cortas<br />

Ejemplo: add r4, #5 equivale a r4 = r4 + 5<br />

78


Número en complemento a 2, se hace extensión <strong><strong>de</strong>l</strong> signo al cargarlo<br />

en un registro<br />

Ventaja: una vez captada la instrucción, no se necesitan más<br />

referencias a memoria<br />

Desventaja: pocos bits para codificar el dato<br />

VAX permite distintos tamaños para operandos inmediatos: 6, 8, 16,<br />

32 y 64 bits<br />

MIPS solo permite 16 bits<br />

79<br />

(3) Direccionamiento directo<br />

El campo <strong>de</strong> dirección contiene la dirección efectiva <strong><strong>de</strong>l</strong> operando<br />

EA = A<br />

Muy sencillo, usada en las 1ªs computadoras<br />

Desventaja: limitación <strong><strong>de</strong>l</strong> rango <strong>de</strong> direcciones por el tamaño <strong><strong>de</strong>l</strong><br />

campo<br />

Ejemplo: add r1, (100) equivale a r1 = r1 + M[100]<br />

80


Direccionamiento indirecto (por memoria o por registro)<br />

Solución a la limitación <strong><strong>de</strong>l</strong> direccionamiento directo<br />

(4) Direccionamiento indirecto por registro<br />

Se especifica un registro don<strong>de</strong> está la dirección <strong><strong>de</strong>l</strong> operando<br />

EA = (R)<br />

Supera la limitación <strong><strong>de</strong>l</strong> nº <strong>de</strong> bits para especificar la dirección y un<br />

solo acceso a memoria para obtener el operando<br />

Ejemplo: add r2, (r5) equivale a r2 = r2 + M[r5]<br />

81<br />

(5) Direccionamiento indirecto por memoria<br />

El campo <strong>de</strong> direcciones contiene la dirección <strong>de</strong> una palabra don<strong>de</strong><br />

está la dirección <strong><strong>de</strong>l</strong> operando<br />

EA = (A)<br />

Desventaja: dos accesos a memoria, para obtener el operando<br />

Ejemplo: add r1, @(100) equivale a r1 = r1 + M[M[100]]<br />

82


(6) Direccionamiento base + <strong>de</strong>splazamiento<br />

Combina posibilida<strong>de</strong>s <strong><strong>de</strong>l</strong> directo (facilidad <strong>de</strong> uso) y <strong><strong>de</strong>l</strong> indirecto por<br />

registro (menos bits para especificar dirección)<br />

Habrá que especificar un registro y un valor. La suma <strong><strong>de</strong>l</strong> contenido<br />

<strong><strong>de</strong>l</strong> registro y el valor es la dirección <strong><strong>de</strong>l</strong> operando<br />

EA = (R) + A<br />

Ejemplo: add r4,28(r1) equivale a r4 = r4 + M[28+r1]<br />

Para tratar vectores: el registro pue<strong>de</strong> apuntar al principio <strong><strong>de</strong>l</strong> vector y<br />

el <strong>de</strong>splazamiento selecciona el elemento correspondiente<br />

83<br />

(7) Direccionamiento relativo al contador <strong>de</strong> programa<br />

Caso particular <strong>de</strong> direccionamiento base + <strong>de</strong>splazamiento<br />

El registro referenciado implícitamente es el contador <strong>de</strong> programa<br />

El campo <strong>de</strong> direcciones se trata como un número en complemento a<br />

2, y representa un <strong>de</strong>splazamiento relativo al PC<br />

Se utiliza para realizar saltos condicionales (concepto <strong>de</strong> localidad)<br />

84


(8) Direccionamiento in<strong>de</strong>xado<br />

La dirección <strong><strong>de</strong>l</strong> operando es la suma <strong>de</strong> dos registros<br />

Para acce<strong>de</strong>r a vectores <strong>de</strong> forma más versátil que base +<br />

<strong>de</strong>splazamiento. Un registro contiene la base <strong><strong>de</strong>l</strong> vector y el otro el<br />

índice <strong><strong>de</strong>l</strong> elemento correspondiente<br />

Ejemplo: add r3, (r1+r2) equivale a r3= r3+M[r1+r2]<br />

85<br />

(9) Direccionamiento autoincremento<br />

Indirecto por registro con autoincremento <strong><strong>de</strong>l</strong> mismo<br />

Ejemplo: add r1,(r3)+ equivale a r1= r1 + M[r3]<br />

r3=r3+d<br />

(d:tamaño <strong><strong>de</strong>l</strong> elemento)<br />

(10) Direccionamiento auto<strong>de</strong>cremento<br />

Igual pero se auto<strong>de</strong>crementa el registro<br />

(11) Direccionamiento escalado o índice<br />

Para soportar tratamientos <strong>de</strong> arrays<br />

Ejemplo: add r1, 50(r2)[r3] equivale a r1=r1+M[50+r2+r3*d] don<strong>de</strong><br />

d:tamaño <strong><strong>de</strong>l</strong> elemento <strong><strong>de</strong>l</strong> array<br />

86


Los cinco modos <strong>de</strong> direccionamiento <strong><strong>de</strong>l</strong> MIPS son:<br />

(1) Direccionamiento inmediato<br />

El operando se encuentra codificado en la propia instrucción,<br />

representado como dato inmediato<br />

87<br />

(2) Direccionamiento a registro<br />

El operando está en un registro cuyo i<strong>de</strong>ntificador se encuentra<br />

codificado en la instrucción<br />

88


(3) Direccionamiento base (+<strong>de</strong>splazamiento)<br />

La dirección efectiva <strong><strong>de</strong>l</strong> operando se obtiene sumando un<br />

<strong>de</strong>splazamiento que se encuentra en la instrucción con una dirección<br />

base que se encuentra en un registro especificado también por la<br />

instrucción<br />

89<br />

(4) Direccionamiento relativo al contador <strong>de</strong> programa<br />

Es un caso particular <strong><strong>de</strong>l</strong> direccionamiento base (+<strong>de</strong>splazamiento)<br />

don<strong>de</strong> el registro que contiene la dirección base es <strong>de</strong> forma implícita<br />

el PC y el <strong>de</strong>splazamiento es <strong>de</strong> <strong>instrucciones</strong> (4 posiciones <strong>de</strong><br />

memoria)<br />

90


Este modo <strong>de</strong> direccionamiento se utiliza en <strong>instrucciones</strong> <strong>de</strong><br />

bifurcación<br />

Ya que el <strong>de</strong>splazamiento es <strong>de</strong> 16 bits, este modo <strong>de</strong><br />

direccionamiento permite saltar <strong>de</strong>ntro <strong><strong>de</strong>l</strong> rango <strong>de</strong> palabras ±2 15<br />

respecto a la instrucción<br />

Esto es suficiente para implementar bucles y sentencias ‘if’<br />

Este modo <strong>de</strong> direccionamiento, especifica un salto relativo (número<br />

<strong>de</strong> <strong>instrucciones</strong>) a la instrucción <strong>de</strong> bifurcación<br />

91<br />

(5) Direccionamiento pseudodirecto<br />

La dirección se calcula concatenando los 4 bits más significativos <strong><strong>de</strong>l</strong><br />

PC con la dirección <strong>de</strong> 26 bits especificada en la instrucción y dos<br />

ceros<br />

Este modo <strong>de</strong> direccionamiento permite saltar más allá que el anterior<br />

92


2.5. Formato <strong>de</strong> las <strong>instrucciones</strong><br />

Representación <strong>de</strong> las <strong>instrucciones</strong> en el computador<br />

Mediante 0s y 1s: una instrucción máquina es un número<br />

Cómo se agrupan en distintos campos que especificar la operación y<br />

los operandos<br />

Instrucción máquina = combinación <strong>de</strong> números (valores <strong>de</strong> los<br />

campos)<br />

93<br />

Tamaño <strong>de</strong> las <strong>instrucciones</strong>: aspecto básico <strong><strong>de</strong>l</strong> diseño <strong><strong>de</strong>l</strong> formato<br />

Compromiso entre:<br />

- <strong>repertorio</strong> <strong>de</strong> <strong>instrucciones</strong> potente (más operaciones, más<br />

operandos, más modos <strong>de</strong> direccionamiento y mayor rango <strong>de</strong><br />

direcciones (más registros)): más bits para codificar<br />

- programas cortos: <strong>instrucciones</strong> cortas y <strong>de</strong> longitud variable<br />

- sencillez <strong><strong>de</strong>l</strong> hardware <strong>de</strong> captación y <strong>de</strong>codificación <strong>de</strong> las<br />

<strong>instrucciones</strong>: tamaño <strong>de</strong> las <strong>instrucciones</strong> fijo e igual al tamaño <strong>de</strong><br />

la palabra <strong>de</strong> la máquina<br />

Los direccionamientos implícito e indirecto, permiten acortar el tamaño<br />

<strong>de</strong> la instrucción<br />

94


Codificación <strong>de</strong> los modos <strong>de</strong> direccionamiento<br />

Según el número <strong>de</strong> modos <strong>de</strong> direccionamiento que tenga una<br />

arquitectura:<br />

95<br />

Características <strong>de</strong> los formatos <strong>de</strong> instrucción que <strong>de</strong>ben tener las<br />

arquitecturas:<br />

- Cada computador tiene unos pocos formatos: cada instrucción se<br />

ajusta a uno <strong>de</strong> ellos. Cuantos menos más sencilla la unidad <strong>de</strong><br />

control<br />

- Son sistemáticos: campos <strong><strong>de</strong>l</strong> mismo tipo tienen la misma longitud<br />

y ocupan el mismo sitio <strong>de</strong>ntro <strong>de</strong> la instrucción (código <strong>de</strong><br />

operación el primero). Simplifica la <strong>de</strong>codificación <strong>de</strong> la instrucción<br />

96


Ejemplos <strong>de</strong> formatos <strong>de</strong> <strong>instrucciones</strong><br />

IBM 360<br />

16 registros <strong>de</strong> tipo general: 0 – 15<br />

Palabra <strong>de</strong> 32 bits<br />

Modos <strong>de</strong> direccionamiento <strong><strong>de</strong>l</strong> computador:<br />

- inmediato (8 bits)<br />

- registro: Ri (4 bits)<br />

- almacenamiento (base + <strong>de</strong>splazamiento): Bi (registro base), Di<br />

(<strong>de</strong>splazamiento <strong>de</strong> 12 bits)<br />

- in<strong>de</strong>xado: Xi (registro índice), Bi (registro base), Di<br />

(<strong>de</strong>splazamiento)<br />

Tiene 5 formatos <strong>de</strong> instrucción, según los modos <strong>de</strong> direccionamiento<br />

2 o 3 operandos explícitos, cada uno mediante un modo <strong>de</strong><br />

direccionamiento <strong>de</strong>terminado<br />

97<br />

98


Veamos ejemplos <strong>de</strong> <strong>instrucciones</strong> (RR, RS y SI) <strong><strong>de</strong>l</strong> IBM 360:<br />

Especificación <strong>de</strong> las <strong>instrucciones</strong>:<br />

Descripción Código Código Formato Especificación <strong>de</strong><br />

mnemónico operación instrucc. los operandos<br />

Suma ADR 2A RR R1, R2<br />

normalizada<br />

larga<br />

Salta si BXH 86 RS R1, R3, D2(B2)<br />

índice alto<br />

Movimiento<br />

inmediato<br />

MVI 92 SI D1(B1), inmediato<br />

ADR 3, 4<br />

equivale a 0x2A34<br />

BXH 5, 8, X’6B8’(7) equivale a 0x865876B8<br />

MVI X’A49’(6), X’3F’ equivale a 0x923F6A49<br />

99<br />

El VAX<br />

Formato <strong>de</strong> instrucción muy flexible: código <strong>de</strong> operación <strong>de</strong> 8 bits,<br />

seguido <strong>de</strong> un máximo <strong>de</strong> cinco especificadores <strong>de</strong> operando:<br />

100


Cada especificador <strong>de</strong> operando se compone <strong>de</strong> dos o tres partes:<br />

1. Código <strong><strong>de</strong>l</strong> modo <strong>de</strong> direccionamiento (4 bits):<br />

- 5: registro<br />

- 0xC: base + <strong>de</strong>splazamiento (<strong>de</strong> 16 bits)<br />

- 0xA: base + <strong>de</strong>splazamiento (<strong>de</strong> 8 bits)<br />

- Para especificar un operando inmediato los 2 bits más significativos<br />

son 00 y los 6 bits restantes se utilizan para codificar el valor <strong><strong>de</strong>l</strong><br />

operando<br />

2. especificación <strong>de</strong> registro (4 bits)<br />

3. (opcional) especifica un <strong>de</strong>splazamiento en el direccionamiento<br />

base + <strong>de</strong>splazamiento (8, 16 ó 32 bits)<br />

Veamos algunos ejemplos <strong>de</strong> <strong>instrucciones</strong> <strong><strong>de</strong>l</strong> VAX:<br />

101<br />

102


Ejemplos:<br />

Dar la instrucción máquina equivalente a:<br />

CLRL R13<br />

MOVW 362(R3), 67(R12)<br />

ADDL3 #58, R1, 55(R11)<br />

equivale a 0xD45D<br />

equivale a 0xB0C36A01AC43<br />

equivale a 0xC13A51AC37<br />

103<br />

Formatos <strong>de</strong> instrucción <strong>de</strong> la MIPS<br />

3 formatos <strong>de</strong> instrucción <strong>de</strong> 32 bits:<br />

104


Los tipos <strong>de</strong> <strong>instrucciones</strong> en cada formato son:<br />

- Formato tipo R: utilizado por las <strong>instrucciones</strong> aritméticas y lógicas<br />

que no tienen operandos inmediatos<br />

- Formato tipo I: utilizado por las <strong>instrucciones</strong> <strong>de</strong> transferencia, las<br />

<strong>de</strong> salto condicional (bifurcación) y las <strong>instrucciones</strong> con operandos<br />

inmediatos<br />

- Formatos tipo J: utilizado por las <strong>instrucciones</strong> <strong>de</strong> salto<br />

Veamos ejemplos <strong>de</strong> los distintos formatos:<br />

105<br />

1. Tipo R<br />

- op: operación básica <strong>de</strong> la instrucción, tradicionalmente llamada<br />

código <strong>de</strong> operación<br />

- rs: primer registro operando fuente<br />

- rt: segundo registro operando fuente<br />

- rd: registro operando <strong>de</strong>stino, don<strong>de</strong> se almacena el resultado <strong>de</strong> la<br />

operación<br />

- shamt: tamaño <strong><strong>de</strong>l</strong> <strong>de</strong>splazamiento (shift amount)<br />

- funct: función. Este campo selecciona la variante específica <strong>de</strong> la<br />

operación <strong><strong>de</strong>l</strong> campo op, y a veces se le <strong>de</strong>nomina código <strong>de</strong><br />

función<br />

106


Instrucciones aritméticas y lógicas:<br />

(1) 3 operandos en registros:<br />

Ejemplos:<br />

107<br />

Cuidado, son números en <strong>de</strong>cimal<br />

Modo <strong>de</strong> direccionamiento registro:<br />

108


(2) 2 operandos en registros:<br />

Desplaza rt (fuente), ‘shamt’ posiciones, y pon el resultado en rd<br />

(<strong>de</strong>stino)<br />

Por ejemplo: sll $7, $3, 5<br />

0 0 3 7 6 0<br />

109<br />

2. Tipo I<br />

2.1. Instrucciones <strong>de</strong> transferencia (<strong>de</strong> datos entre memoria y<br />

registros)<br />

110


Existen <strong>instrucciones</strong> <strong>de</strong> carga distintas para los diferentes tamaños <strong>de</strong><br />

objeto:<br />

111<br />

En todos los casos, el direccionamiento para el segundo operando es<br />

base (registro rt) + <strong>de</strong>splazamiento (valor especificado en la propia<br />

instrucción con 16 bits):<br />

El uso <strong>de</strong> etiquetas en ensamblador evita al programador hacer el<br />

cálculo con direcciones:<br />

lb $2, dirección (dirección = valor($1) = $1 + valor)<br />

112


2.2. Instrucciones <strong>de</strong> salto condicional (bifurcación)<br />

La instrucción “beq rs, rt, L1”(branch if equal) significa ir a la sentencia<br />

etiquetada con L1 si el valor <strong><strong>de</strong>l</strong> registro rs es igual al valor <strong><strong>de</strong>l</strong> registro<br />

rt<br />

La instrucción “bne rs, rt, L1”(branch if not equal) significa ir a la<br />

sentencia etiquetada con L1 si el valor <strong>de</strong> rs no es igual al valor en rt<br />

113<br />

El modo <strong>de</strong> direccionamiento empleado es direccionamiento con<br />

<strong>de</strong>splazamiento relativo al contador <strong>de</strong> programa<br />

Se especifica el <strong>de</strong>splazamiento (16 bits) con respecto al contador <strong>de</strong><br />

programa don<strong>de</strong> está la instrucción <strong>de</strong>stino <strong><strong>de</strong>l</strong> salto las<br />

<strong>instrucciones</strong> <strong>de</strong> bifurcación pue<strong>de</strong>n saltar 2 15 -1 <strong>instrucciones</strong> hacia<br />

<strong><strong>de</strong>l</strong>ante y 2 15 hacia atrás<br />

En ensamblador, el uso <strong>de</strong> etiquetas libera al programador <strong><strong>de</strong>l</strong> tedioso<br />

cálculo <strong>de</strong> las direcciones <strong>de</strong> salto:<br />

beq $19, $20, L1 don<strong>de</strong> L1= PC + 0x183d<br />

114


2.3. Instrucciones con un operando inmediato<br />

Para operaciones con constantes:<br />

Direccionamiento inmediato<br />

115<br />

3. Tipo J<br />

3.1. Instrucciones <strong>de</strong> salto (incondicional)<br />

Direccionamiento pseudodirecto: don<strong>de</strong> la dirección <strong>de</strong> salto son los<br />

26 bits <strong>de</strong> la instrucción concatenados con los bits <strong>de</strong> mayor peso <strong><strong>de</strong>l</strong><br />

contador <strong>de</strong> programa:<br />

116


Ejemplos <strong>de</strong> modos <strong>de</strong> direccionamiento <strong>de</strong> la MIPS<br />

117<br />

(1) Inmediato<br />

Instrucción ensamblador: addi $t0,$t1,4 (operando inmediato)<br />

Tipo I<br />

Instrucción máquina: 001000010010100000000000000000100<br />

4<br />

Operación a realizar: $t0 = $t1 + 4<br />

Contenido <strong>de</strong> los registros antes <strong>de</strong> la operación:<br />

Contenido <strong>de</strong> los registros <strong>de</strong>spués <strong>de</strong> la operación:<br />

118


(2) Registro:<br />

Instrucción ensamblador: sub $10, $11, $12 (los 3 operandos<br />

direccionados en modo registro)<br />

Tipo R<br />

Instrucción máquina: 00000001011011000101000000100010<br />

$11 $12 $10<br />

Operación a realizar:<br />

$10 = $11 - $12 = 7 – 4 = 3<br />

Contenido <strong>de</strong> los registros <strong>de</strong>spués <strong>de</strong> la operación:<br />

119<br />

(3) Base (+<strong>de</strong>splazamiento)<br />

Instrucción ensamblador: sw $13, 8($14) (dir.base+<strong>de</strong>splaz.)<br />

Instrucción máquina: 10101101110011010000000000001000<br />

$14 8<br />

Operación: transfiere la palabra en el registro $13 a la posición <strong>de</strong><br />

memoria especificada (8 + $14)<br />

120


Contenido <strong>de</strong> los registros antes <strong>de</strong> la operación:<br />

De forma que la operación a realizar es:<br />

M ($14 + 8) = M (0x10010008) = $13 = 0x1234567<br />

El valor queda almacenado en la correspondiente posición <strong>de</strong><br />

memoria:<br />

121<br />

(4) Relativo al contador <strong>de</strong> programa<br />

Este modo <strong>de</strong> direccionamiento, especifica un salto relativo (número<br />

<strong>de</strong> <strong>instrucciones</strong>) a la instrucción <strong>de</strong> bifurcación<br />

Instrucción ensamblador: bgez $t2, instr1 (dir. relativo al PC)<br />

add $t7, $t0,$t1<br />

instr1: add $t7, $t1, $t2<br />

122


Instrucción máquina: 00000101010000010000000000000010<br />

2<br />

Operación: bifurca a la instrucción especificada por la etiqueta instr1<br />

si el registro $t2 es mayor o igual que 0<br />

Sea [0x0040002C] la dirección <strong>de</strong> la instrucción <strong>de</strong> bifurcación (bgez<br />

$t2, instr1) instr1 = 0x0040002C + (2*4)= 0x00400034, que<br />

es la dirección <strong>de</strong> la instrucción <strong>de</strong>stino <strong><strong>de</strong>l</strong> salto (add $t7,$t1,$t2)<br />

123<br />

(5) Pseudodirecto<br />

La dirección se calcula concatenando los 4 bits más significativos <strong><strong>de</strong>l</strong><br />

PC con la dirección <strong>de</strong> 26 bits especificada en la instrucción y dos<br />

ceros<br />

Instrucción ensamblador: j instr2 (dir. pseudodirecto)<br />

add $t7, $t0,$t1<br />

instr2: add $t7, $t1, $t2<br />

Operación : salta a la instrucción especificada por instr2<br />

124


Instrucción máquina: 00001000000100000000000000010000<br />

Sea [0x00400038] la dirección <strong>de</strong> la instrucción <strong>de</strong> salto (j instr2)<br />

instr2 = 00000000010000000000000001000000 = 0x00400040, que<br />

es la dirección <strong>de</strong> la instrucción <strong>de</strong>stino <strong><strong>de</strong>l</strong> salto (add $t7,$t1,$t2)<br />

125

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!