NASM assembly x86: 是否可以在循环中写一个循环? (需要修复冒泡排序)

NASM assembly x86: Is it possible to write a loop in a loop? (Need fix for bubblesort)

我的冒泡排序算法遇到了一些问题。

我有(例如):

s db 12h, 63h, 13h, 07h, 52h, 1ah, 2bh, 56h

我必须使用 lods、stos 和(如果需要)movs 函数在 d 中对它进行排序。

你能帮我解决这个问题吗?我会告诉你问题出在哪里。

bits 32
global start

extern exit
import exit msvcrt.dll

segment data use32 class=data
s db 12h, 63h, 13h, 07h, 52h, 1ah, 2bh, 56h
    l equ ($-s) 
    d times l db 0
    max dw 00ffh
segment code use32 class=code
start:
    mov ESI, s
    mov ECX, l
    mov EBX, l
    mov EDI, d
    bbs: 
        mov DX, max
        bbs1:
            lodsb ;Problem 1*
            cmp AL, DL
            dec ECX
            jg bbs1
            inc ECX
            mov DL, AL
        loop bbs1
        cld
        mov ECX, EBX
        mov EAX, EDX
        stosb ;Problem 2**
    loop bbs
    push dword 0 
    call [exit]

*在我用正确的长度修改长度之前我没有遇到这个问题

已编辑:它的位置,我原来放在上面

**开始前这里就崩溃了

问题 3:我有一部分代码是正确的,我之前使用过,但没有放在这里,因为它在技术上没有错误,我对此进行了改编。此序列中的确切代码与我原来的代码存在相同的问题。

在此先感谢您,祝您编码愉快!

Is it possible to write a loop in a loop?

是的。你几乎做对了。

(Need fix for bubblesort)

此代码绝对不是冒泡排序。您几乎要做的是寻找 min/max 并将其存储在另一个数组中,多次!

lodsb ;Problem 1*

您需要重新加载 ESI 在内循环开始之前!
还要将 CLD 放在程序的顶部。

mov ECX, EBX
mov EAX, EDX
stosb ;Problem 2**

问题不在于STOSB,而在于您每次都将外循环的迭代计数器设置为最大值,进入无限循环并因此崩溃...


根据您要实现的具体目标,这可能是一个不错的内部循环:

  mov esi, s
bbs1:
  lodsb
  cmp AL, DL
  jge skip
  mov DL, AL     ; Found a smaller number
skip:
  loop bbs1

解决外循环的迭代,如:

  mov AL, DL
  stosb
  dec ebx
  jnz bbs