【问题标题】:Translate Recursive C Program to LEGv8 Assembly将递归 C 程序转换为 LEGv8 程序集
【发布时间】:2017-02-23 05:26:00
【问题描述】:

需要帮助将此 C 代码转换为 LEGv8 程序集。 (作业)

unsigned long long f(unsigned long long a[], int n) {
    if (n == 0) return a[n];
    return a[n] + f(a, n - 1);
}

我对在 LEGv8 汇编中编写基本函数有点熟悉,但是递归方面让我很反感。

提前谢谢你。

【问题讨论】:

标签: c assembly


【解决方案1】:

由于您的任务是执行编译器所做的事情(将 C 转换为汇编),因此您无需知道这是递归的。 C 编译器也不知道。

判断源代码是否使用递归是恕我直言的NP完全问题,就像判断代码是否包含无限循环和其他NP完全任务一样,所以编译器甚至不费心去尝试评估这样的属性,他们当然可以在没有这些信息的情况下编译类似的代码。

尽管在这种简单的情况下,他们可能会注意到,并且可能会通过展开少量调用或将事物评估为常数以获得相当小的输入来优化这一点,但这是一个很好的候选翻译为 for 循环总结 n数组 a 的元素,但这不关你的事。

所以,如果只是递归让你失望,那么忘记这是递归,只需按原样将其编译成汇编语言,逐行,逐条指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2013-07-14
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多