【发布时间】:2020-05-27 09:28:39
【问题描述】:
我最近开始学习如何在 C 代码中使用内联汇编,并发现了一个有趣的功能,您可以在其中为局部变量指定寄存器 (https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html#Local-Register-Variables)。
该功能的使用方法如下:
register int *foo asm ("r12");
然后我开始怀疑是否可以插入一个char指针,例如
const char d[4] = "r12";
register int *foo asm (d);
但得到了error: expected string literal before ‘d’(如预期的那样)
我可以理解为什么这是一个不好的做法,但是有没有可能的方法来实现类似的效果,我可以使用 char 指针来访问寄存器?如果不是,除了潜在的安全问题之外,还有什么特别的原因不允许这样做吗?
另外,我阅读了这个 StackOverflow 问题:String literals: pointer vs. char array
谢谢。
【问题讨论】:
-
根据文档,
register int *foo asm ("r12");显然告诉编译器它应该使用寄存器r12来存储变量foo,因此它会影响编译器发出的汇编代码。另一方面,register int *foo asm (d);意味着“将变量 foo 存储在编译时未知的特定寄存器中”,这对我来说似乎是不可能的。
标签: c gcc assembly inline-assembly