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

Soluzione di alcuni degli esercizi di traduzione da C ad Assembly IA32


Testi esercizi

Esercizio 13

matsum.s
# // programma originario
# int matsum(int** v, int n) {
#     int i, j, s = 0;
#     for (i=0; i<n; ++i)
#         for (j=0; j<n; ++j)
#             s += v[i][j];
#     return s;
# }

# // prima forma equivalente: for -> while
# int matsum(int** v, int n) {
#     int i, j, s;
#     s=0;        
#     i=0;
#     while (i<n) {
#         j=0;
#         while (j<n) {
#             s += v[i][j];
#             j++;
#         }
#         i++;
#     }
#     return s;
# }

# // seconda forma equivalente: while -> if ... goto
# int matsum(int** v, int n) { // v <-> esi, n <-> ebx
#     int i, j, s, *r;         // i <-> ecx, j <-> edx, s <-> eax, r=v[i] <-> edi
#     s=0;        
#     i=0;
# L1: if (i>=n) goto E1;
#     j=0;
#     r = v[i];
# L2: if (j>=n) goto E2;
#     s += r[j];
#     j++;
#     goto L2;
# E2: i++;
#     goto L1;
# E1: return s;
# }

.globl matsum

matsum:
    pushl %esi 
    pushl %edi
    pushl %ebx
   
    movl 16(%esp), %esi
    movl 20(%esp), %ebx

    xorl %eax, %eax             #     s=0
    xorl %ecx, %ecx             #     i=0;
L1: cmpl %ebx, %ecx             # L1: if (i-n >= 0)
    jge E1                      #         goto E1;
    xorl %edx, %edx             #     j=0;
    movl (%esi, %ecx, 4), %edi  #     r = v[i];
L2: cmpl %ebx, %edx             # L2: if (j-n >= 0)
    jge E2                      #         goto E2;
    addl (%edi, %edx, 4), %eax  #     s += r[j];
    incl %edx                   #     j++;
    jmp L2                      #     goto L2;
E2: incl %ecx                   # E2: i++;
    jmp L1                      #     goto L1;

E1: popl %ebx
    popl %edi
    popl %esi
    ret
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0398 seconds