7 unidad aritmética y lógica prof. javier cañas r.2 números con signo y sin signo •en el...

Post on 12-Sep-2020

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Arquitecturas de Computadores7 Unidad Aritmética y Lógica

Prof. Javier Cañas R.

Temario

1. Introducción

2. Instrucciones Aritméticas

3. Interrupciones y Excepciones

4. Operaciones Lógicas y Desplazamientos

5. Coprocesadores Matemáticos: Multiplicaciones y Divisiones

1 Introducción

• En este capítulo profundizaremos la aritmética computacional.

• ¿Cómo realmente un computador suma, resta, multiplica y divide?.

• Comenzaremos esta discusión retomando algunas ideas de representación de números.

2 Números con signo y sin signo

• En el lenguaje C, es posible definir números con signo y sin signo:int x; //con signo

unsigned int y; //sin signo

• Ejemplo de números sin signo: Contadores, Direcciones de memoria

• La dificultad reside en las comparaciones.

Comparaciones con y sin signo

• Deben existir dos instrucciones de comparación. Con signo:slt (set on less than)

slti (set on less than inmediate)

• Sin signo:sltu (set on less than unsigned)

sltiu (set on less than inmediate unsigned)

...Comparaciones con y sin signo

• Ejemplo

sltu $t1,$s2,$s3

Interpretación: if($s2 < $s3) ! $t1=1 else! $t1=0

Ejemplo

• Si el contenido del registro $16 es:1111 1111 1111 1111 1111 1111 1111 1100

• Si el contenido del registro $17 es:0000 0000 0000 0000 0000 0000 0000 0001

slt $8,$16,$17 // $8 == 1sltu $9,$16,$17 //$9 ==0

3 Interrupciones y Excepciones: Tratamiento de Overflow

• La máquina MIPS detecta overflow vía una excepción.

• Las Interrupciones y excepciones son llamadas no planificadas a subrutinas.

• Se denomina interrupción a eventos externos que causan una llamada a subrutina y excepción a eventos internos.

...Interrupciones y Excepciones

• Interrupciones y excepciones son eventos que cambian el flujo normal de instrucciones.

• Ejemplo de excepción: overflow, división por cero

• Ejemplo de interrupción: término de transferencia de disco, falla de poder, llegada de un paquete de datos por el adaptador de red.

...Interrupciones y Excepciones

• Frente a una interrupción o excepción se realizan las siguientes acciones:

‣ Salvar el PC+4 en el registro EPC

‣ Transferir el control a direcciones específicas

• Es necesario también conocer la causa de la interrupción o excepción.

Detección de causas

• Hay dos métodos:

‣ Algunos procesadores tienen un registro de HW donde queda registrada la causa. En este caso se transfiere el control a una dirección única

‣ Interrupciones vectorizadas: la dirección a la cual se transfiere el control contiene la causa. Las direcciones están separadas en 8 palabras de 32b.

Vector de interrupción

• Normalmente el vector de interrupción está almacenado en la zona baja de memoria (IRQ en PC).

Vector de interrupción

Mapa de memoria

Tratamiento de Overflow

• La dirección de la instrucción que produjo overflow se guarda en un registro especial de la CPU llamado EPC (Exception Program Counter)

• La instrucción:

mfc0 $r1,$epc // se copia el EPC en el registro $r1 del archivo de registros.

• Con la instrucción jr se puede volver a la dirección original.

...Tratamiento de Overflow

• En el vector de interrupciones correspondiente a la dirección que corresponde a overflow se pone la dirección a la subrutina que atiende el overflow.

• En la máquina MIPS sólo causan excepciones de overflow las instrucciones aritméticas con signo.

...Tratamiento de Overflow

• Como los compiladores de C no consideran overflow, se genera código utilizando: addu, addiu, subu.

4 Operaciones Lógicas y corrimientos

• Adicionalmente a las instrucciones aritméticas, todos los procesadores incluyen instrucciones que permiten realizar corrimientos de bits y operaciones lógicas.

• La utilidad es muy variada, sirve para optimizar operaciones aritméticas y fundamentalmente para trabajar en bajo nivel programando drivers de dispositivos.

Instrucción de Desplazamiento

• Corrimiento lógico a la izquierda:

sll$t0,$s1,8 #$t0 ←$s1 <<8b←0

• sll es una instrucción tipo R. srl es equivalente a sll y corre a la derecha.

OP6b

rs5b

rt5b

rd5b

shamt5b

funct6b

0 0 16 10 8 0

$s1 $t0sll sll

Instrucciones Lógicas

• And

and $s1,$s2,$s3 #$s1 ←$s2 & $s3

• Or

or $s1,$s2,$s3 #$s1 ←$s2 | $s3

• and y or son instrucciones tipo R. Formas inmediatas: andi y ori.

Creación de Constantes

• Es frecuente la utilización de constantes en programas. Una opción es almacenar las constantes en memoria y cargar en registros al momento de utilizarlas.

• La instrucción lui, permite utilizar constantes evitando tiempos de acceso a memoria.

... Constantes• lui: load upper inmediate. Esta instrucción carga en

