Assembly NASM汇编x86:是否可以在循环中写入循环?(需要修复bubblesort)
我的bubblesort算法遇到了一些问题 我有(例如): s db 12h、63h、13h、07h、52h、1ah、2bh、56h 我必须使用lods、stos和(如果必要的话)movs函数在d中对其进行排序 你能帮我解决这个问题吗?我会告诉你问题出在哪里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
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