Considere que código ascii: `A` → 65 y `0` → 48. Puede usar macro

Anuncio
Certamen 1.
ELO311 Estructuras de Computadores.
Segundo Semestre 2009
1. Dado el siguiente programa en C (60 ptos)
int n = 28;
char a = ‘0’;
char b = ’0’;
char *p;
void itoah(register int x, register char *y) {
register int t = 0;
t = x + ‘0’;
if(t > ‘9’) t += 7;
*y = t; return;
}
int main(void) {
register int z = 0;
p = &a; z = n >> 4;
itoah(z, p);
p = &b; z = n & 0x0f;
itoah(z, p);
return 0;
}
2.
Considere que código ascii: 'A' → 65 y '0'
→ 48. Puede usar macro “la”. Use
registro $s0 para t en itoah y z en main.
Use registros temporales a partir de $t0.
a) Muestre contenido de la zona de
datos estáticos. (10 pts)
b) Dibuje el uso del stack para main e
itoah,
justifique
el
espacio
asignado. (10 pts)
c) Traducir a assembler
función main. (20 pts)
MIPS
d) Traducir a assembler
función itoah. (20 pts)
MIPS
Dado el siguiente código en Assembler MIPS, indique su equivalente en Lenguaje C. (40 pts)
add $t1,$zero,$zero
add $t3,$zero,$zero
lui $t1, 4096
lw $t2, 0($t1)
arriba: addi $t3, $t3, 1
bne $t3, $t2, arriba
Solución:
Pregunta 1 :
.data
n:
.word 0x1c
a1:
.byte 0x30
a2:
.byte 0x30
.align 2
p:
.word 0x0
.globl itoah
.text
itoah:
addu $sp,$sp,-4
sw $s0,0($sp)
# zona de datos estaticos (10 puntos)
TOS de itoah
# comienzo de la funcion itoah (20 puntos)
# abrir stack frame para itoah
# guardar $s0 en el stack de itoah
addi $s0, $a0, 48
addi $t0, $zero, 57
slt $t1, $t0, $s0
beq $t1, $zero, endif
addi $s0, $s0, 7
endif:
sb $s0,0($a1)
# $s0 = x + '0'
# $t0 = '9'
# $t1 =1 si $t0 < $S0 ('9' < t)
lw $s0,0($sp)
addu $sp,$sp,4
jr $ra
# recuperar $s0 desde el stack
# desarmar el stack frame de itoah
# retornar a main
TOS de itoah
$s0 de main
# *y = t = $s0
TOS de itoah
.end itoah
.globl main
.text
.align 2
.ent main
main:
addu $sp,$sp,-8
sw $s0,4($sp)
sw $ra,0($sp)
add $s0,$zero, $zero
la $t0, a1
la $t1, p
sw $t0, 0($t1)
la $t2, n
# comienzo de main (20 puntos)
# abrir stack frame para main
# guardar $s0 en el stack de main
# guardar $ra en el stack de main
# $t0 = &a1
# $t1 = &p
# p = &a
TOS de main
TOS de main
$s0 del llamante a
main
$ra del llamante a
main
lw $t3, 0($t2)
sra $s0,$t3, 4
add $a0, $zero, $s0
lw $a1, 0($t1)
jal itoah
la $t0, a2
la $t1, p
sw $t0, 0($t1)
la $t2, n
lw $t3, 0($t2)
andi $s0, $t3, 15
add $a0, $zero, $s0
lw $a1, 0($t1)
jal itoah
add $v0,$zero, $zero
# $t3 = n
# sra conceptualmente correcto, se accepta srl
# $a0 = z
# $a1 = p
lw $s0,4($sp)
lw $ra,0($sp)
addu $sp,$sp,8
jr $ra
.end main
# recuperar $s0 desde el stack frame de main
# recuperar $ra desde el stack frame de main
# desarmar el stack frame de itoah
# retornar a la funcion llamante de main
# $t0 = &a2
# $t1 = &p
# p = &b
# $t3 = n
# $s0 = n & 0x0f
# $a0 = z
# $a1 = p
# setear registro de retorno a 0
TOS de main
Pregunta 2 :
En C:
Dado la existencia de una instrucción lui y lw se puede inferir que se esta cargando un valor de una
variable declarada en memoria estática (variable global) por ejemplo en la dirección
0x10000000 x: .word 0x????????
# x contiene “algún valor”
Ahora dado que la condición se verifica después de ingresar al bloque a partir del rótulo arriba se
puede pensar en una estructura del tipo do-while
int x=0x????????;
(10 ptos)
y = 0;
do{
(10 ptos) // y = $t3
y = y +1;
}while(y != x)
(10 ptos)
(10 ptos)
Descargar