2014-12-05 2 views
-1

Я попытался написать сортировку вставки в сборке (nasm), и она не работает (всегда отправляется ошибка сегментации). Я пытался найти источник проблемы в течение очень долгого времени, и я не могу найти его, Может кто-нибудь, пожалуйста, помогите мне найти проблему? спасибо.Вставка сортировка в сборе не работает

sort: 

pushad 
mov ebp,esp;creating stack frame 
mov ebx,[ebp+36]; ebx saves pointer to the array 
mov ecx,[ebp+40];ecx saves the srray size 
mov esi,4 ; i 


for_l1: 
    ;edx=temp,esi=i,edi=j 
    mov edx,[ebx+esi] 
    mov edi,esi;j=i 
    sub edi,4;j=i-1 
    while_l1: 


     cmp edx,[ebx+edi]; if(temp<array[j]) 
     jge end_while1 
     ;array[j+1]=array[j], j-=1 
     mov eax,[ebx+edi] 
     mov [ebx+edi+4],eax 
     sub edi,4 
     cmp edi,0 
     jge while_l1;if(j>=0) 
    end_while1: 
     ;array[j+1]=temp 
     mov[ebx+edi+4],edx 
     add esi,4;i+=1 
     dec ecx; decreasing the size of the array needed to sort 
     cmp ecx,1;if(size==1) 
     jg for_l1 
    finished1: 
     popad 
     ret 8 
+0

Как вы вызова этого? Почему вы используете 'ebp + 36'? Выглядит очень большое смещение. Вы проверили в отладчике правильные аргументы? Вы разобрали свой код, чтобы увидеть, где это происходит? * Изменить: о, я вижу, что большое смещение связано с 'pushad'. – Jester

+0

Да, большое смещение действительно связано с pushad, замечаете ли вы что-нибудь, что может вызвать ошибку сегментации? – user3475324

+0

Используйте отладчик. Как голый минус, сообщите, какая инструкция неисправна. И покажите, как вы это вызываете. – Jester

ответ

0

Вы уверены, что размер массива представляет число элементов, и что он не содержит общую длину массива?

Тогда, возможно, вы могли бы кодировать

mov ecx,[ebp+40];ecx saves the srray size 
shr ecx,2 
Смежные вопросы