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

Revision [3162]

Last edited on 2017-10-24 06:19:23 by CamilDemetrescu
Deletions:
==Esercizio 1 (es1 seconda esercitazione IA32)==
Scrivere una funzione ##void cancspazi(char* s)## che elimina tutti gli spazi da una stringa ##s## e tradurla poi in IA32. Scrivere la soluzione nel file ##es2.s##.
Usare il seguente programma di prova:
%%(c;es2-main.c)
#include
void cancspazi(char* s);
int main() {
char s1[] = "obi wan kenobi ";
char s2[] = "obiwankenobi";
char s3[] = " leila luke ";
char s4[] = "";
cancspazi(s1);
cancspazi(s2);
cancspazi(s3);
cancspazi(s4);
printf("\"%s\" (corretto: \"obiwankenobi\")\n", s1);
printf("\"%s\" (corretto: \"obiwankenobi\")\n", s2);
printf("\"%s\" (corretto: \"leilaluke\")\n", s3);
printf("\"%s\" (corretto: \"\")\n", s4);
return 0;
}
%%
Compilare come al solito con ##gcc -m32 -g es2.s es2-main.c -o es2##. In caso di problemi debuggare con gdb.
Soluzione:
%%(c;es2.s)
# void cancspazi(char* s) {
# char* p = s;
# do if (*s!=' ') *p++ = *s;
# while (*s++!=0);
# }
.globl cancspazi
cancspazi: # s <-> eax, p <-> ecx
movl 4(%esp), %eax # eax = s
movl %eax, %ecx # ecx = p = s
jmp S # goto S
L: incl %eax # s++
S: movb (%eax), %dl # dl = *s
cmpb $32, %dl # if (dl == ' ')
je L # goto L
movb %dl, (%ecx) # *p = dl
incl %ecx # p++
testb %dl, %dl # if (dl!=0)
jne L # goto L
ret
%%
==Esercizio 2 (es2 dell'esonero di prova)==
Tradurre in IA32 la funzione C ##fix##.
%%(c;fix.c)
int media(int,int);
void fix(const int* u, int* v, int n) {
int i;
for (i=0; i int m = media(u[i],u[i+1]);
if (m > media(v[i],v[i+1])) v[i]=m;
}
}
%%
%%(c; main.c)
#include
void fix(int* u, const int* v, int n);
int main() {
int a[] = { 10, 20, 30, 40 };
int b[] = { 0, 25, 28, 30 };
fix(a,b,4);
printf("%d|%d|%d|%d (corretto=15|25|35|30)\n",
b[0], b[1], b[2], b[3]);
return 0;
}
%%
%%(c;media.s)
.globl media
media:
movl 8(%esp), %eax
addl 4(%esp), %eax
xorl %ecx, %ecx
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
ret
%%
Soluzione:
%%(c;fix.s)
.globl fix
fix:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp), %ebx # u
movl 20(%esp), %esi # v
xorl %edi, %edi # i
L: movl 24(%esp), %ecx # rileggo n ad ogni iterazione: media() sporca %ecx
decl %ecx
cmpl %ecx, %edi
jge E
subl $8, %esp
movl 4(%ebx, %edi, 4), %eax # u[i+1]
movl %eax, 4(%esp)
movl (%ebx, %edi, 4), %eax # u[i]
movl %eax, (%esp)
call media
addl $8, %esp
pushl %eax # m
subl $8, %esp
movl 4(%esi, %edi, 4), %eax # v[i+1]
movl %eax, 4(%esp)
movl (%esi, %edi, 4), %eax # v[i]
movl %eax, (%esp)
call media
addl $8, %esp
popl %edx # m
incl %edi # i++
cmpl %eax, %edx #
jle L
movl %edx, -4(%esi, %edi, 4) # i è stato incrementato quindi -4
jmp L
E: popl %edi
popl %esi
popl %ebx
ret
%%
== Esercizio 3 (es2, compito C, esonero 2016/2017)==
%%(c;es.c)
void arrayCrossMean(unsigned* x, unsigned* y, unsigned* z, unsigned n) {
unsigned* end = x+n;
y = y+n-1;
while (x < end) {
*z = *x + *y;
if (*z) *z = (*z) >> 1;
x++, z++, y--;
}
}
%%
%%(c;main.c)
#include
void arrayCrossMean(unsigned* x, unsigned* y, unsigned* z, unsigned n);
void printArray(unsigned* v, unsigned n) {
printf("{");
int i = 0;
for (i=0; i printf("%u, ", v[i]);
printf("%u", v[i]);
printf("}");
}
int main() {
unsigned z[5];
unsigned x1[4] = {1, 2, 0, 4};
unsigned y1[4] = {2, 0, 3, 5};
printf("Test 1:\nx: ");
printArray(x1, 4);
printf("\ny: ");
printArray(y1, 4);
arrayCrossMean(x1, y1, z, 4);
printf("\nz: ");
printArray(z, 4);
printf("\nRisultato atteso:\nz: {3, 2, 0, 3}\n");
unsigned x2[5] = {0, 7, 1, 0, 3};
unsigned y2[5] = {2, 0, 1, 2, 1};
printf("\nTest 2:\nx: ");
printArray(x2, 5);
printf("\ny: ");
printArray(y2, 5);
arrayCrossMean(x2, y2, z, 5);
printf("\nz: ");
printArray(z, 5);
printf("\nRisultato atteso:\nz: {0, 4, 1, 0, 2}\n");
return 0;
}
%%
Soluzione:
%%(c;es.s)
.globl arrayCrossMean
arrayCrossMean:
pushl %ebx
pushl %edi
pushl %esi
movl 16(%esp), %ebx # x
movl 20(%esp), %edi # y
movl 24(%esp), %esi # z
movl 28(%esp), %ecx # n
leal (%ebx, %ecx, 4), %eax # end = x+n
leal -4(%edi, %ecx, 4), %edi # y = y+n-1
W: cmpl %eax, %ebx
jge E
movl (%ebx), %edx # *x
addl (%edi), %edx # *x+*y
movl %edx, (%esi) # *z = *x + *y
testl %edx, %edx
jz U
shrl %edx
movl %edx, (%esi)
U: addl $4, %ebx
addl $4, %esi
subl $4, %edi
jmp W
E: popl %esi
popl %edi
popl %ebx
ret
%%


Revision [3161]

Edited on 2017-10-23 17:30:52 by CamilDemetrescu
Additions:
== Esercizio 3 (es2, compito C, esonero 2016/2017)==
Deletions:
== Esercizio 3 (es2, compito C, esonero 2016/2017)


Revision [3122]

Edited on 2017-10-21 13:15:57 by EmilioCoppa
Additions:
== Esercizio 3 (es2, compito C, esonero 2016/2017)
Deletions:
== Esercizio 3 (es2, compito C, primo appello 2016/2017)


Revision [3121]

Edited on 2017-10-21 13:15:11 by EmilioCoppa
Additions:
== Esercizio 3 (es2, compito C, primo appello 2016/2017)
Deletions:
== Esercizio 3 (es2, compito B, primo appello 2016/2017)


Revision [3120]

Edited on 2017-10-21 13:12:23 by EmilioCoppa
Additions:
== Esercizio 3 (es2, compito B, primo appello 2016/2017)
%%(c;es.c)
void arrayCrossMean(unsigned* x, unsigned* y, unsigned* z, unsigned n) {
unsigned* end = x+n;
y = y+n-1;
while (x < end) {
*z = *x + *y;
if (*z) *z = (*z) >> 1;
x++, z++, y--;
%%(c;main.c)
void arrayCrossMean(unsigned* x, unsigned* y, unsigned* z, unsigned n);
void printArray(unsigned* v, unsigned n) {
printf("{");
int i = 0;
for (i=0; i printf("%u, ", v[i]);
printf("%u", v[i]);
printf("}");
unsigned z[5];
unsigned x1[4] = {1, 2, 0, 4};
unsigned y1[4] = {2, 0, 3, 5};
printf("Test 1:\nx: ");
printArray(x1, 4);
printf("\ny: ");
printArray(y1, 4);
arrayCrossMean(x1, y1, z, 4);
printf("\nz: ");
printArray(z, 4);
printf("\nRisultato atteso:\nz: {3, 2, 0, 3}\n");
unsigned x2[5] = {0, 7, 1, 0, 3};
unsigned y2[5] = {2, 0, 1, 2, 1};
printf("\nTest 2:\nx: ");
printArray(x2, 5);
printf("\ny: ");
printArray(y2, 5);
arrayCrossMean(x2, y2, z, 5);
printf("\nz: ");
printArray(z, 5);
printf("\nRisultato atteso:\nz: {0, 4, 1, 0, 2}\n");
%%(c;es.s)
.globl arrayCrossMean
arrayCrossMean:
movl 16(%esp), %ebx # x
movl 20(%esp), %edi # y
movl 24(%esp), %esi # z
movl 28(%esp), %ecx # n
leal (%ebx, %ecx, 4), %eax # end = x+n
leal -4(%edi, %ecx, 4), %edi # y = y+n-1
W: cmpl %eax, %ebx
movl (%ebx), %edx # *x
addl (%edi), %edx # *x+*y
movl %edx, (%esi) # *z = *x + *y
testl %edx, %edx
jz U
shrl %edx
movl %edx, (%esi)
U: addl $4, %ebx
addl $4, %esi
subl $4, %edi
jmp W
E: popl %esi
popl %edi


Revision [3118]

Edited on 2017-10-21 12:42:13 by EmilioCoppa

No differences.

Revision [3117]

Edited on 2017-10-21 12:41:56 by EmilioCoppa
Additions:
Tradurre in IA32 la funzione C ##fix##.
%%(c;fix.c)
Soluzione:
%%(c;fix.s)
.globl fix
fix:
pushl %ebx
pushl %esi
pushl %edi
movl 16(%esp), %ebx # u
movl 20(%esp), %esi # v
xorl %edi, %edi # i
L: movl 24(%esp), %ecx # rileggo n ad ogni iterazione: media() sporca %ecx
decl %ecx
cmpl %ecx, %edi
jge E
subl $8, %esp
movl 4(%ebx, %edi, 4), %eax # u[i+1]
movl %eax, 4(%esp)
movl (%ebx, %edi, 4), %eax # u[i]
movl %eax, (%esp)
call media
addl $8, %esp
pushl %eax # m
subl $8, %esp
movl 4(%esi, %edi, 4), %eax # v[i+1]
movl %eax, 4(%esp)
movl (%esi, %edi, 4), %eax # v[i]
movl %eax, (%esp)
call media
addl $8, %esp
popl %edx # m
incl %edi # i++
cmpl %eax, %edx #
jle L
movl %edx, -4(%esi, %edi, 4) # i è stato incrementato quindi -4
jmp L
E: popl %edi
popl %esi
popl %ebx
Deletions:
%%(c;media.c)


Revision [3116]

Edited on 2017-10-21 12:38:18 by EmilioCoppa
Additions:
%%(c;media.c)
%%(c;media.s)
.globl media
media:
movl 8(%esp), %eax
addl 4(%esp), %eax
xorl %ecx, %ecx
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
Deletions:
%%(c;fix.c)


Revision [3115]

Edited on 2017-10-21 12:37:29 by EmilioCoppa
Additions:
==Esercizio 1 (es1 seconda esercitazione IA32)==
==Esercizio 2 (es2 dell'esonero di prova)==
%%(c; main.c)
void fix(int* u, const int* v, int n);
int a[] = { 10, 20, 30, 40 };
int b[] = { 0, 25, 28, 30 };
fix(a,b,4);
printf("%d|%d|%d|%d (corretto=15|25|35|30)\n",
b[0], b[1], b[2], b[3]);
Deletions:
==Esercizio 1==
==Esercizio 2==


Revision [3114]

Edited on 2017-10-21 12:35:52 by EmilioCoppa
Additions:
%%(c;es2.s)
# void cancspazi(char* s) {
# char* p = s;
# do if (*s!=' ') *p++ = *s;
# while (*s++!=0);
# }
.globl cancspazi
cancspazi: # s <-> eax, p <-> ecx
movl 4(%esp), %eax # eax = s
movl %eax, %ecx # ecx = p = s
jmp S # goto S
L: incl %eax # s++
S: movb (%eax), %dl # dl = *s
cmpb $32, %dl # if (dl == ' ')
je L # goto L
movb %dl, (%ecx) # *p = dl
incl %ecx # p++
testb %dl, %dl # if (dl!=0)
jne L # goto L
ret


Revision [3113]

The oldest known version of this page was created on 2017-10-21 12:34:56 by EmilioCoppa
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0336 seconds