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