.GLOBAL bSort
.TEXT
# Ordinamento di un vettore per mezzo della tecnica "bubble sort"
#
# Implementazione Java della funzione:
#
# void bSort (int [] vett, int dim) {
# int lim = dim-1;
# int j;
# int i;
# while (lim > 0) {
# j = 0;
# i = 0;
# while (i < lim) {
# if (vett[i] > vett[i+1]) {
# int temp = vett[i+1];
# vett[i+1] = vett[i];
# vett[i] = temp;
# j = i;
# }
# i++;
# }
# lim = j;
# }
# }
#
# record di attivazione della routine "bSort":
#
# | ... |
# +- +---------------+
# R | | lim | <-- -4(%EBP) (variabile d'ambiente)
# E | +---------------+
# C | | EBP vecchio | <-- %EBP (link dinamico)
# O | +---------------+
# R | | ind.ritorno | <-- +4(%EBP) (link statico)
# D | +---------------+
# | | ind.vett | <-- +8(%EBP) (I argomento)
# A | +---------------+
# T | | dim | <-- +12(%EBP) (II argomento)
# T +- +---------------+
# | ... |
#
bSort:
#
#------ prologo -------
#
pushl %ebp # link dinamico
movl %esp, %ebp # base del record d'attivazione
pushl $0 # riserva lo spazio per una
# variabile d'ambiente
pushl %eax #
pushl %ebx # salvataggio dei registri
pushl %ecx # che verranno usati
pushl %esi #
pushl %edi #
#
#---- fine prologo ----
#
movl 8(%ebp), %ebx # mette in EBX ind.vett
movl 12(%ebp), %eax #
decl %eax #
movl %eax, -4(%ebp) # lim = dim-1
ciclo_lim:
cmpl $0, -4(%ebp) # if (lim <= 0)
je fine_lim # then "vai a fine"
movl $0, %ecx # j = 0
movl $0, %esi # i = 0
movl $1, %edi # i+1
ciclo_i:
cmpl -4(%ebp), %esi # if (i >= lim)
jge fine_i # then "vai a fine_i"
movl (%ebx,%esi,4), %eax # EAX = vett[i]
cmpl %eax, (%ebx,%edi,4) # if (vett[i+1] >= vett[i])
jge prossimo # then "vai a prossimo"
pushl (%ebx,%esi,4) # salva vett[i]
pushl (%ebx,%edi,4) # salva vett[i+1]
popl %eax # EAX = vett[i+1]
movl %eax, (%ebx,%esi,4) # vett[i] = vett[i+1]
popl %eax # EAX = vett[i]
movl %eax, (%ebx,%edi,4) # vett[i+1] = vett[i]
movl %esi, %ecx # j = i
prossimo:
incl %esi # i++
incl %edi # (i+1)++
jmp ciclo_i
fine_i:
movl %ecx, -4(%ebp) # lim = j
jmp ciclo_lim
fine_lim:
#
#------ epilogo -------
#
popl %edi #
popl %esi # recupero dei registri
popl %ecx # salvati
popl %ebx #
popl %eax #
addl $4, %esp # ripulisce lo spazio
# d'ambiente
leave # ripristina EBP ed ESP
ret # ritorna al chiamante
#
#---- fine epilogo ----
#