Sistemi di Calcolo

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2017-2018

HomePage | Avvisi | Diario lezioni | Programma | Materiale didattico | Esami | Forum | Login

Soluzioni esercitazione 2 (10 novembre 2015)


Esercizio 1 (istruzione if, parametri senza indirezione)

es1.s
# 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)

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)

es3.s
# 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)

es4.s
# 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 è:

es5.c
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 è:

es6.c
int mistero(unsigned short* v, unsigned n) {
    while (n-- > 1) if (v[n-1] > v[n]) return 0;
    return 1;
}


Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0816 seconds