1

我有一个用于打印 n 斐波那契数的简单 c 程序,我想将其编译为 ELF 目标文件。我不想直接在我的 c 代码中设置斐波那契数 (n) 的数量,而是想在寄存器中设置它们,因为我正在为 ARM 处理器模拟它。我该怎么做?

这是代码片段

#include <stdio.h>
#include <stdlib.h>

#define ITERATIONS 3

static float fib(float i) {
    return (i>1) ? fib(i-1) + fib(i-2) : i;
}

int main(int argc, char **argv) {

    float i;
    printf("starting...\n");

    for(i=0; i<ITERATIONS; i++) {
    printf("fib(%f) = %f\n", i, fib(i));
    }

    printf("finishing...\n");

    return 0;
}

我想在我的寄存器而不是代码中设置迭代计数器。

提前致谢

4

2 回答 2

1

使 ITERATIONS 成为变量而不是文字常量,然后您可以在循环执行之前直接在调试器/模拟器的监视或本地窗口中设置其值。

或者,您似乎有 stdio 支持,为什么不直接通过控制台输入接受该值?

于 2011-11-11T19:59:41.460 回答
1

register关键字可用于向编译器建议它使用寄存器作为迭代器和迭代次数:

register float i;
register int numIterations = ITERATIONS;

但这无济于事。首先,编译器可能会也可能不会使用您的建议。接下来,仍然需要将值放在堆栈上以调用fib(),最后,根据您在循环中调用的函数,过程中调用的代码可以将您的寄存器内容保存在堆栈帧中过程入口,并将它们恢复为实现过程返回的代码的一部分。

如果您真的需要计算每条指令,那么您将需要编写机器代码(使用汇编语言)。这样,您就可以直接控制寄存器的使用。汇编语言编程不适合胆小的人。汇编语言开发比使用高级语言慢几倍,插入错误的风险更大,而且更难追踪。开发高级语言是有原因的,开发 C 语言是为了帮助编写 Unix。运行第一个 Unix 系统的小型计算机速度极慢,但使用 C 而不是汇编的原因是,即使在那时,更重要的是拥有更少的编码时间、更少的错误和更容易调试的代码。汇编程序。

如果您想尝试此操作,这里是 stackoverflow 上一个关于 ARM 编程资源的问题的答案,可能会有所帮助。

您可能采取的一种策略是将您的性能关键代码隔离到一个过程中,用 C 编写该过程,捕获生成的汇编语言表示。然后重写汇编程序以提高效率。彻底测试,并至少获得另一组眼球来查看生成的代码。

祝你好运!

于 2011-11-11T20:01:17.217 回答