los 16 bits más significativos del registro destino una constante. Usando lui y ori se pueden crear constantes en forma rápida.

• Ejemplo. Si el contenido inicial de $s1 es:1111 1111 1111 1111 1111 1111 1111 1100

lui $s1,3

• Queda finalmente:

0000 0000 0000 0011 0000 0000 0000 0000

5 Coprocesadores Matemáticos

• Hasta ahora hemos visto como se realizan operaciones aritméticas y lógicas simples, ahora veremos como multiplicar y dividir.

• Hay dos estrategias:

- Por SW, generando bibliotecas.

- Por Hw utilizando coprocesadores

Solución por HW

• No hay duda que el hardware es mucho más rápido que el software, por esta razón todos los procesadores modernos incluyen poderosos coprocesadores que permiten realizar multiplicaciones y divisiones utilizando tiempos muy cortos.

La Multiplicación

• Revisaremos el algoritmo aprendido en nuestra educación básica:

1 0 0 0 X 1 0 0 1

1 0 0 00 0 0 0

0 0 0 01 0 0 0

1 0 0 1 0 0 0

Multiplicador

Producto

Multiplicando

Multiplicando: Mulo

64b

Multiplicador: Mulr

32b

64b

Producto: Prod

64bControl

Shift r

Mulr0Shift l

write

HW de multiplicación

Diagrama de flujoStart

¿Mulr0==0?

Prod ←Mulo+Prod

Mulo <<1

Mulr >>1

VF

¿32 veces?

V

F

Stop

Shift l

Multiplicación: Segunda versión

• La solución anterior necesita que el registro multiplicando sea de 64b. Esto significa que la ALU también debe ser de 64b.

• En otras palabras, se usa una ALU de 64b para generar un resultado de 32b. La segunda versión que se presenta sólo requiere de una ALU de 32b, pero es necesario hacer modificaciones en el HW

Multiplicación: HW v2Multiplicando: Mulo

32b

Multiplicador: Mulr

32b

32b

Prod

32bControl

Shift r

Mulr0

Shift r

write

Control V2Start

¿Mulr0==0?

Prod63..32 ← Prod63..32 + Mulo

Prod >>1

Mulr >>1

VF

¿32 veces?

V

F

Stop

Shift r

Multiplicación: V3

• Una optimización adicional que se puede lograr es ahorrar el registro Multiplicador (Mulr).

• Como este registro es de sólo lectura se puede poner en los 32 bits menos significativo del registro Producto (Prod).

• En la medida que se corre se va ganando espacio

Multiplicación: HW v3

Multiplicando: Mulo

32b

32b

Prod Mulr

32b

Control

Shift rwrite

Mulr0

Control v3Start

¿Prod0==0?

Prod63..32 ← Prod63..32 + Mulo

Prod >>1

VF

¿32 veces?

V

F

Stop

Shift r

La División

• Nuevamente, la forma más simple de dividir es aplicar lo aprendido en la educación básica.

• Ejemplo:1 0 1 0 : 1 0 0 0

1 0 0 0

Divisor

Cuociente Q

Signo positivo

= 1 0 0 10 1 0 0

1 0 1 0

1 0 0 0

1 0

Dividendo

División: HW v1

Divisor: Divsor

64b

Cuociente: Q

32b

64b

Dividendo: Divdo

64bControl

Shift l

Divdo63

Shift r

write

Control: v1Start

¿Divdo63==1?

Q<<1; Q0 ←1

Divsor >>1

VF

¿33 veces?

V

F

Stop

Divdo ←Divdo - Divsor

Divdo ←Divdo + DivsorQ<<1; Q0 ←0

División: v2

• La solución anterior necesita que la ALU sea de 64b.

• En vez de mover el Divisor resulta más conveniente mover el dividendo

• Una observación importante es que el primer paso del algoritmo no puede producir un uno en el cuociente. Es posible invertir las operaciones de corrimientos y restas

HW: v2

Divsor

32b

Q

32b

Divdo

32bControl

Shift l

Divdo63

write

Control: v2Start

¿Divdo63==1?

Q<<1; Q0 ←1

VF

¿32 veces?

V

F

Stop

Divdo << 1Divdo63..32 ← Divdo63..32 - Divsor

Divdo63..32 ← Divdo63..32 + DivsorQ<<1; Q0 ←0

División: Tercera versión

• Al igual que la multiplicación, es posible eliminar el registro Q utilizando la mitad menos significativa del Dividendo para almacenar Q.

• Como Q se mueve en conjunto con el resto, es necesario incorporar una fase correctiva al final

División HW:v3

Divsor

32b

32b

Divdo Q

32bControl

Divdo63

write

Shift l

Control: v3Start

¿Divdo63==1?

Divdo<<1; Divdo0 ←1

VF

¿32 veces?V

F

Stop

Divdo63..32 ← Divdo63..32 - Divsor

Divdo63..32 ← Divdo63..32 +DivsorDivdo<<1; Divdo0 ←0

Divdo << 1

Divdo63..32 >>1

Ejercicio: traza1000

0100 1010

Arquitecturas de Computadores7 Unidad Aritmética y Lógica

Prof. Javier Cañas R.

top related