Beruflich Dokumente
Kultur Dokumente
Prctica N 1
27/04/2010
1. Ejemplo
==========
Cdigo C
==========
...
char c[LARGO], tmp;
int n = LARGO;
int i, m;
...
m = n/2;
for(i=0; i<m; i++){
tmp = c[i];
c[i] = c[n-1-i];
c[n-1-i] = tmp;
}
...
============================
Cdigo Assembly (optimizado)
============================
#el rtulo D_C contiene la direccin del comienzo de la ristra c
#el rtulo D_N contiene la direccin de la variable n
FOR:
FIN:
la $t0, D_C
la $t1, D_N
lw $t1, 0($t1)
li $t2, 2
div $t1, $t2
mflo $t2
#
#
#
#
#
#
#
#
#
#
#
addi $t0,$t0,1
addi $t1,$t1,-1
# Suma 1 a $t0
# Resta 1 a $t1
b FOR
# Salta a FOR
...
Pgina 1
2. Ejercicio
============
Cdigo C
============
char *string1, *string2, *p, *end;
int i, len;
...
end = string1;
len = 0;
while (*end != /0) {
end++;
len++;
}
p = string1;
do {
if ((*p > 64) && (*p < 91)) *string2 = *p + 32;
else if ((*p > 96) && (*p < 123)) *string2 = *p - 32;
p++
string2++;
} while (p -1 < end);
===============
Cdido Assembly
===============
#Rtulos DIR_STRING1, DIR_STRING2 son las direcciones donde apuntan los
#punteros string1 y string2. DIR_LEN contiene la posicin de memoria de
#la variable "len".
la $t0, DIR_STRING1
la $t1, DIR_LEN
li $t3, 0
move $t4, $t0
#len = 0
#end = string1
WHILE:
lb $t5, 0($t4)
beq $t5, $zer, FIN_W
addi $t4, $t4, 1
addi $t3, $t3, 1
b WHILE
FIN_W:
sb $t3, 0($t1)
#guarda len
la
li
li
li
$t1,
$t5,
$t6,
$t7,
DIR_STRING2
64
91
96
Pgina 2
li $t8, 123
DO:
lb $t3, 0($t0)
#p = string1
#b si *p <= 64
#b si *p >= 91
#*string2=*p+32
IF2:
#b si *p<=96
#b si *p>=123
#*string2=*p-32
F_IF:
sw $t3, 0($t1)
#p++
#string2++
#p - 1
#b si (p-1 < end)
...
Pgina 3
3. Ejemplo
=========
Cdigo C
=========
int v[10], n; // n argumento funcin
...
int cont = 0;
int i = 0;
while (i<n) {
if (v[i] == 1)
cont++;
i++;
}
...
================
Cdigo Assembly
================
#rotulos C_V y C_N y C_CONT contienen dir. de mem. inicio del vector v,
y variables n y cont.
CUNOS: la
la
li
li
$t0,
$t1,
$t4,
$t5,
C_V
C_N
1
0
#
#
#
#
Carga
Carga
Carga
Carga
addi $t5, 1
# Suma 1 a cont
# Suma 1 a i
# Salta a WHILE
FIN:
...
Pgina 4
4. Ejercicio adicional
=========
Cdigo C
=========
unsigned int vec1[10],vec2[10],vec3[10],sum;
int i;
...
sum = 0;
for(i=0;i<10;i++) {
if (vec1[i] > vec2[i]) vec3[i] = vec1[i] - vec2[i];
else vec3[i] = vec2[i] - vec1[i];
sum = sum + vec3[i];
}
================
Cdigo Assembly
================
Pgina 5