【发布时间】:2022-01-22 23:32:03
【问题描述】:
我在 ATmega 微控制器的 C 程序中有以下代码:
define sbi(port,bit) asm("SBI " #port "," #bit)
[...]
sbi(PORTB,1);
问题是编译器在处理汇编代码时无法识别 PORTB,尽管它已在包含的头文件中定义。有没有办法告诉预编译器将 PORTB (0x1b) 的定义值放在 ASM 指令中而不是文字文本 PORTB 中?当我像这样手动执行此操作时,汇编指令可以正常工作:
sbi(0x1b,1);
但出于显而易见的原因,我希望能够在我的 C 代码中使用 PORTB 和其他定义的名称。
请注意,我只将这个 ASM 宏用于定义的常量,而不是变量,所以我不需要任何花哨的东西来连接我的 ASM 宏和我的 C 代码。我只需要预处理器将 ASM 字符串中的 PORTB 替换为 0x1b。
【问题讨论】:
-
您可能正在使用 GCC,但是,当询问有关编译器特定功能(如
asm)的问题时,您应该始终指定您正在使用的编译器。 -
参见manual,尤其是底部段落:“如果你想字符串化宏参数扩展的结果,你必须使用两级宏。” i> TL;DR:创建一个
#define str(x) #x然后使用asm("SBI " str(port) "," #bit) -
我目前正在使用 Microchip Studio 附带的 XC8 C 编译器。但是,我没有嫁给这个编译器(这只是默认值)。如果结果更好,我可以切换到 GCC。
标签: c assembly macros microcontroller preprocessor