![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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/1.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/6.jpg)
...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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/9.jpg)
...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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/10.jpg)
...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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/14.jpg)
...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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/15.jpg)
...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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/20.jpg)
... 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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/21.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/29.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/33.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/36.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/37.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/39.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/40.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/41.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022051901/5fefb0e3f4d15f561f79742b/html5/thumbnails/42.jpg)
Arquitecturas de Computadores7 Unidad Aritmética y Lógica
Prof. Javier Cañas R.