我意识到它有点偏离常规路径,但我有一个带有中断表的AVR,其中大多数中断都没有被使用。我通过放置要打印的字符串而不是未使用的跳转指令,为引导加载程序削减了相当多的代码空间。它是一个ATmega1280,它在引导加载程序中无法真正达到自己的字符串常量(需要17位地址,而avr-gcc只保留16位)。所以我使用了一个接受32位整数的put而不是通常的" char *"。
到目前为止,这么好。但我想在其中一个字符串中使用转义换行符。 这有效,但很难看:
".ascii \"first line\""
".byte 0x5c"
".byte 0x0a"
".asciz \"second line\""
这样可行,但会发出警告:
".asciz \"first line\\\\\nsecond line\""
同样,两者都产生预期的文本"第一行\\ nsecond line"在二进制文件中。
警告是" dualloader.s:159:警告:未终止的字符串;插入换行符"
是的,我插了换行符。这就是重点。但是在生成的临时.s中,我看到了
"first line\\
second line"
而不是我希望的:
"first line\\\nsecond line"
这显然是警告的来源。一个有趣的效果是如果我减少反斜杠的数量:
".asciz \"first line\\\nsecond line\""
.s现在将包含:
"first line\
second line"
起初看似正确。但是二进制文件最终包含文本"第一行\ n第二行",如反斜杠后跟字符' n'。
我知道这不是很漂亮,而且我知道我可以在汇编中完成所有操作或者使用所有C,然后让代码大小增加到我需要为引导加载程序分配的闪存大小加倍的地方。但到目前为止,我对于.ascii和.asciz是否甚至能够使用GCC进行内联汇编感到非常好奇。特别是反斜杠后面跟着' n'结果让我感到困惑。有什么想法吗?
答案 0 :(得分:1)
你试过这个吗?
".asciz \"first line\\\\\\nsecond line\""
鉴于此,编译器应该发出这个:
.asciz "first line\\\nsecond line"
哪个应该在二进制文件中发出:
first line\<LF>second line