【问题标题】:How to bubble sort in Assembly 8086如何在 Assembly 8086 中进行冒泡排序
【发布时间】:2018-05-09 00:14:58
【问题描述】:

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

【问题讨论】:

  • “它不起作用”不足以描述问题所在。见minimal reproducible example。它会崩溃吗?它会给出错误的答案吗?使用调试器查看寄存器值是否符合您的预期。此外,将swap 放在单独的函数中会使您的代码更加复杂。
  • 我可以看到至少 1 个问题:您比较 sidi 而不是它们指向的数据。
  • 工作 8086 bubble sort implementation,用于 8 位元素。
  • 再次阅读minimal reproducible example。它给出了什么答案?如果我们知道这一点,那么找出可能出错的地方要容易得多,例如对于某些输入,或前几个,或 IDK 什么,它会留下最后几个元素未排序。

标签: assembly x86-16


【解决方案1】:

给出错误答案的原因:

mov cx, 18 - 两者,如果要对 18 个元素进行排序,不要对其中的 19 个进行排序([i] vs [i+1], 0

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

cmp si, di - 因为 di = si+2,这个cmp 将始终“低于”。不要比较地址,但您需要值。 (如果您需要比较值,那么在此之后直接写“交换”是有意义的,而不是调用其他函数并*再次*从内存中读取值)。

顺便说一句loop is slow.

交换功能没问题。

【讨论】:

  • 相关:x86-16 bubble sort in 20 bytes of machine code (code golf)。所有这些蹩脚臃肿的冒泡排序实现都让我抓狂。
  • @PeterCordes 我不需要代码高尔夫解决方案来取悦我的眼睛,但是这个对于堆栈调用约定和将功能奇怪地拆分为排序循环/交换非常痛苦......现在我我试图忘记我在这里看到的......
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2022-01-19
  • 1970-01-01
  • 2016-04-13
  • 2019-06-14
相关资源
最近更新 更多