Solución Primer Quiz. 21-08-2003 1 Se tiene el siguiente programa

Anuncio
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO311 Estructuras de Computadores
Primer Quiz
Se tiene el siguiente programa en C.
char *source = "ABCDEF";
char dest[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0'};
char *aux;
int lgr = 0;
int x = 0 ;
lw $24,source
sw $24,aux
b L.4
L.3:
lw $24,lgr
la $24,1($24)
sw $24,lgr
L.4:
lw $24,aux
la $15,1($24)
sw $15,aux
lb $24,($24)
bne $24,$0,L.3
int main(void)
{
/* parte b) */
aux = source;
for(x = 0; x < lgr; x++) *(dest + x ) = *(aux + lgr - 1 - x);
*(dest + x +1) ='\0';
return(0);
/* parte c */
}
a) Realice las definiciones de datos, en assembler, de las variables globales definidas
en el programa C.
El valor decimal equivalente de ‘a’ es 97. El valor decimal equivalente de ‘A’ es 65.
20 puntos
b) Indique el código equivalente en “C” de la sentencias en assembler del recuadro.
40 puntos
c) Traduzca a assembler la sentencia for, asumiendo que los valores de las variables
están ya almacenadas en los siguientes registros:
x en $s8, lgr en $s7, dest en $s6, aux en $s5.
40 puntos
Solución Primer Quiz.
21-08-2003
1
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO311 Estructuras de Computadores
Primer Quiz
Solución.
a) Definiciones de datos
.globl source
.sdata
.align 2
source:
.word L.1
#source es un puntero: almacena la dirección del primer char
.globl dest
.data
.align 0
dest:
#dest es un puntero constante. Es la dirección del primer char.
.byte 97
# char dest[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0'};
.byte 98
.byte 99
.byte 100
.byte 101
.byte 102
.byte 0
.globl lgr
.sdata
.align 2
lgr:
.word 0x0
# int lgr = 0;
.globl x
.sdata
.align 2
x:
.word 0x0
int x = 0 ;
…….
……
.globl aux
.comm aux,4
#global no inicializada
.rdata
.align 0
L.1:
.byte 65
# char *source = "ABCDEF";
.byte 66
.byte 67
.byte 68
.byte 69
.byte 70
.byte 0
Solución Primer Quiz.
21-08-2003
2
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO311 Estructuras de Computadores
Primer Quiz
b) Equivalente C del recuadro
lw $24,source
sw $24,aux
b L.4
L.3:
lw $24,lgr
la $24,1($24)
sw $24,lgr
L.4:
lw $24,aux
la $15,1($24)
sw $15,aux
lb $24,($24)
bne $24,$0,L.3
aux = source ;
lgr++
$15 = aux +1
o aux++
$24 = *aux con el valor de aux antes de su incremento
# verifica si el contenido de registro $24 no es cero salta a L.3, en
# otro caso continua con la instrucción siguiente
Analizando la el conjunto de instrucciones en assembler, se observa que existe un bloque
que se repite dependiendo de una condición. Esto puede se equivalente a una proposición
while o for.
Equivalente en base a while:
aux = source;
while(*aux++) lgr++ ;
Equivalente en base a for:
for(aux = source ; *aux ; aux++) lgr++ ;
Solución Primer Quiz.
21-08-2003
3
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO311 Estructuras de Computadores
Primer Quiz
d) Traduzca a assembler
for(x = 0; x < lgr; x++) *(dest + x ) = *(aux + lgr - 1 - x);
Asumiendo que: x en $s8, lgr en $s7, dest en $s6, aux en $s5.
for :
addi
slt
beq
add
addi
sub
lb
add
sb
addi
j
$s8, $zero, 0
$t0, $s8, $s7
$t0, $zero, endfor
$t1, $s5, $s7
$t1, $t1, -1
$t1, $t1, $s8
$t2, 0($t1)
$t3, $s6, $s8
$t2, 0($t3)
$s8, $s8, 1
for
# $s8 = 0 (x = 0);
# $t0 = 1 si $s8 < $s7 (x < lgr)
# salta a endfor si $t0 = 0
# $t1 = $s5 + $s7 ($t1 = aux + lgr)
# $t1 = $t1 –1 ($t1 = aux + lgr – 1)
# $t1 = $t1 - $s8 ($t1 = aux + lgr –1 – x)
# $t2 = MEM[$t1] ($t2 = *( aux + lgr –1 – x)
# $t3 = $s6 + $s8 ( $t3 = dest + x)
# MEM[$t3] = $t2 (*$t3 = * $t2)
# $s8 = $s8 +1 (x++)
endfor:
Aclaración: El registro $s8 en MIPS no existe.
SPIM reconoce el registro $s8 como el registro $30 (que es $fp en MIPS)
Código generado por lcc
.set reorder
.globl source
.sdata
.align 2
source:
.word L.1
.globl dest
.data
.align 0
dest:
.byte 97
.byte 98
.byte 99
.byte 100
.byte 101
.byte 102
.byte 0
.globl lgr
.sdata
Solución Primer Quiz.
21-08-2003
4
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO311 Estructuras de Computadores
Primer Quiz
.align 2
lgr:
.word 0x0
.globl x
.sdata
.align 2
x:
.word 0x0
.globl main
.text
.text
.align 2
.ent main
main:
.frame $sp,0,$31
lw $24,source
sw $24,aux
b L.4
L.3:
lw $24,lgr
la $24,1($24)
sw $24,lgr
L.4:
lw $24,aux
la $15,1($24)
sw $15,aux
lb $24,($24)
bne $24,$0,L.3
lw $24,source
sw $24,aux
sw $0,x
b L.9
L.6:
lw $24,x
lw $15,lgr
lw $14,aux
addu $15,$15,$14
la $15,-1($15)
subu $15,$15,$24
lb $15,($15)
sb $15,dest($24)
L.7:
lw $24,x
la $24,1($24)
#parte b
#parte b
# aux = source;
# x=0
# salta a condición
#Inicio bloque
#$15 = lgr+aux
#$15 = lgr+aux-1
#$15 = lgr+aux-1-x
#$15 = *(lgr+aux-1-x)
# *(dest+x) = $15
#reinicio
Solución Primer Quiz.
21-08-2003
5
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO311 Estructuras de Computadores
Primer Quiz
sw $24,x
L.9:
lw $24,x
lw $15,lgr
blt $24,$15,L.6
lw $24,x
sb $0,dest+1($24)
move $2,$0
L.2:
j $31
.end main
.globl aux
.comm aux,4
.rdata
.align 0
L.1:
.byte 65
.byte 66
.byte 67
.byte 68
.byte 69
.byte 70
.byte 0
# x++
#genera condición
# if( x< lgr) repite bloque
#*(dest + x +1) ='\0';
#return 0
Solución Primer Quiz.
21-08-2003
6
Descargar