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
我的冒泡排序算法遇到了一些问题。
我有(例如):
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