2011-11-11 50 views
1

我有一個簡單的c程序來打印n個斐波那契數字,我想將它編譯爲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; 
} 

我想計數器的設定ITERATIONS在我的寄存器,而不是在代碼中。

在此先感謝

+0

什麼註冊?這是否與程序中的任何內容相對應? – wallyk

+0

斐波那契數列是一個*正整數序列*,在這種情況下''float'可能是一個不恰當的類型。它不會準確地表示具有6位以上重要小數位的值。 'unsigned long'或'unsigned long long'會是更好的選擇,並且由沒有FPU的ARM進行更高效的計算。 – Clifford

+0

@ Clifford *如果他需要更大的數字,他可以使用* double *,並使用封閉表單解決方案進行計算。 –

回答

1

寄存器關鍵字可以用來建議,它採用了寄存器進行迭代器和迭代次數編譯:

register float i; 
register int numIterations = ITERATIONS; 

但不會有太大的幫助。首先,編譯器可能會或可能不會使用您的建議。接下來,對於調用10 fib()以及最後根據您在循環中調用哪些函數,過程中調用的代碼可能會將寄存器內容保存在堆棧中,這些值仍然需要放在堆棧上在過程入口處框架,並將它們恢復爲實現過程返回的代碼的一部分。

如果您確實需要編寫每條指令,那麼您將需要編寫機器代碼(使用匯編語言)。這樣,您可以直接控制您的註冊使用情況。彙編語言編程並不適合心臟病。彙編語言開發比使用更高級別的語言要慢幾倍,插入錯誤的風險更大,而且追蹤起來要困難得多。出於某種原因開發了高級語言,並且開發了C語言來幫助編寫Unix。運行第一個Unix系統的小型機速度非常慢,但使用C而不是彙編的原因是即使那樣,編寫代碼花費的時間更少,錯誤更少,調試更容易的代碼也更爲重要彙編。

如果你想試試這個,here are the answers to a previous question on stackoverflow about resources for ARM programming這可能會有所幫助。

您可能採取的一種策略是將您的性能關鍵代碼隔離爲一個過程,在C中編寫過程,捕獲生成的彙編語言表示。然後重寫彙編器以提高效率。徹底測試,並至少得到另一組眼球來查看結果代碼。

祝你好運!

+0

我假設他只是想在模擬器內運行時修改迭代次數。這不需要一個寄存器,只是一個變量。此外,大多數編譯器會忽略'register'限定符,並且當然不會指定任何特定的寄存器。在ARM ABI中,函數的前四個參數在R0-R3中傳遞(除非是double或long long),並且進一步的參數被堆棧。 – Clifford

+0

我確實說過_suggest他compiler_而不是_direct編譯器to_使用一個寄存器的變量。 –

+0

謝謝你。但我不需要超過150斐波那契數字。正如在其他評論中提到的,我剛剛拿斐波那契示例來檢查數字計數如何傳遞給寄存器,而不是在代碼本身中聲明它。我正在驗證兩種方法的時間結果1)通過聲明變量併爲其賦值並在代碼中傳遞它2)在代碼中聲明number counter變量並在編譯時爲寄存器賦值一個值。程序的結果或輸出並不重要。它的時機。 – Mechanic

1

製作的迭代變量,而不是一個常量,那麼你可以直接在調試器/仿真器的手錶或當地人窗口中設置其值爲循環執行之前。

另外,因爲它似乎你有stdio的支持,爲什麼不只是通過控制檯輸入接受價值?

+0

我可以把ITERATIONS變成一個變量,這個例子只是爲了演示Im的工作模擬器,我模擬的真正的程序是更復雜和純粹的嵌入,所以使用控制檯輸入無助於我實際上模擬同一個程序的2個配置1)通過寄存器設置輸入2)通過更改代碼來設置輸入。我正在使用OVP Simulator for ARM7處理器。你的意思是調試器窗口。 Im使用Msys開發環境運行模擬器 – Mechanic

+0

我不熟悉OVP,但大多數模擬器都支持通過源代碼級調試器(如GDB或Insight)進行調試。在這樣的調試器中,您可以直接查看和修改正在執行的應用程序變量。如果你沒有辦法在模擬和真實硬件上進行這種調試,那麼你幾乎沒有裝備進行有缺陷的開發,我首先質疑模擬的好處。 – Clifford

+0

...我剛纔看了一下OVP站點,並觀看了使用Eclipse和GDB在OVP上運行的應用程序的視頻,因此可以完成。 – Clifford