2014-11-06 85 views
0

我发布这个,因为发现这个任务相当困难,并且StackOverflow帮了我无数次。希望这会帮助别人。如何在NASM中对数组进行排序?

问题描述:

在读取N个整数,通过零值终止(不使用零)。将这些数字按升序排序并打印出来。如果在值为零之前没有输入数据,或者输入了太多数据并且会使数组溢出,则必须产生错误消息。该程序应该能够处理多达100个整数值。

方法:

我决定用冒泡排序,其遍历在阵列N次大小N.它着眼于每个值,并将其与下一个值的数组的每个值;如果第一个值高于下一个值,则切换它们。这可以很容易地修改,以降序列出它们。无论如何,这里最困难的是在nasm中处理一个嵌套循环,并正确地循环所有的ecx值和内容。我发布的代码很好评论。此外,任何建设性的批评都是值得欢迎的,正如问题一样。在这个项目上

思考:

我认为有可能是一个更好的方式去通过元素数组中,而不是使用EBX。 Masm有一个指针可以用来迭代值。此代码正常工作并符合要求,但它可能会更好。另外,冒泡排序可能不是最好的方式。我知道还有其他的排序算法,但泡泡似乎是在nasm中最容易实现的。

回答

1

在问题中包含您的解决方案会更好。现在看来这个问题已经被回答了,并且不再需要关注。幸运的是,这里是我的想法:

你必须用101个双字初始化数组,因为在跳转到标签tooManyInts之前,你将存储那么多输入。
递减ECX时,您评论它是因为基于0的索引。这不是真的。这是因为一系列N个元素需要N-1个比较。
我发现很难跟踪堆栈上的内容。我可能会建议你这样评论

push ecx ;(1) 
dec ecx 
push ecx ;(2) 
... 
loop L3 
pop ecx  ;(2) 
SetWrite: 
xor ebx,ebx 
pop ecx  ;(1) 
+0

它不存储第101个值;在阅读101st int后,它跳转到toomanyints。它在将值写入数组之前将ex与100进行比较。此外,关于基于0的索引,我想我的意思是[intArray]指向第一个值,[intArray + ecx * 4]将在ex为数组长度的情况下抛出一些等价的空指针异常,因为如果数组有100个值,则第一个值是[intArray],而最后一个值是[intArray + 4 * 99]。但对于泡沫排序,我相信你对n-1比较是正确的。 – amaleemur 2014-11-11 17:53:52

+0

并且在任何时候堆栈上的值不会超过两个:第一个ecx(稍后写入的值的数量)被压入,然后按下ecx-1(外循环应执行的次数)。 – amaleemur 2014-11-11 17:55:53

+0

但谢谢你的反馈!我确实认为这个问题是完全解答的,因为它是在问题指定的时候运行的。汇编语言很棘手,我希望能够帮助任何未来的学生,我决定改变你指出的评论。 – amaleemur 2014-11-11 17:57:47