使用字符指针读取 GCC 中的寄存器
Reading registers in the GCC using a char pointer
我最近开始学习如何在 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 指针访问寄存器?如果不是,除了潜在的安全问题之外,是否有任何特殊原因不允许这样做?
此外,我阅读了这个 Whosebug 问题:String literals: pointer vs. char array
谢谢。
初始化变量的语法是 register char *foo asm ("r12") = d;
将 asm-register 变量指向一个字符串。您不能使用运行时变量字符串作为寄存器名称;寄存器选择必须在编译时组装成机器代码。
如果这就是您想要做的,那么您误解了关于汇编语言的一些基本知识 and/or 提前编译语言如何编译成机器代码。 GCC 不会生成自修改代码(即使它想这样做,安全地这样做也需要重做由提前优化器完成的寄存器分配),或者基于字符串重新 JIT 自身的代码。
(我第一次看你的问题时,我什至不明白你想做什么,因为我只是在考虑可能的事情。@FelixG 的评论是我需要理解的线索问题。)
(另请注意,寄存器不可索引;即使在 asm 中,您也不能使用单个指令读取由另一个寄存器中的整数选择的寄存器编号。您可以对其进行分支,或存储所有寄存器在内存和索引中,就像可变参数函数为传入的寄存器参数所做的那样。)
如果您确实想要编译时常量字符串文字,只需使用正常语法即可。使用 CPP 宏如果你想要相同的字符串来初始化一个字符数组。
我最近开始学习如何在 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 指针访问寄存器?如果不是,除了潜在的安全问题之外,是否有任何特殊原因不允许这样做?
此外,我阅读了这个 Whosebug 问题:String literals: pointer vs. char array
谢谢。
初始化变量的语法是 register char *foo asm ("r12") = d;
将 asm-register 变量指向一个字符串。您不能使用运行时变量字符串作为寄存器名称;寄存器选择必须在编译时组装成机器代码。
如果这就是您想要做的,那么您误解了关于汇编语言的一些基本知识 and/or 提前编译语言如何编译成机器代码。 GCC 不会生成自修改代码(即使它想这样做,安全地这样做也需要重做由提前优化器完成的寄存器分配),或者基于字符串重新 JIT 自身的代码。
(我第一次看你的问题时,我什至不明白你想做什么,因为我只是在考虑可能的事情。@FelixG 的评论是我需要理解的线索问题。)
(另请注意,寄存器不可索引;即使在 asm 中,您也不能使用单个指令读取由另一个寄存器中的整数选择的寄存器编号。您可以对其进行分支,或存储所有寄存器在内存和索引中,就像可变参数函数为传入的寄存器参数所做的那样。)
如果您确实想要编译时常量字符串文字,只需使用正常语法即可。使用 CPP 宏如果你想要相同的字符串来初始化一个字符数组。