2016-04-29 8 views
1

Я начинаю пытаться написать набор функций quicksort и получить ошибку сегментации (сбрасывать ядра).Посмотрите, можете ли вы обнаружить ошибку - Ошибка начального пользователя в Quicksort

Моя рекурсивная функция быстрой сортировки должна вызвать функцию помощника QuickSort который

  1. вызывает функцию раздела, чтобы сделать большую часть реальной работы и
  2. самих по себе требует, чтобы иметь дело с подмассивами рекурсивны:

Я смотрел на это часами и пытался найти ошибку (-ы), вызывающую это. Любая помощь будет невероятно оценена. Заранее благодарю за то, что вы являетесь удивительным человеком.

[x86 AT & T синтаксис]

.text 
    .globl quicksort 
quicksort: 

#subroutine prologue 
    pushl %ebp  #store stack frame of calling function on stack. 
    movl %esp, %ebp  # use current stack pointer for called function 

    #subroutine main body 
    movl 8(%ebp), %edi # ptr to array   in edi 
    movl 12(%ebp), %ecx # num elements   in ecx 

    jl quicksort_help # CHECK 
    ret 

quicksort_help: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $8, %esp 
    movl 16(%ebp), %eax 
    cmpl 12(%ebp), %eax 
    jle  exit 
    subl $4, %esp 
    pushl 16(%ebp) 
    pushl 12(%ebp) 
    pushl 8(%ebp) 
    call partition 
    addl $16, %esp 
    movl %eax, -4(%ebp) 
    subl $4, %esp 
    movl -4(%ebp), %eax 
    decl %eax 
    pushl %eax 
    pushl 12(%ebp) 
    pushl 8(%ebp) 
    call quicksort 
    addl $16, %esp 
    subl $4, %esp 
    pushl 16(%ebp) 
    movl -4(%ebp), %eax 
    incl %eax 
    pushl %eax 
    pushl 8(%ebp) 
    call quicksort 
    addl $16, %esp 

exit: 
    leave 
    ret 
+0

Я бы начал с комментариев тела функции; часто, просто выписывая то, что вы * означаете *, может указать, где то, что вы на самом деле делаете, отличается. –

ответ

2
#subroutine prologue 
    pushl %ebp  #store stack frame of calling function on stack. 
    movl %esp, %ebp  # use current stack pointer for called function 
    #subroutine main body 
    movl 8(%ebp), %edi # ptr to array   in edi 
    movl 12(%ebp), %ecx # num elements   in ecx 
*** HERE IS SOMETHING MISSING *** 
    jl quicksort_help # CHECK 
    ret 

jl инструкция будет прыгать только на МЕНЬШЕ состоянии, но код не содержит каких-либо инструкций, которые фактически определяют это состояние!

+0

Как вы думаете, было бы лучше изменить его на «jmp» или добавить условие заранее? – a2239

+1

@ a2239 Почему вы поместили там инструкцию JL? Какую цель вы считали своей работой? –