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 3 (17 novembre 2015)


Esercizio 1 (istruzione SETcc)

es1.s
# int testcc(short x, short y) {
#     return 0<=x && x<y;
# }

.globl testcc

testcc:
    movw 4(%esp), %cx # x
    movw 8(%esp), %dx # y
    testw %cx, %cx
    setge %al
    cmpw %dx, %cx
    setl %cl
    andb %cl, %al
    movzbl %al, %eax
    ret


Esercizio 2 (istruzione CMOVcc)

es2.s
# int myabs(int x) {
#     return x<0 ? -x : x;
# }

.globl myabs

myabs:
    movl 4(%esp), %eax
    negl %eax
    cmovll 4(%esp), %eax
    ret


Esercizio 3 (chiamata a funzione senza parametri)

es3.s
# int uno();
# int somma_uno_a(int x) {
#     return x+uno();
# }

.globl somma_uno_a

somma_uno_a:
    call uno
    addl 4(%esp), %eax
    ret


Esercizio 4 (chiamata a funzione con parametri)

es4.s
# int prod(int x, int y, int z);
# int f(int x, int y, int z, int w) {
#     return prod(x,y,z)+w;
# }

.globl f

f:
    subl $12, %esp       # prologo

    movl 16(%esp), %eax  # x
    movl 20(%esp), %ecx  # y
    movl 24(%esp), %edx  # z
    movl %eax, (%esp)    # passa x
    movl %ecx, 4(%esp)   # passa y
    movl %edx, 8(%esp)   # passa z
    call prod
    addl 28(%esp), %eax  # somma w

    addl $12, %esp       # epilogo
    ret


Esercizio 5 (chiamata a funzione con parametri in un ciclo)

es5.s
# int doppio(int x);
# int raddoppia(int* v, unsigned n) {
#     unsigned i = 0;
#     while (i<n) {
#         v[i] = doppio(v[i]);
#         i++;
#     }
# }

.globl raddoppia

raddoppia:
    pushl %ebx          # prologo
    pushl %edi
    pushl %esi
    subl $4, %esp       # 4 byte per passaggio parametri
   
    movl 20(%esp), %edi # v
    movl 24(%esp), %ebx # n
    xorl %esi, %esi     # i = 0
   
L:  cmpl %ebx, %esi     # esi ? ebx
    jae E               # if (esi >= ebx) goto E
    movl (%edi,%esi,4), %eax
    movl %eax, (%esp)
    call doppio
    movl %eax, (%edi,%esi,4)
    incl %esi           # i++
    jmp L
   
E:  addl $4, %esp       # epilogo
    popl %esi
    popl %edi
    popl %ebx
    ret
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0780 seconds