【问题标题】:MIPS ASM Homework - Arrays and while loopsMIPS ASM 作业 - 数组和 while 循环
【发布时间】:2012-02-05 22:04:36
【问题描述】:

首先,让我这样说...我不希望任何人只给我一个答案...我想指出正确的方向!

我在这个程序中有一个整数数组....例如:

numbers:
     .word  17
     .word -50
     .word   1
     .word -999

我有一个 while 循环遍历它们并将每个循环打印在新行上。这很好用。 (-999 是终止号码,不包含在打印输出中)

我还需要以相反的顺序打印它们。我知道我可以使用一个循环来计算元素的数量,然后再有另一个循环从最后一个地址开始并向后移动……但这似乎效率低下。

有没有什么方法可以在不先循环的情况下找到数组中最后一个元素的地址?如果没有,我可以按照我提到的方式进行,只是想确保我在程序中尽可能高效。

提前致谢!

【问题讨论】:

  • 如果你有一个长度,你可以直接跳到那里,但如果数组结束只用 -999 表示,你有正确的想法扫描它并从那里向后移动。
  • 如果您没有更多信息(例如最后一个元素地址),那么没有。

标签: arrays loops assembly while-loop mips


【解决方案1】:

如果允许你做任何你想做的组装技巧,你可以做类似的事情

numbers:
 .word  17
 .word -50
 .word   1
last:
 .word -999

并使用类似这个伪代码的代码

for (ptr = last; ptr != numbers; ) print(*--ptr);

换句话说,放置一个标签和数组的末尾,然后向后走,直到碰到数组的开头,使用指针比较而不是寻找终止符 (-999)。

或者,为了避免过多更改代码,如何

 .word -999
numbers:
 .word  17
 .word -50
 .word   1
last:
 .word -999

然后向后走直到找到 -999?

【讨论】:

  • 感谢您的建议,但是,我肯定会将其放入我的技巧列表中,因为这是一项家庭作业,他们会将 numbers: array 添加到我的文件中以运行不同的测试,我无法控制这部分内容。
  • 您不必更改呈现的数据结构,但您仍然可以做到这一点:numbers: .word 17 .word -50 .word 1 .word -999 last: .word -999 顺便说一句,Richard Pennington,您不需要那个领先的.word -999,因为您拥有numbers 标签。
  • 所以如果我理解正确,即使它在一个新标签上,它仍然会在数字中最后一个单词之后的内存中的下一个位置:?那样的话,我就可以从那个标签地址倒数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多