Quiz 1. ELO311 Estructuras de Computadores. Segundo Semestre 2008.
Para el siguiente programa en C:
int g1=1;
int g2=2;
int f(int ar1, int ar2)
{ register int lo1= 3;
while( ar2 > ar1)
{ lo1++;
ar1=ar1+lo1;
}
return(ar1+4);
}
int main(void)
{ register int lo2=4;
lo2=lo2+f(2,10);
g2++;
lo2--;
return (lo2);
}
Considerando las siguientes reglas:
La zona de datos globales comienza en la dirección 0x10010000.
La zona donde se almacenan instrucciones comienza en 0x00400000.
El primer argumento de una función se pasa en el registro a0.
El segundo argumento de una función se pasa en el registro a1.
Las variables locales se mantienen en registros s. Al ingresar a las funciones se salvan los
registros s, y al salir de éstas se restauran los valores salvados.
El retorno de las funciones se efectúa en el registro v0.
Los registros s, se ocupan en el orden: s8, s7, s6,...
Los registros t, se ocupan en el orden: t8, t7, t6,...
1. Traducir a lenguaje assembler simbólico la función f.
a) Codificación de zona de datos: 10 puntos
b) Creación y destrucción del frame de f: 10 puntos.
c) Salvar y restaurar registros s, para variables locales de f: 10 puntos.
d) Inicio de variables locales y condición para el while: 10 puntos
e) Bloque de acciones del while y retorno de la función: 10 puntos
2. Traducir a lenguaje assembler simbólico la función main.
a) Creación y destrucción del frame de main: 10 puntos.
b) Salvar y restaurar registros en función main: 10 puntos.
c) Inicio de variables locales y carga de argumentos para llamar a f: 10 puntos.
d) Acciones con variables globales en main: 10 puntos
e) Acciones con variables locales y retorno de la función main: 10 puntos
Solución.
variables = 0x1001 ##Define equivalencia
.sdata
.align 2
g1: .word 0x1
g2: .word 0x2
.text
.align 2
f: addiu $sp,$sp,-8 ##arma frame de f
sw $s8,0($sp) ##salva s8
ori $s8,$zero,3 ##inicia lo1
test: slt $t8,$a0,$a1 ## ar1<ar2
beq $t8,$zero,endwh ##si no es menor termina while
addiu $s8,$s8,1 ##lo1++
add $a0,$a0,$s8 ##ar1+=lo1
j test
endwh: addiu $v0,$a0,4 ##retorna ar1+4
lw $s8,0($sp) ##restaura s8
addiu $sp,$sp,8 ##desarma frame
jr $ra
main: addiu $sp,$sp,-24 ##arma frame
sw $s8,16($sp) ##salva s8
sw $ra,20($sp) ##salva ra
ori $s8,$zero,4 ##inicia lo2
ori $a0,$zero,2 ##carga argumentos
ori $a1,$zero,10
jal f
add $s8,$s8,$v0 ##lo2+=f(2,10)
lui $t8,variables ##apunta a zona de datos
lw $t7,4($t8) ##carga g2 en t7
addiu $t7,$t7,1 ##t7++
sw $t7,4($t8) ##salva g2
addiu $v0,$s8,-1 ##retorna lo2--
lw $s8,16($sp) ##recupera s8
lw $ra,20($sp) ##recupera ra
addiu $sp,$sp,24 ##desarma frame
jr $ra