Additions:
int mistero(unsigned short* v, unsigned n) {
while (n-- > 1) if (v[n-1] > v[n]) return 0;
return 1;
Additions:
# unsigned sum1N(unsigned n) {
# unsigned sum = 0;
# while (n>=1) sum += n--;
# return sum;
.globl sum1N
sum1N:
movl 4(%esp), %ecx # ecx = n
loop:
cmpl $1, %ecx # if (ecx < 1) goto exit
jb exit
addl %ecx, %eax # eax += ecx
decl %ecx # ecx--
jmp loop # goto loop
# 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
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];
}
Fra le diverse soluzioni C possibili, quella da cui il programma IA32 è stato derivato mediante ##gcc## è:
Additions:
.globl max
Deletions:
.globl max
Additions:
==Esercizio 2 (istruzione if, parametri con indirezione)==
%%(asm;es2.s)
# 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)==
%%(asm;es3.s)
==Esercizio 4 (istruzione while, uguaglianza di stringhe C)==
%%(asm;es4.s)
==Esercizio 5==
%%(asm;es5.c)
==Esercizio 6==
%%(asm;es6.c)