assembly - 访问数组元素

时间:2012-07-23 19:15:48

标签: arrays loops assembly masm32

我有一个我试图打印的数组。 我想把它打印出来,这样我就可以看出它是否正确。 它目前正在打印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

2 个答案:

答案 0 :(得分:2)

我讨厌说出来,但你还没准备好写一个泡泡排序。要么它是一个完全疯狂的家庭作业,要么你还没有跟上这个课程(可能两个都有)。

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

我会首先打印未排序的数组,只是为了确保你有正确的部分。你似乎在使用几个宏 - 他们肯定不是指令。只是从名字,我猜(!)“print_chr $”打印一个字符,“print_str $”打印一个字符串(虽然你似乎打印你的字符串和数字1)。如果你的宏集中有一个“print_int $”,我猜(!)这就是你想要的。由于我不熟悉你的宏,我可能是错的。

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

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

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

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

希望它有所帮助。

最佳, 弗兰克

答案 1 :(得分:0)

我看到你简化了代码。好主意!我还不熟悉您正在使用的宏," print_str $"。那不是"看起来"我喜欢它打印一个数字。你有" print_int $"或者类似的?如果你能打印出第一个数字" 5"那将是一个好的开始。

现在......通过你的循环,你只是" inc ebx"。这不会让你获得下一个dword,它会从第一个dword获得字节2,3和4,从第二个dword获得第一个字节。因为您使用了" * 4"在(已删除)排序代码中,您可能需要" [ebx * 4]"这里。要么是这样,要么每次通过循环将4添加到ebx。一个或另一个(但不是两个)应该逐步通过一系列双字。

我怀疑第一步是选择"对"宏打印一个数字。它可能会从那里变得更容易(?)。勇气! :)

最佳, 弗兰克