使用寄存器进行输入设置

时间:2011-11-11 12:49:29

标签: embedded register-allocation

我有一个简单的c程序用于打印n个Fibonacci数字,我想将其编译为ELF目标文件。我不想直接在我的c代码中设置fibonacci数(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;
}

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

提前致谢

2 个答案:

答案 0 :(得分:1)

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

或者,因为看起来你有stdio支持,为什么不通过控制台输入接受该值?

答案 1 :(得分:1)

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

register float i;
register int numIterations = ITERATIONS;

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

如果您确实需要对每个指令进行计数,那么您将需要编写机器代码(使用汇编语言)。这样,您可以直接控制您的寄存器使用情况。汇编语言编程不适合胆小的人。汇编语言开发比使用更高级别的语言慢几倍,插入错误的风险更大,而且它们更难以追踪。高级语言的开发是出于某种原因,而C语言的开发是为了帮助编写Unix。运行第一个Unix系统的小型计算机速度非常慢,但是使用C代替汇编的原因是,即使这样,使代码花费更少的代码,更少的错误,并且比调试更容易进行调试更为重要。汇编。

如果你想试试这个,here are the answers to a previous question on stackoverflow about resources for ARM programming可能会有所帮助。

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

祝你好运!