1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| .data
str_scanf: .asciz "%d"
str_read: .asciz "Saisir les valeurs du tableau : \n"
str: .asciz "%d \n"
str_sum: .asciz "La somme des éléments du tableau est : %d\n"
str_min_pos: .asciz "La position du plus petit élément est : %d\n"
size: .int 4
.bss
.lcomm tab, 20
.text
.global main
read_tab:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %edi
movl 8(%ebp), %esi
pushl $str_read
call printf
addl $4, %esp
movl $0 , %ecx
loop_read:
cmpl %ecx, %edi
jle end_loop_read
pushl %ecx
leal (%esi, %ecx, 4), %ebx
pushl %ebx
pushl $str_scanf
call scanf
addl $8, %esp
popl %ecx
incl %ecx
jmp loop_read
end_loop_read:
popl %ebp
xorl %eax, %eax
ret
print_tab:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %edi
movl 8(%ebp), %esi
movl $0 , %ecx
loop_print:
cmpl %ecx, %edi
jle end_loop_print
pushl %ecx
pushl (%esi, %ecx, 4)
pushl $str
call printf
addl $8, %esp
popl %ecx
incl %ecx
jmp loop_print
end_loop_print:
xorl %eax, %eax
pop %ebp
ret
sum_tab:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %edi
movl 8(%ebp), %esi
xorl %eax, %eax
xorl %ecx, %ecx
loop_sum:
cmpl %ecx, %edi
jle end_loop_sum
addl (%esi, %ecx,4), %eax
incl %ecx
jmp loop_sum
end_loop_sum:
pop %ebp
ret
find_min_position:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %edi
movl 8(%ebp), %esi
xorl %eax, %eax
movl $1, %ecx
movl (%edi), %ebx # initialisation avec la première valeur
loop_find_min:
cmpl %ecx, %esi # comparer l'indice avec la taille
jge end_loop_find_min # si l'indice est supérieur ou égal à la taille, fin de la boucle
movl (%edi, %ecx, 4), %edx # charger la valeur du tableau à l'indice actuel
cmpl %edx, %ebx # comparer avec la valeur minimum actuelle
jge skip_update_min # si la valeur du tableau est plus grande ou égale, passer à l'indice suivant
movl %ecx, %eax # mettre à jour la position du minimum
movl %edx, %ebx # mettre à jour la valeur minimum
skip_update_min:
incl %ecx # passer à l'indice suivant
jmp loop_find_min # répéter la boucle
end_loop_find_min:
pop %ebp # restaurer la base de la pile
ret # retourner la position du minimum dans %eax
main:
pushl size
pushl $tab
call read_tab
addl $8, %esp
pushl size
pushl $tab
call print_tab
addl $8, %esp
pushl size
pushl $tab
call sum_tab
addl $8, %esp
pushl %eax
pushl $str_sum
call printf
addl $8, %esp
pushl size
pushl $tab
call find_min_position
addl $8, %esp
pushl %eax
pushl $str_min_pos
call printf
addl $8, %esp
xorl %eax, %eax
ret |
Partager