Circuitos Digitales II Alineamiento en Memoria y Ejecución de un programa Semana No.8 Semestre Prof. Gustavo Patiño Prof. Eugenio Duque Departamento de Ingeniería Electrónica Facultad de Ingeniería
Repaso Instrucciones de Control Ejemplos : If Then While Repaso Completo de un ejemplo en C/C++ Multiplicación y división em el MIPS Alineamiento en el MIPS Orden de Bytes en la memoria Big Endian Little Endian Temario 2 Departamento de Ing. Electrónica. Circuitos Digitales II Facultad de Ingeniería
Repaso : If-then-else 3
Ejemplo: If-then-else Solución 4
Resumen de Comparaciones en el MIPS 6
Resumen de instrucciones y operandos en el MIPS
8
11
Cuando una palabra (4 bytes) es cargado o almacenado, la dirección de memoria debe ser un múltiplo de cuatro. Esto se denomina restricción de alineamiento. Las direcciones que son un múltiplo de cuatro son llamadas de palabra alineada (word aligned). Esta restricción hace el hardware más simple y más rápido. Alineamiento en el MIPS 12 Departamento de Ing. Electrónica. Circuitos Digitales II Facultad de Ingeniería
Restricciones de Alineamiento 13 Departamento de Ing. Electrónica. Circuitos Digitales II Facultad de Ingeniería
Cuál de las siguientes direcciones es de palabra alineada ? 0x000AE430 0x x000B0737 0x0E0D8844 Sugerencia: En binario, cómo es posible dividir por 4 ? Pregunta 14 Departamento de Ing. Electrónica. Circuitos Digitales II Facultad de Ingeniería
Restricciones de Alineamiento (…cont) 15 Departamento de Ing. Electrónica. Circuitos Digitales II Facultad de Ingeniería
Una instrucción de carga (load) o de almacenamiento (store) tipo word usa únicamente una dirección de memoria. La dirección más baja de los cuatro bytes se usa para la dirección de un bloque de cuatro bytes contiguos. Cómo se almacena un dato de 32 bits en la memoria ? Como se sabe, hay 32 bits en los 4 bytes de memoria, y el dato posee también 32 bits. No obstante es necesario definir cuál parte de la memoria almacena cada parte del dato de 32 bits. Actualmente hay dos maneras como los computadores realizan esta tarea: Orden de bytes del tipo Big Endian: El byte más significativo (the big endian) de los datos es ubicado en el byte con la dirección más baja. El resto de los datos es colocado en orden en los restantes tres bytes de la memoria. Orden de bytes del tipo Little Endian: El byte menos significativo (the little endian) de los datos es ubicado en el byte con la dirección más baja. El resto de los datos es colocado en orden en los restantes tres bytes de la memoria. Orden de Bytes en la memoria : Big Endian y Little Endian 16 Departamento de Ing. Electrónica. Circuitos Digitales II Facultad de Ingeniería
En esta definición, el dato de 32 bits es visto como un entero sin signo de 32 bits. El byte más significativo es aquel con la más alta potencia de dos: 2 31, El byte menos significativo es aquel con la menor potencia de 2: 2 7, Por ejemplo: imagine el dato 0x ubicado en la dirección 0x En este caso, el byte menos significativo es 0x12 y el byte más significativo es 0x78. Según el tipo de orden de los bytes, este número podría ser almacenado como: Dentro de un byte, el orden de los bits es el mismo para todos los computadores, sin importar cómo es que los bytes están ordenados. Big Endian y Little Endian 17 Departamento de Ing. Electrónica. Circuitos Digitales II Facultad de Ingeniería
Ejecución de un Programa Procedimiento de compilación y enlace (Compilation and linking)
23
24
26
27
28
Ejemplo en C 29
sum_pow2: # $a0 = b, $a1 = c addu $a0, $a0, $a1 # a = b + c, $a0 = a slti $v0, $a0, 8 # $v0 = a < 8 beq $v0, $zero, Exceed # goto Exceed if $v0 == 0 addiu $v1, $sp, 8 # $v1 = pow2 address sll $v0, $a0, 2 # $v0 = a*4 addu $v0, $v0, $v1 # $v0 = pow2 + a*4 lw $v0, 0($v0) # $v0 = pow2[a] j Return # goto Return Exceed: addu $v0, $zero, $zero # $v0 = 0 Return: jr ra # return sum_pow2 sum_pow2: # $a0 = b, $a1 = c addu $a0, $a0, $a1 # a = b + c, $a0 = a slti $v0, $a0, 8 # $v0 = a < 8 beq $v0, $zero, Exceed # goto Exceed if $v0 == 0 addiu $v1, $sp, 8 # $v1 = pow2 address sll $v0, $a0, 2 # $v0 = a*4 addu $v0, $v0, $v1 # $v0 = pow2 + a*4 lw $v0, 0($v0) # $v0 = pow2[a] j Return # goto Return Exceed: addu $v0, $zero, $zero # $v0 = 0 Return: jr ra # return sum_pow2 Sum_pow2: Código compilado en Assembler 30 Return Address
Constantes dentro de las instrucciones 31
Qué ocurre con constantes más grandes ? 32