【发布时间】:2015-05-04 04:27:52
【问题描述】:
问题是在 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));
【问题讨论】:
标签: c gcc arm inline-assembly