Bonjour, j'ai du mal à trouver la raison pour laquelle mon implémentation de recherche binaire est en panne (je suis nouveau dans l'assemblage NASM).
Désolé, je sais que ce n'est pas vraiment une MVP, mais je ne vois pas comment en faire une en assemblage.
%define n [ebp+8]
%define list [ebp+12]
%define low [ebp+16]
%define high [ebp+20] ; Parameters loading from the stack
binary_search:
push ebp
mov ebp, esp
mov ebx, n
mov edi, list
mov ecx, low
mov edx, high
cmp ecx, edx ; if (low > high)
jg .FIRST
mov eax, edx ; Next few lines for mid = low + (high - low)/2
sub eax, ecx
sar eax, 1 ; Will this give an appropriate index? (i.e is it floor division?)
add eax, ecx
lea esi, [edi+eax*4] ;Getting list[mid]
cmp ebx, [esi]; if (n == list[mid])
je .END
jl .SECOND
jg .THIRD
jmp .END
.FIRST:
mov eax, -1 ; return -1
jmp .END
.SECOND:
mov edx, eax ; return middle - 1
dec edx
jmp .CONTINUE
.THIRD:
mov ecx, eax ; low = mid - 1
dec ecx
jmp .CONTINUE
.CONTINUE:
push edx
push ecx
push edi
push esi
push ebx
call binary_search ; recursive call, causing the segfault.
pop ebx
pop esi
pop edi
pop ecx
pop edx
jmp .END
.END:
mov esp, ebp
pop ebp
ret
Après avoir commenté différentes sections, j'ai déterminé qu'il y a définitivement quelque chose à faire avec mon appel récursif à binary_search qui cause le seg fault. (Trouvé dans .CONTINUE) Qu'est-ce que je fais de travers dans le corps de binary_search qui n'est pas compatible avec de multiples appels récursifs ?
L'algorithme de recherche binaire :
binary_search(n, list, low, high)
if (low > high)
return -1
mid = low + (high - low) / 2
if (n == list[mid])
return middle;
if (n < list[mid])
high = mid - 1
else
low = mid + 1
return binary_search(n, list, low, high)
Je sais que c'est un peu long, mais merci :)
Edit : son mode 32-bit