2016-04-29 1 views
1

私はクイックソート機能のセットを書いて、セグメンテーションフォルト(コアダンプ)を取得しようとしている初心者です。あなたがバグを見つけることができるかどうか確認してください - Quicksortの初心者のエラー

私の再帰的クイックソート機能が

  1. は、実際の作業のほとんどを行うには、パーティション関数を呼び出し、
  2. 呼び出し自体を再帰的にサブアレイに対処するためのヘルパークイックソート関数を呼び出すことになっている

私はこれを数時間見て、これを引き起こしているバグを見つけようとしています。どんな助けでも信じられないほど高く評価されます。素晴らしい人間であることを前に感謝します。

[& T構文ATのx86]

.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命令は、LESSを条件にのみジャンプしますが、コードは実際には、この条件を定義する任意の指示が含まれていません!

+0

これを 'jmp'に変更するか、あらかじめ条件を追加する方が良いと思いますか? – a2239

+1

@ a2239なぜあなたはJL命令をそこに置いたのですか?それは何の目的でしたか? –

関連する問題