TALLER ARQUITECTURA DE COMPUTADORES

1. ¿Cuál de las siguientes afirmaciones es falsa? a) El lenguaje ensamblador es un lenguaje de alto nivel. (F) b) El lenguaje ensamblador es un lenguaje muy cercano al procesador. V c) Los programas en lenguaje ensamblador son habitualmente más largos V Que en lenguaje C. d) El lenguaje ensamblador es específico para cada tipo de procesador. V R/ a) El lenguaje ensamblador es un lenguaje de alto nivel. (F) La afirmación es falsa Porque el lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.

7. ¿Qué modo de direccionamiento se utiliza en una instrucción de salto Incondicional? a) Registro b) Relativo al PC c) Pseudo directo d) Base más desplazamiento R/ c) Pseudo directo

Instrucciones de salto (incondicional) Pseudo directo la dirección de salto son los 26 bits menos significativos de la instrucción, desplazados 2 posiciones a la izquierda y concatenados con los 4 bits más significativos del PC.

Ejercicio 1

Suponemos: • Las variables a, b y c se almacenan en los registros $s0, $s1, $s2, respectivamente. • La dirección del primer elemento de la tabla de palabras A (es decir A[0]) se encuentra almacenada en el registro $s3. • La dirección del primer elemento de la tabla de palabras B (es decir B[0]) se encuentra almacenada en el registro $s4. • Las variables i, j se almacenan en los registros $s5, $s6, respectivamente. Instrucciones: • Solo podemos utilizar las instrucciones: add, addi, sub, lw y sw. • No podemos usar más registros que los anteriormente comentados, salvo los registros temporales $t0-$t7.

1.1) Traduce las siguientes instrucciones a ensamblador: a) a = b + c; a = a + 10; a = a –b + 2; addi $s0,$t0,2 a = b; add $s0, $s1, $s2 addi $s0, $s0, 10 sub $t0, $s0, $s1 addi $s0, $t0, 2 add $s0, $s1, $0

b) a = b + c; a = a – A[2]; add $s0, $s1, $s2 lw $t0, 8($s3) sub $s0, $s0, $t0

c) a = 2*(b+c) – 2*A[3]; B[2] = a + 4*c; add $t0, $s1, $s2 add $t0, $t0, $t0 lw $t1, 12 ($s3) add $t1, $t1, $t1 sub $s0, $t0, $t1 add $t0, $s2, $s2 add $t0, $t0, $t0 add $t0, $s0, $t0 sw $t0, 8($s4)

d) A[i] = 2*A[i+1]; add $t0, $s5, $s5 add $t0, $t0, $t0 add $t1, $s3, $t0 lw $t3, 4($t1) add $t3, $t3, $t3 sw $t3, 0(t1)

e) A[i] = B[j+1] + A[i+1] add $t0, $s5, $s5 add $t0, $t0, $t0 add $t1, $s3, $t0 lw $t2, 4($t1) add $t4, $s6, $s6 add $t4, $t4, $t4 add $t5, $s4, $t4 lw $t6, 4($t5) add $t7, $t7, $t7 sw $t7, 0($t1)

1.2) Traduce las instrucciones del ejercicio b a código máquina.

Ejercicio 2 Suponemos: • Inicialmente los registros $s0, $s1, $s2 almacenan los números enteros: 10, 12, 8, respectivamente. • Inicialmente el registro $s3 contiene la dirección: 0x10000008 • En la memoria se almacenan los siguientes valores: Dirección palabra 0x00000014 0x10000010 0x1000000C 0x10000008 0x10000004 0x10000000 Dato 50 40 10 30 20 10

¿Qué contendrá el registro $t0 después de la ejecución de los siguientes programas? a) add $s0,$s1,$s2 --$s0=20 sub $t0,$s0,$s2 ---$t0=12

hexadecimal ( 0000000C)

Registros al finalizar ejecución del programa pcspim

Respuesta: el registro ---$t0= decimal (12)

hexadecimal ( 0000000C)

b) lw $t1,4($s3) --- acceso mem 0x0000000C, t1 = 10 addi $t0,$t1,10 --- t0 = 10 + 10 = 20 t0 = 20 Registros al finalizar ejecución del programa

Respuesta: el registro $t0 = decimal (20) hexadecimal (00000014)

c) sw $s0,8($s3) --- copia en mem 0x10000010 dato 10 lw $t0,8($s3) ----- acceso mem 0x10000010, t0 = 10 t0 = 10 Registros al finalizar ejecución del programa

