0

我有一个正在尝试打印的数组。我想把它打印出来,看看它是否正确。它目前正在打印数字 1 并停止。或者,如果我以不同的方式处理 ECX,它会打印出一堆零并崩溃。

这是我的程序。

.data

array DWORD 10 DUP(5, 7, 6, 1, 4, 3, 9, 2, 10, 8)
my_size dd 10

sorted DWORD 0
first DWORD 0
second DWORD 0

.code

start:
main proc
cls

 mov EBX, offset[array]
 mov ECX, [my_size]
 dec ECX
 sub ESI, ESI
 sub EDI, EDI

; print
mov EBX, offset aa
sub ECX, ECX
;mov ECX, my_size
mov ECX, 10

my_loop:
mov EAX, [EBX]
inc EBX
dec ECX

cmp ECX, 0
jle exit_loop

mov first, EAX
print chr$("printing array elements: ")
print str$(first)

loop  my_loop

exit_loop:
ret

main endp

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

end start
4

2 回答 2

2

我不想这么说,但是您还没有“准备好”编写冒泡排序。要么这是一个完全疯狂的家庭作业,要么你到目前为止还没有跟上这门课(可能两者兼而有之)。

首先,我认为您没有正确定义数组。当我阅读您的代码时,您那里有 100 个双字 - 您指定的 10 个数字的 10 个副本。你不应该在那里需要“DUP”。

我会先打印未排序的数组,以确保您正确地完成了该部分。您似乎正在使用几个宏,它们肯定不是指令。仅从名称中,我猜(!)“print_chr$”打印一个字符,“print_str$”打印一个字符串(尽管您似乎正在打印您的字符串和数字 1)。如果你的宏集中有一个“print_int$”,我猜(!)这就是你想要的。由于我不熟悉您的宏,因此我可能是错的。

尽管您已将数组定义为“dword”,但您只比较排序例程中的单个字节。这可能适用于您正在使用的小数字,但它并不正确。

进行冒泡排序的常用方法是在每次遍历数组的开始时将“标志”(寄存器或变量 - 这可能是“排序”的用途)设置为零,并在每次运行时将其设置为 1做一个交换。当你通过你的数组并且标志仍然为零时 - 你还没有进行交换 - 然后,只有这样,你的数组才会被排序。如果您在每次通过后打印数组,您就会明白为什么它被称为“冒泡”排序 - 最小/最大数字“冒泡”到其最终位置。

您遍历 dword 数组 (esi * 4) 的代码看起来很正确(除了比较一个字节之外),但是您的打印例程每次通过循环时只会将 ebx 递增 1。“添加 ebx, 4”或使用“ebx * 4”(不是两者)来打印双字。或者也许你的数组应该只是字节?

说真的,我会从更简单的东西开始 - 只需打印数组 - 并在你完成工作后开始添加排序例程。

希望能帮助到你。

最好的,弗兰克

于 2012-07-24T18:35:47.597 回答
0

我看到你已经简化了代码。好主意!我仍然不熟悉您使用的宏“print_str$”。在我看来,这不像打印数字那样“看起来”。你有“print_int$”或类似的吗?如果你能让它只打印第一个数字“5”,那将是一个好的开始。

现在......通过你的循环工作,你只是“inc ebx”。这不会让你获得下一个 dword,它会从第一个 dword 中获得字节 2、3 和 4,从第二个 dword 中获得第一个字节。由于您在(已删除的)排序代码中使用了“* 4”,因此您可能需要在此处使用“[ebx * 4]”。要么这样,要么每次通过循环将 4 添加到 ebx 。一个或另一个(但不是两者)应该逐步遍历一个 dwords 数组。

我怀疑第一步是选择“正确”的宏来打印一个数字。从那里可能会变得更容易(?)。勇气!:)

最好的,弗兰克

于 2012-07-27T20:38:09.430 回答