【发布时间】:2017-03-28 05:48:19
【问题描述】:
是否可以将 #defined integer 符号的值逐字插入到作为 GCC (AVR Studio) 中的程序集部分一部分的字符串文字中?
我希望在下面的 asm() 块内的字符串文字中将“LEDS”替换为 48。
#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS; //I'm using the value directly too
void DrawFrame()
{
asm(
"ldi R27, 0x00 \n\t"
"ldi R26, 0x00 \n\t"
"ldi R18, LEDS \n\t" //<-- substitution needed here
...
}
但我希望编译器/汇编器(在预处理器完成它的工作之后)看到这个......
#define LEDS 48 //I only want ONE mention of this number in the source
int x = LEDS; //I'm using the value directly too
void DrawFrame()
{
asm(
"ldi R27, 0x00 \n\t"
"ldi R26, 0x00 \n\t"
"ldi R18, 48 \n\t" //<-- substitution needed here
...
}
到目前为止,我已经尝试了所有我能想到的宏技巧(#stringification、arg 替换,甚至 #include 具有各种值组合和双引号之类的文件)。
我完全不熟悉将 AVR 汇编代码内联到 AVR Studio 的 GCC 编译器的神奇之处。
我试图避免在我的源代码中多次出现“48”字面值,如果预处理器可以为我执行这种替换,那就太好了。
编辑:这是一个微控制器固件项目 - 只是为了让生活变得有趣,几乎没有多余的空间可以添加新代码。
【问题讨论】:
-
为什么字符串化和字符串连接不起作用?
-
@CodyGray,字符串化不会“评估”您传入的内容,它只是获取参数中的字符并将它们直接转储出 vrbatim,除非您在字符串化之前使用额外的宏替换所需的字符.
-
这怎么不是重复的?我认为@CodyGray 和 PSkocik 的回答中建议的双宏技术是众所周知的,所以肯定以前有人问过。 (不过,对于这个问题,现在这是一个很好的规范问答,所以不太清楚的问题和不太好的答案可能会被标记为重复。)
标签: c gcc assembly c-preprocessor avr