Respuesta: el registro $t0 = decimal(10) hexadecimal( 0000000A )

d) addi $t0,$s3,4 --- t0 = 0x10000008+4 = 0x0000000C lw $t0, 4($t0) -------acceso mem 0x0000000C + 4 = 0x10000010 t0 = 40

Respuesta: el registro $t0 = decimal(40) hexadecimal(00000028)

Ejercicio 3 a) slt $t0, $s0, $s1 ---$t0=1 (00000001 )

Registros al finalizar ejecución del programa

Respuesta: el registro $t0 = decimal (1)

hexadecimal(00000001 )

b) slt $t1, $s0, $s1 ---10 < 12 -> 1 -> $t1=1 beq $t1, $zero, fin ---No salta slt $t1, $s0, $s2 --- 10 < 8 $t1=0 beq $t1,$zero, fin ---Salta addi $t0, $s0, 10 fin: add $t0, $s0, $0---$t0=10 (0000000A) registros al finalizar ejecución del programa

Respuesta: el registro $t0 =

decimal(10) hexadecimal(0000000A )

c) slt $t1, $s0, $s1 ---10 < 12 ---$t1=1 beq $t1, $zero, fin --- No Salta slt $t1, $s2, $s0 ---8< 10 ---$t1=1 beq $t1,$zero, fin --- No Salta $addi $t0, $s0, 10 fin: $add $t0, $s0, $0 ---- t0 = 10 registros al finalizar ejecución del programa

Respuesta: el registro $t0 = decimal(10) hexadecimal (0000000A)

d) slt $t1, $s0, $s1 -----10 < 12 beq $t1, $zero, fin ----- NO slt $t1, $s0, $s2 ------10< 8 bne $t1,$zero, fin -------NO $addi $t0, $s0, 10 fin: $add $t0, $s0, $0----t0 = 10

registros al finalizar ejecución del programa

Respuesta: el registro $t0 = decimal (10) hexadecimal (0000000A)

e) bne $s0, $s1, sino ---si pasa a la etiq add $t0, $s0, $s1 j fin sino: sub $t0, $s1, $s0 ---$t0=2 fin:

registros al finalizar ejecución del programa

Respuesta: el registro $t0 = decimal (2) hexadecimal (00000002)

f) addi $s0, $s0,2 ---$s0=12 bne $s0, $s1, sino ---no pasa a la etiq add $t0, $s0, $s1 ---$t0=24 j fin sino: sub $t0, $s1, $s0 fin: registros al finalizar ejecución del programa

Respuesta: el registro $t0 = decimal (24) hexadecimal(00000018)

g) bucle: slt $t1, $s0, $s1 ----- 1, 5, 9 beq $t1, $zero, fin_bucle---- 2, 6, 10 addi $s0,$s0,1 # 3, 7 j bucle # 4, 8 fin_bucle: add $t0, $s0, $zero ---- 11 t0 = 12 registros al finalizar ejecución

Respuesta: el registro $t0 = decimal (12) hexadecimal (0000000c)

h) bucle: slti $t1, $s0, 16 ----- 1,5,9,13 beq $t1, $zero, fin_bucle ----2,6,10,14 addi $s0,$s0,2 #3,7,11 j bucle #4,6,12 fin_bucle: add $t0, $s0, $zero ------15 t0 = 16 registros al finalizar ejecución

Respuesta: el registro $t0 = decimal (16) hexadecimal (00000010)

i) bucle: beq $s0,$s1,fin_bucle -----1,4,7 addi $s0, $s0, 1 -----2,5 j bucle #3,6 fin_bucle: add $t0, $s0, $zero -----8 t0 = 12

registros al finalizar ejecución

Respuesta: el registro $t0 = decimal (12) hexadecimal (0000000C)

j) b1: slt $t0, $s0, $s1 ----,1,5,9 beq $t0, $zero, b2 ------2,6,10 addi $s0, $s0, 1 ----------3,7 j b1 #4,8 b2: slt $t0, $s0, 17 ------11,15,19,23 beq $t0,$zero,fin ---------12,16,20,24 addi $s0, $s0, 2 -----------13,17,21 j b2 #14,18,22 fin: add $t0,$s0,$zero ----25 t0 = 18

Registros al finalizar ejecución

Respuesta: el registro $t0 = decimal (18)

hexadecimal (00000012 )