Bonjour,

J'essaye d'écrire une fonction qui prend en paramètre l’adresse d’un tableau d’entiers et/ou une chaine de caractère et sa taille, et retourne la position du plus petit élément.
Pour cela je m'inspire de fonctions que j'ai créées juste avant mais arrivé à la compilation sur SASM Linux l'exécution crashe en visant la ligne : movl (%edi), %ebx

Quelqu'un aurait une idée de ce qui pourrait bloquer ? Svp

Voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Merci d'avance