Soluzioni esercitazione 2 (10 novembre 2015)
Esercizio 1 (istruzione if, parametri senza indirezione)
# int uguali(short x, short y) {
# int res = 0;
# if (x == y) res = 1;
# return res;
# }
.globl uguali
uguali:
movw 4(%esp), %cx # cx = x
movw 8(%esp), %dx # dx = y
xorl %eax, %eax # eax = 0
cmpw %cx, %dx # if (dx != cx) goto exit
jne exit
movl $1, %eax # eax = 1
exit:
ret # return eax
Esercizio 2 (istruzione if, parametri con indirezione)
# int max(int* x, int* y) {
# if (*x > *y) return *x;
# return *y;
# }
.globl max
max:
movl 4(%esp), %edx # x
movl 8(%esp), %eax # y
movl (%eax), %eax # a=*y
cmpl %eax, (%edx) # *x < *y
jl E
movl (%edx), %eax # a=*x
E: ret
Esercizio 3 (istruzione while, somma dei numeri da 1 a n)
# unsigned sum1N(unsigned n) {
# unsigned sum = 0;
# while (n>=1) sum += n--;
# return sum;
# }
.globl sum1N
sum1N:
movl 4(%esp), %ecx # ecx = n
xorl %eax, %eax # eax = 0
loop:
cmpl $1, %ecx # if (ecx < 1) goto exit
jb exit
addl %ecx, %eax # eax += ecx
decl %ecx # ecx--
jmp loop # goto loop
exit:
ret # return eax
Esercizio 4 (istruzione while, uguaglianza di stringhe C)
# int streq(const char* s1, const char* s2) {
# while (*s1 == *s2)
# if (*s1 == 0) return 1;
# else s1++, s2++;
# return 0;
# }
.globl streq
streq:
movl 4(%esp), %eax
movl 8(%esp), %ecx
L: movb (%eax), %dl
cmpb %dl, (%ecx)
jne Neq
testb %dl, %dl
je Eq
incl %eax
incl %ecx
jmp L
Eq: movl $1, %eax
ret
Neq:xorl %eax, %eax
ret
Esercizio 5
Fra le diverse soluzioni C possibili, quella da cui il programma IA32 è stato derivato mediante
gcc è:
short mistero(short* v, unsigned i, unsigned n) {
if (i>=n) return -1;
return v[i];
}
Esercizio 6
Fra le diverse soluzioni C possibili, quella da cui il programma IA32 è stato derivato mediante
gcc è:
int mistero(unsigned short* v, unsigned n) {
while (n-- > 1) if (v[n-1] > v[n]) return 0;
return 1;
}