問題是,在C函數內部我有一個內聯程序集。 喜歡的東西爲內聯彙編創建常量池的正確方法是什麼?
ldr r7, =0xdeadbeef
svc 0
如果文字池沒有明確創建(這種情況下),彙編 創建一個在翻譯單元的結束。通常情況下,這很好,但如果翻譯單元變得非常龐大,這不起作用,因爲 文字池離ldr指令太遠。
因此,我想知道處理問題的最佳方法是什麼。最明顯的方法是 手動創建聯彙編內有文字池:
ldr r7, =0xdeadbeef
svc 0
b 1f
.ltorg
1:
或者
ldr r7, 1f
svc 0
b 2f
1:
.word 0xdeadbeef
2:
不幸的是,這將導致次優的代碼,因爲多餘的分支 指令。我不希望彙編程序足夠聰明,爲函數中的常量池找到合適的 位置。我想要做的是 在函數結尾創建一個常量池。有什麼辦法可以告訴 編譯器(gcc)在函數的末尾上創建文字池?
PS我結束了使用movw/movt
對而不是常量池。雖然,首先, ,movw/movt解決方案的便攜性稍低於文字池,其次,我只是想知道是否可以在內聯程序集 中既可靠又高效地使用常量池。
更新:那麼,什麼是處理問題的最佳方式是什麼?
要強制工具鏈在功能之後創建常量池,可以將該函數放在單獨的代碼段中。它的工作原理是在翻譯單元彙編程序結束時爲每個部分生成單獨的常量池 。
儘管事實上,最好的方法是避免將常量加載到內聯彙編中的寄存器中。最好讓編譯器這樣做。在我來說,我 最終寫了一個類似的代碼來
register int var asm("r7") = 0xdeadbeef;
asm volatile("svc 0\n" :: "r" (var));
可能正確的方法是使用約束,但這就像魔術。 https://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html – auselen 2015-03-03 16:05:15