Soluzione di alcuni degli esercizi di traduzione da C ad Assembly IA32
Testi esercizi
Esercizio 13
# // 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