。示例:MY_MACRO(200, "my first string-6ren">
gpt4 book ai didi

c - 带字符串的多行内联汇编宏

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:38 26 4
gpt4 key购买 nike

我正在尝试实现一个宏 ("MY_MACRO"),它在某个部分 ("my_section") 中存储一个以 32 位整数开头的字符串>。示例: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));

这里我尝试将字符串作为操作数传递。我什至不知道它是否可行。我没能编译这段代码。

最佳答案

选项 B 是正确的方法,但是您需要将字符串中出现的所有百分号 (%) 加倍,因为它被解释为内联中的操作数占位符汇编。

如果您不是特别关心排序或内联,您也可以让 gcc 为您处理:

struct mystruct
{
int num;
char string[0];
};

#define MY_MACRO(_num, _string)\
{ static struct mystruct entry __attribute__ ((section (".my_section"))) = { _num, _string }; }

关于c - 带字符串的多行内联汇编宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17259732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com