Soluzioni esercitazione 3 (17 novembre 2015)
Esercizio 1 (istruzione SETcc)
# 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)
# 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)
# 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)
# 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)
# 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