在c中内联asm的宏存在格式问题

时间:2016-05-10 19:06:56

标签: c assembly macros

我试图在c中编写一个宏,它在自身中嵌入一个字符串,并在运行时返回指向该字符串的指针。

inline.c:4:1: error: expected identifier or ‘(’ before ‘{’ token
 {(char* var = 0;
 ^
inline.c: In function ‘main’:
inline.c:17:23: error: expected expression before ‘,’ token
  write(0, STR("hello"), 6);

我收到了错误:

{{1}}

我无法弄清楚如何解决这个问题;欢迎任何帮助。

1 个答案:

答案 0 :(得分:2)

您使用的是哪种编译器?

GCC(可能是Clang作为GCC兼容性功能)有一个扩展名Statements and declarations in expressions,它使用了符号:

({ … })

您似乎正在尝试使用以下内容,其中的字符顺序相反:

{( … )}

这些符号都不是标准C。

另外,如问题所示,代码:

#define STR(str)
{(char* var = 0;
    asm volatile(               \
        "call after_string%=\n" \
        ".ascii " str "\n"      \
        ".byte 0\n"             \
        "after_string%=:\n"     \
        "pop $0\n"              \
        : "=m" (var) );
    var;
)}

似乎缺少一些反斜杠:

#define STR(str)                \
{(char* var = 0;                \
    asm volatile(               \
        "call after_string%=\n" \
        ".ascii " str "\n"      \
        ".byte 0\n"             \
        "after_string%=:\n"     \
        "pop $0\n"              \
        : "=m" (var) );         \
    var;                        \
)}

这使得块成为一个宏。如上所述,它是一个具有空扩展的宏,后跟一个语句块,其中第一个包含的语句以左括号开头。如果您希望它是一个语句表达式,则需要使用:

#define STR(str)                    \
    ({char* var = 0;                \
        asm volatile(               \
            "call after_string%=\n" \
            ".ascii " str "\n"      \
            ".byte 0\n"             \
            "after_string%=:\n"     \
            "pop $0\n"              \
            : "=m" (var) );         \
        var;                        \
    })

我保留判断结果是否有效的判断 - 我从未发现有必要在代码中嵌入汇编程序,因为我使用便携式软件。