0% encontró este documento útil (0 votos)
9 vistas2 páginas

Traducción de C a Ensamblador: Estructuras

Este documento presenta un problema de traducción de código C a ensamblador MIPS. Se proporcionan dos funciones en C (f y main) y se piden detalles sobre su traducción a ensamblador MIPS considerando reglas sobre el uso de registros y áreas de memoria. Se dividen las preguntas en partes sobre la codificación de datos globales, creación de marcos de pila, uso de registros y traducción de las instrucciones de cada función.

Cargado por

Susana Rebellón
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
9 vistas2 páginas

Traducción de C a Ensamblador: Estructuras

Este documento presenta un problema de traducción de código C a ensamblador MIPS. Se proporcionan dos funciones en C (f y main) y se piden detalles sobre su traducción a ensamblador MIPS considerando reglas sobre el uso de registros y áreas de memoria. Se dividen las preguntas en partes sobre la codificación de datos globales, creación de marcos de pila, uso de registros y traducción de las instrucciones de cada función.

Cargado por

Susana Rebellón
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

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

También podría gustarte