如何在Assembly 8086中冒泡排序

时间:2017-11-25 03:54:36

标签: assembly x86-16

我试图在程序集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

(编辑)的 好吧,你怎么看待这个代码我解释了我的一些错误,代码现在正常工作,但我想我移动(触摸)' $'登录

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

1 个答案:

答案 0 :(得分:2)

它给出错误答案的原因:

mov cx, 18 - 他们两个,如果你想排序18个元素,不要排序19个([i] vs [i + 1],0< = i< 18→ [17] vs [18]是bug)。在每个外部循环之后加上内部循环中的一个元素就足够了,因为最后一个元素已经包含了最高值,但这只是效率低下而不是bug。

lea di, [si + 2] - 为什么?你真的想做什么?内存中的单个元素有多大?

cmp si, di - 如di = si + 2,此cmp将始终"低于"。不要比较地址,但你需要价值观。 (如果你需要比较的值,那么在那之后直接写#34; swap"而不是调用其他函数并再次从内存*中读取值,这是有意义的。)

BTW loop is slow

交换功能正常。