内联汇编中的引号

时间:2018-02-18 07:42:48

标签: c gcc inline-assembly

如何在asm()内使用包含引号的汇编指令? 像:

asm(
".section .rdata,"dr"\n"
);

上面的代码给了我这个错误:

expected ')' before 'dr'

2 个答案:

答案 0 :(得分:2)

任何字符串文字,不仅仅是asm声明所要求的字符串文字,如果它们被转义,都可以包含双引号。你用\来逃避他们。因此,当应用于您的示例时:

asm(
".section .rdata,\"dr\"\n"
);

答案 1 :(得分:1)

像往常一样,使用"\""在C字符串文字中放置双引号。

做你所要求的并不一定是100%安全的。如果您没有恢复正确的部分,则可能会遇到Can't declare .data in inline assembly等问题。

如果更改inline-asm内的部分,那么如果内联asm语句位于C源文件的最后,则可能是安全的。

但最好使用.pushsection,这样您就可以使用.popsection将汇编程序保留在开头的同一部分中。自动为现有.S文件执行此操作可能只需要更复杂的文本处理,并且仍然可以使用简单的算法。

虽然假设汇编程序当前位于你的内联asm开头的.text部分,你可能会很安全,但在这种情况下,你的inline-asm字符串末尾的.section .text应该是安全。 (猜猜在这里。)

这是why multiple people have told you,单独组装一个独立的.S文件并链接这两个目标文件肯定会更好。

我想如果你使用的是只允许一个翻译单元的在线编译器,这可能是一个有用的黑客,但对于除了一次性测试之外的其他任何东西,你应该让你的构建系统支持{{1}文件而不是将编译器输出转换为inline-asm语句的丑陋黑客。 (我假设这是编译器输出,或者你只是手工编写它。)