【问题标题】:Pasting constant into asm code block将常量粘贴到 asm 代码块中
【发布时间】:2012-01-08 17:05:07
【问题描述】:

我有这个 C 宏:

#define syscall(number) \
({ \
    asm volatile ( \
        ".set noreorder\n" \
        "nop\n" \
        "syscall "#number"\n" \
    );\
})

当我用整数调用它时效果很好:

 syscall(5);

但是当我做这样的事情时:

 #define SYSCALL_PUTC 5

 syscall(SYSCALL_PUTC);

我收到此错误:

错误:指令系统调用需要绝对表达式

我该如何解决这个问题?我不想让我的代码充满魔幻数字。

【问题讨论】:

    标签: c assembly c-preprocessor stringification


    【解决方案1】:

    像这样使用字符串化

    #define xstr(s) str(s)
    #define str(s) #s
    #define syscall(number) \
    ({ \
        asm volatile ( \
            ".set noreorder\n" \
            "nop\n" \
            "syscall "xstr(number)"\n" \
        );\
    })
    

    有关字符串化的更多信息,请参阅此 gcc 页面:

    http://gcc.gnu.org/onlinedocs/cpp/Stringification.html

    【讨论】:

      【解决方案2】:

      有点小技巧,但不多:为每个系统调用编号复制原始系统调用宏,并为该系统调用命名。因此,您将拥有一个名为 SYSCALL_PUTC 的宏,它将扩展为与 syscall(5) 相同的宏。

      【讨论】:

      • 一种可能的替代方法是根据数字使系统调用宏中的系统调用行连续,这样您就不会有任何直接引用参数的装配线。不过,不确定您的编译器是否会更好。
      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多