我是个大学的CS学生,我应该为考试开发一个MIPS汇编语言程序,但我确实很难设计它,特别是在分配寄存器、遵循调用约定、在堆栈上保存寄存器时。这一切似乎变得相当混乱和压倒性相当快,我失去了轨道!
我没有问题,至少在概念上,一个解决特定问题的算法。它更多地关系到整个工程的大局、总体结构和设计。
鉴于此,你能指出一个模式,给出技巧或最佳实践遵循,整理出一切在实际编写代码之前,这样我就不会迷失在这个过程中?
发布于 2022-07-08 20:17:55
与其他高级语言(如Java或Python )相比,MIPS是一种非常独特的语言,因此需要一些时间来适应它。我建议使用MIPS进行程序开发的方法如下:
$t、$s等。如果不能执行前两个步骤,则几乎不可能在MIPS中创建有效的程序。因此,下一步是拿一些废纸或考试的一部分,在那里你可以写下来,开始记下你想要你的程序做什么,考虑所有的MIPS指令,并试图认识到哪种指令最适合每项任务。考虑是否需要创建任何if语句或循环,并使用适当的分支或跳转指令。我真的相信,这取决于记住和真正理解每条指令所做的事情,以及与之相伴的哪些寄存器来开发好的MIPS代码。发布于 2022-07-08 15:31:17
一般来说,我建议有效设计汇编语言代码的步骤如下:
用C语言编写算法并运行它,并进行测试,以确保其工作正常,,. ,然后将其转换为汇编语言,比较机械,不需要进行不必要的更改。
直接在程序集中开发一个算法是很困难的,而在程序集中修复算法错误并不是很有趣,部分原因是算法中可能出现的小变化会对程序代码产生巨大的影响。
许多人迫切希望对一个给定的组装算法进行改进--抵制这种改进--回去,在C版本中做同样的改进,然后测试以确保它仍然有效。
C代码可能包含具有语句和表达式的数据结构、全局数据和函数。
对于语句,将控制流结构转换为if-goto形式。C支持if-goto标签。您可以将每个结构化语句(if,但同时,for)替换为使用if-goto标签的语句。您也可以按任何顺序进行此操作,每次转换为if-goto-label的结构化语句,还可以测试生成的C代码,以确保它继续工作。
另外,简化所有if-goto语句,例如,您已经删除了&&s和||s。这意味着将conjuctions和析取分割成多个if-goto语句。
将复杂表达式转换为由短期变量连接的赋值,以便暴露并显化这些短期变量。例如,在return fib(n-2) + fib(n-1)中,我们可以引入临时变量来保存函数调用结果:int t1 = fib(n-2); int t2 = fib(n-1); return t1+t2. 使我们更清楚地知道我们需要一些临时变量,而其中一个t1是跨函数调用的,因此与只需要短期存储的t2相比,需要不同的物理存储(呼叫生存时间)。
一旦有了它,就可以开始将C转换为程序集。
在将C代码转换为程序集时,首先转换数据结构(如果需要),然后转换全局数据,然后转换函数。
对于函数,转换参数&所有局部变量(将变量分配给寄存器或内存). 为变量分配存储,需要分析函数实现如何使用这些变量。
形式参数相对容易,它们遵循调用约定。然而,您需要对函数本身中的形式参数和局部变量的使用情况进行分析。在函数调用中存在的任何变量都需要从内存中获得一些帮助,才能保存这些函数调用。如果一个正式参数,即函数条目位于参数寄存器中,该变量位于函数调用中,则必须移动到一个安全的位置。任何不在函数调用中的变量都可以留在参数和/或使用临时寄存器中。
然后翻译语句,然后翻译这些语句中的表达式(例如赋值、条件测试、函数调用),. 保持现有C代码的顺序,并在汇编中以与C代码相同的方向翻译部件。您的代码将已经以if-goto标签的形式出现,所以直接使用汇编语言就可以了。
这些步骤中的每一个都是相当小的,可以通过遵循适当的规则和等价模式来掌握。
https://stackoverflow.com/questions/72913471
复制相似问题