2017-11-25 8 views
-2

私はアセンブリ8086でバブルソート機能を実行しようとしていますが、何らかの理由で間違った答えが出てしまい、その理由がわかりません。アセンブリでバブルソートする方法8086

私はまだそれを学んでいないし、私はそれを使用する方法がわからないので、任意の.code、.dataとそれらのいずれかを使用することはできません。

私が使ったスワップ機能は、私が知っている限り動作します。 (編集済み)

org 100h 

jmp main 

    string  db 'm', 'a', 'g', 's', 'h', 'i', 'm', 'i', 'm', 'v', 'e', 'n', 'e', 'h', 'e', 'n', 'i', 'm' ,0Dh,0Ah,'$' 

main: 
    lea di,string 
    push di 
    call bubbleSort   

    mov  ax, 0 
    mov  ah, 0 
    int  16h 
ret  

swap proc 
    push bp 
    mov bp, sp 

    mov bx, [bp + 4] 
    mov al, [bx] 
    mov di, [bp + 6] 
    mov cl, [di] 
    mov [di], al 
    mov [bx], cl 

    mov sp, bp 
    pop bp 

    retn 4 
swap endp 

bubbleSort proc 
    push bp 
    mov bp, sp 

    mov si, [bp + 4] 

    mov cx, 18 
    outer_loop: 
     mov si, [bp + 4] 
     lea di, [si + 2] 

     mov bx, cx 
     mov cx, 18 
     inner_loop: 
      cmp si, di 
      ja finish:  

      ;swap 
      pusha 
      push si 
      push di 
      call swap 
      popa   

      finish: 
      inc si 
      inc di 

      loop inner_loop 
      mov cx, bx 
    loop outer_loop  


    mov sp, bp 
    pop bp 
    retn 2 
bubbleSort endp 

OK、あなたは私は私のミスの一部をunderstudeこのコードについてどう思いますか、コードが今動作しますが、私は(タッチ)「$」記号

bubbleSort proc 
    push bp 
    mov bp, sp 

    mov si, [bp + 4] 

    mov cx, 18 
    outer_loop: 
     mov si, [bp + 4] 

     mov bx, cx 
     mov cx, 18 
     inner_loop: 
      mov al, [si] 
      mov ah, 0h 
      mov dl, [si + 1] 
      mov dh, 0h 
      cmp dl, al 
      ja finish:  

      ;swap 
      mov [si + 1], al 
      mov [si], dl  

      finish: 
      inc si 

      loop inner_loop 
      mov cx, bx 
    loop outer_loop  


    mov sp, bp 
    pop bp 
    retn 2 
bubbleSort endp 
を移動すると思いますそれは間違った答えを与える理由
+0

「うまくいかない」とは、何が間違っているかの説明ではありません。 [mcve]を参照してください。それはクラッシュしますか?それは間違った答えを与えるか?デバッガを使用してレジスタ値が期待どおりかどうかを確認してください。また、 'swap'を別の関数に入れると、コードがもっと複​​雑になります。 –

+0

私は少なくとも1つの問題を見ることができます:彼らが指しているデータの代わりに 'si'と' di'を比較します。 –

+0

8ビット要素の[8086バブルソート実装](https://stackoverflow.com/questions/26318043/assembly-bubble-sort-for-sorting-string/26324630#26324630)。 –

答えて

1

の理由:

mov cx, 18 - それらの両方、それらのあなたは18個の要素をソートする場合、ソートしない19([I] VS [I + 1]、0 < = I [17] vs [18]はバグです) 。さらに、各外側のループの後に、内側のループ内の1つ少ない要素をソートするだけで十分です。最後のものはすでに最高の値を含んでいますが、それはバグではなく単に非効率です。

lea di, [si + 2] - なぜですか?何を本当にやりたかったのですか?メモリ内の単一要素の大きさはどれくらいですか?

cmp si, di - di = si + 2として、このcmpは常に「下に」なります。アドレスを比較しないでくださいが、値が必要です。 (また、compareの値が必要な場合は、他の関数を呼び出してメモリ*から再度値を読み取るのではなく、その直後に "swap"を書くことは理にかなっています)。

BTW loop is slow

スワップ機能は正常です。

+0

関連:[マシンコード(コードゴルフ)の20バイトでのx86-16バブルソート](https://codegolf.stackexchange.com/questions/77836/sort-an-integer-list/149038#149038)。これらのすべての愚かな膨大なバブルソートの実装は私を狂ったものにしていました。 –

+0

@PeterCordes私は、私の目を喜ばせるために、コードゴルフソリューションを必要としませんが、これはスタック呼び出し規約と奇妙な機能をソートループ/スワップに分割することで非常に苦痛でした...今、ここに見た... – Ped7g

関連する問題