Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly NASM汇编x86:是否可以在循环中写入循环?(需要修复bubblesort)_Assembly_X86_Nasm - Fatal编程技术网

Assembly NASM汇编x86:是否可以在循环中写入循环?(需要修复bubblesort)

Assembly NASM汇编x86:是否可以在循环中写入循环?(需要修复bubblesort),assembly,x86,nasm,Assembly,X86,Nasm,我的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, 1a

我的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:我有一部分代码是正确的,这是我之前使用的,但没有放在这里,因为它在技术上没有错,我修改了这个。这个序列中的确切代码与我原来的序列中的代码有相同的问题

提前感谢您,编码愉快

可以在循环中写入循环吗

对。你几乎做对了

(需要修复bubblesort)

这段代码绝对不是泡泡糖。您几乎要做的是查找最小/最大值,并将其存储在另一个数组中,多次重复

您需要在innerloop开始之前重新加载
ESI

同时将
CLD
放在程序顶部

问题不在于
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

那奇怪的内环是怎么回事?您有一个
cmp
,后面紧跟着一个
dec
,后面紧跟着一个
jg
,它依赖于
cmp
dec
修改的标志。您好!我试图从列表中找出某个点的最小值并管理我的元素,但在你问了这个问题之后,我意识到我实现了错误,并且错过了一些元素。尽管如此,我仍然无法使用相同的寄存器进行循环中的循环而不产生错误,因此,至少在算法不正确的情况下(我的情况),我希望它没有错误,这样它就可以运行。编辑:grammarThank你!这帮我弄明白了。我按照自己的风格进行了调整,一切都很顺利!
  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