Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2. Lazo en MIPS.
Asuma que al inicio los registro que requieren estar inicializados, tienen valor 0, antes de ingresar al
lazo. Suponga también que el lazo pueda ser ejecutado, al menos cinco veces, de tal forma que algunos
registros podría requerir ser salvados (antes de invocar) y luego restaurados (después del retorno de la
subrutina). Esto debido a que existe un llamado a una subrutina, en el medio del lazo, y que esta
subrutina podría sobreescribir en alguno de los registros.
Escribir el código para salvar y restaurar, para ello es preciso analizar cuidadosamente el código antes y
después del "jal".
1
ELO311 Tarea 02 02/99
Expresar en hexadecimal.
Obs. El simulador ensambla mal los direccionamientos de los branch. La forma correcta de efectuarlos
es tomando la dirección de la instrucción siguiente al branch, y a esta dirección sumarle el número con
signo establecido en el campo inmediato. Además considerar que el úmero es de instrucciones y no de
bytes.
Solución 1.
00110100010101010100001101000010
Respuesta:
En este caso, por comenzar con cero la secuencia,se trata de un numero entero positivo.Para llegar a
conocer este número, primero pasamos la secuencia a su equivalente hexadecimal, para luego
transformarlo a entero equivalente decimal; el procedimiento se muestra a continuación:
2
ELO311 Tarea 02 02/99
Respuesta:
Ori $s5,$v0,0x4342
Lo que se muestra a continuacion, es la estructura del formato I, especificamente para nuestro ejemplo:
3
ELO311 Tarea 02 02/99
2.- En el programa existen algunos registros que como son temporales del lazo, deben ser guardados.
Estos registros son : $t0, $t3, $t4.
Además conviene guardar la información que está en el stack pointer y en el registro $ra, por si
se modifican dentro de la subrutina.
Hay registros auxiliares y otros que sirven para pasar los parámetros, que no se justifica
guardarlos porque son parte de los valores que se alteran.
.text
.globl main
main:
jal HaceAlgo
lw $ra,4($sp)
lw $fp,8($sp)
lw $t0,12($sp)
lw $t3,16($sp)
lw $t4,20($sp)
addu $sp,$sp,24
add $t4, $v0, $t4
lw $t5, 0($v1)
add $t4, $t5, $t4
addi $t3, $t3, -4
addi $t0, $t0, -1
slti $t6, $t0, 5
beq $t6, $0, Loop
4
ELO311 Tarea 02 02/99
Expresar en hexadecimal.
Obs. El simulador ensambla mal los direccionamientos de los branch, sino se emplea el modi bare-
machine.
La forma correcta de efectuarlos es tomando la dirección de la instrucción siguiente al branch, y a ésta
dirección sumarle el número con signo establecido en el campo inmediato. Además considerar que el
número es de instrucciones y no de bytes.
Ensamblando a mano:
5
ELO311 Tarea 02 02/99
Se puede apreciar claramente el error que comete el simulador Spim ( lo que está marcado con
rojo), siendo correcta la instrucción que fue ensamblada a mano y está marcada con verde.
Solución 2.
1. Dada la secuencia de bits: 0011 0100 0101 0101 0100 0011 0100 0010
b) La instrucción MIPS que representa es: (se utilizó la tabla para ensamblar instrucciones del manual
del programador)
Si consideramos que la sintaxis para la instrucción ori es: ori Dst, Fte1, Inm16 , entonces
llegamos a que la secuencia de bits en cuestión corresponde a la instrucción:
2. Quisimos realizar una primera aproximación con los conocimientos obtenidos a la fecha. El desarrollo
logrado es el siguiente:
6
ELO311 Tarea 02 02/99
Se entiende del enunciado que se desea hacer un programa que salve y otro que luego restaure
ciertos registros. En particular t1, a1, t2, a0, a2, a3.
Se supone que fP debe apuntar al inicio del segmento de datos en el stack, disponible a la
función.
Deseamos guardar seis registros. Como éstos son de 32 bits, necesitamos 6 palabras o
equivalentemente 24 bytes.
El stack crece hacia direcciones más bajas.
Los códigos para salvar y para restaurar los registros son, respectivamente:
7
ELO311 Tarea 02 02/99
8
ELO311 Tarea 02 02/99
9
ELO311 Tarea 02 02/99
Solución 3.
Expresado en hexadecimal:
Observando los 6 primeros bits (los mas significativos), y compararlos con los bits de operación de
las distintas instrucciones señaladas en el manual del programador MIPS, se concluye que dicha
secuencia de bits de operación corresponde a la instrucción ori, esta instrucción utiliza el formato I
para ser ensamblada,es decir:
Transferencias: I
Op 6 Rs 5 Rt 5 Inmediato 16
Op = 001101.
Rs = 00010 que equivale al registro $2 = $v0
Rt = 10101 que equivale al registro $21 = $s5
Inmediato 16 = 0100001101000010 que corresponde a la dirección = 0x4342
10
ELO311 Tarea 02 02/99
Escribir el código para salvar y restaurar, para ello es preciso analizar cuidadosamente el código antes y
después del “jal”.
1
jal Hace algo
2
add $t4,$v0,$t4
lw $t5,0($v1)
add $t4,$t5,$t4
addi $t3,$t3,-4
addi $t0,$t0,-1
slti $t6,$t0,5
beq $t6,$0,Loop
Exit:
Es necesario salvar algunos registros antes de invocar la subrutina, para que ésta no escriba sobre ellos,
y al retornar de la subrutina pueda restaurarlos.
Los registros que necesitan ser salvados son los siguientes:
$ t0 : es necesario salvarlo ya que guarda un resultado que será ocupado nuevamente al salir de la
subrutina.
$ t3 : es necesario salvarlo ya que pasa de antes de la subrutina hasta después de ella sin
modificaciones.
$ t4 : al igual que $t0 guarda un resultado y este será ocupado a la salida de la subrutina
11
ELO311 Tarea 02 02/99
No es necesario guardar los demás registros ya que por convenio las funciones trabajan (modifican) los
registros temporales.
addi $sp,$sp,-8
sw $t0,0($sp)
sw $t3,4($sp)
sw $t4,8($sp)
Con esto se da el espacio suficiente para guardar estos tres registros en el stack.
lw $t0,0($sp)
lw $t3,4($sp)
lw $t4,8($sp)
addi $sp,$sp,8
Con esto se restauran los registros y se devuelve el espacio de memoria pedido al stack.
12
ELO311 Tarea 02 02/99
Para ensamblar a mano este código nos basamos en los diferentes formatos que pueden tener las
instrucciones:
Operaciones. R
Op 6 Rs 5 Rt 5 Rd 5 Shamn 6 Funct 5
Transferencias: I
Op 6 Rs 5 Rt 5 Inmediato 16
Saltos: J
Op 6 Dirección 26
Asociando cada registro con su binario equivalente (p.ej. $t0 es el registro 8 = 1000), que en
los jumps el campo de 26 bits se extiende a 32 (4 los saca del primer dígito hexadecimal del PC el
cual es cero y los dos restantes también del PC, considerando que todas las direcciones son múltiplos
de 4) y ayudados por el manual de programación MIPS, podemos representar el código de la siguiente
manera:
#1 main: sub $t0, $0, $0 R 000000 00000 00000 01000 00000 100010 0x00004022
#2 addi $t1, $t0, 1 I 001000 01000 01001 0000 0000 0000 0001 0x21900001
#3 lui $t6, 0xFFFF I 001111 00000 01110 1111 1111 1111 1111 0x3C0EFFFF
#4 ori $t6, $t6, 0xFFFF I 001101 01110 01110 1111 1111 1111 1111 0x35CEFFFF
#5 andi $t5, $t6, 0x5CA3 I 001100 01110 01110 1111 1111 1111 1111 0x31CD5CA3
#6 Loop: slt $t4, $t5, $t1 R 000000 01101 01001 01100 00000 101010 0x01A9602A
#7 bne $t4, $0, End I 000101 01100 00000 0000 0000 0000 0010 0x15800002
#8 sll $t1, $t1, 1 RI 000000 00000 01001 01001 00001 000000 0x00094840
#10 End: add $v0, $t1, $s0 R 000000 01001 00000 00010 00000 100000 0x01201020
13
ELO311 Tarea 02 02/99
Ejemplo de ensamblaje:
Formato R:
#6 Loop slt $t4, $t5, $t1
- El OP = 000000
- RS: fuente 1= $t5 = registro número 13 = 01101
- RT: fuente 2= $t1 = registro número 9 = 01001
- RD: destino = $t4 = registro número 12 = 01100
- Shamt = 00000
- Funct =101010
14