我正在尝试实现一个宏("MY_MACRO"
),它存储某个部分中前面带有 32 位整数的字符串("my_section")
。
例子:MY_MACRO(200, "my first string %u %x")
;
以下是我尝试过的选项以及我面临的问题。我将不胜感激任何帮助。
(gcc 4.7.3. MIPS cpu
)
选项A:
#define MY_MACRO(_num, _string)\
asm volatile(".pushsection .my_section");\
asm volatile(".byte %0, %1, %2, %3" : : "i"((_num >> 24) & 0xFF), "i"((_num >> 16) & 0xFF), "i"((_num >> 8) & 0xFF), "i"(_num & 0xFF)); /* Store the number */ \
asm volatile(".ascii " #_string);\
asm volatile(".popsection");
编译错误(宏的每次使用都不会发生):
c:\Temp\ccpDEDnt.s: Assembler messages:
c:\Temp\ccpDEDnt.s:1024: Warning: .popsection without corresponding .pushsection; ignored
我认为原因是编译器优化改变了指令顺序(尽管每个asm指令是易失性的,但允许编译器改变顺序)。
问:有没有什么方法可以仅针对这些行的范围禁用编译器优化,而无需#pragma
?
这个问题促使我找到了统一四个asm指令的解决方案。
选项B:
#define MY_MACRO(_num, _string)\
asm volatile(".pushsection .my_section\n\t" \
".byte %0, %1, %2, %3\n\t" \
".ascii " #_string "\n\t" \
".popsection" \
: : "i"((_num >> 24) & 0xFF), "i"((_num >> 16) & 0xFF), "i"((_num >> 8) & 0xFF), "i"(_num & 0xFF));
编译器错误:
foo.c:733:13: error: invalid 'asm': operand number missing after %-letter
foo.c:733:13: error: invalid 'asm': operand number out of range
由于该字符串包含百分号 (%),因此编译器将其解释为 asm 操作数。
选项C:
#define MY_MACRO(_num, _string)\
asm volatile(".pushsection .my_section\n\t" \
".byte %0, %1, %2, %3\n\t" \
".ascii %4\n\t" \
".popsection" \
: : "i"((_num >> 24) & 0xFF), "i"((_num >> 16) & 0xFF), "i"((_num >> 8) & 0xFF), "i"(_num & 0xFF), "X"(#_string));
这里我尝试将字符串作为操作数传递。我什至不知道这是否可行。
我没能编译这段代码。