7 Unidad Aritmética y Lógica Prof. Javier Cañas R.2 Números con signo y sin signo •En el...

42
Arquitecturas de Computadores 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.

Transcript of 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.2 Números con signo y sin signo •En el...

Page 1: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Arquitecturas de Computadores7 Unidad Aritmética y Lógica

Prof. Javier Cañas R.

Page 2: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 3: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 4: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 5: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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)

Page 6: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

...Comparaciones con y sin signo

• Ejemplo

sltu $t1,$s2,$s3

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

Page 7: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 8: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 9: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

...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.

Page 10: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

...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.

Page 11: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 12: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 13: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 14: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

...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.

Page 15: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

...Tratamiento de Overflow

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

Page 16: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 17: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 18: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 19: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 20: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

... 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

Page 21: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 22: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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.

Page 23: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 24: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Multiplicando: Mulo

64b

Multiplicador: Mulr

32b

64b

Producto: Prod

64bControl

Shift r

Mulr0Shift l

write

HW de multiplicación

Page 25: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Diagrama de flujoStart

¿Mulr0==0?

Prod ←Mulo+Prod

Mulo <<1

Mulr >>1

VF

¿32 veces?

V

F

Stop

Shift l

Page 26: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 27: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Multiplicación: HW v2Multiplicando: Mulo

32b

Multiplicador: Mulr

32b

32b

Prod

32bControl

Shift r

Mulr0

Shift r

write

Page 28: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Control V2Start

¿Mulr0==0?

Prod63..32 ← Prod63..32 + Mulo

Prod >>1

Mulr >>1

VF

¿32 veces?

V

F

Stop

Shift r

Page 29: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 30: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Multiplicación: HW v3

Multiplicando: Mulo

32b

32b

Prod Mulr

32b

Control

Shift rwrite

Mulr0

Page 31: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Control v3Start

¿Prod0==0?

Prod63..32 ← Prod63..32 + Mulo

Prod >>1

VF

¿32 veces?

V

F

Stop

Shift r

Page 32: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 33: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

División: HW v1

Divisor: Divsor

64b

Cuociente: Q

32b

64b

Dividendo: Divdo

64bControl

Shift l

Divdo63

Shift r

write

Page 34: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 35: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 36: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

HW: v2

Divsor

32b

Q

32b

Divdo

32bControl

Shift l

Divdo63

write

Page 37: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 38: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 39: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

División HW:v3

Divsor

32b

32b

Divdo Q

32bControl

Divdo63

write

Shift l

Page 40: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

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

Page 41: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Ejercicio: traza1000

0100 1010

Page 42: 7 Unidad Aritmética y Lógica Prof. Javier Cañas R.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

Arquitecturas de Computadores7 Unidad Aritmética y Lógica

Prof. Javier Cañas R.