是否有可能在c++结构中编写静态汇编数据?

Is it possible to write static assembly data in C++ struct?

本文关键字:静态 汇编 数据 有可能 c++ 结构 是否      更新时间:2023-10-16

我试图在结构体内部使用asm语法声明静态const数据。

也许是这样的?

struct Z
{
  public:
    static char hello[] = asm volatile(".ascii "Hello"");
};

请注意,这甚至不接近工作。:)而且我的组装已经生锈了。

编辑:

对于这个问题及其背后的原因感兴趣的人,请参阅在c++中存储非null终止的C字符串常量。

这个问题是切题的,我不想把这个问题和它混淆在一起,因为它可能有其他用途,这就是为什么我开始一个单独的问题。

谢谢你的关心和帮助。

不,不是这样的。但是,如果编译器支持内联汇编,则可以使用它。另一种常见的(同样不可移植的)技术是使用汇编器将代码汇编为原始机器码,然后将其包装到字节数组中(您可以在各种shellcode中看到这种操作,其中有效负载是这样存储的)。

您的注释说您想要"生成一个非null终止的字节字符串"。这很简单,使用

char hello[] = { 'H', 'e', 'l', 'l', 'o' };

假设您知道(或可以计算)字符串的大小:

 char hello[5] = "Hello";

将完全按照您的要求执行。

你也可以使用宏,像这样:

#define STR(x, y)   const char x[sizeof(y)-1] = y

这个对我有效:

#include <stdio.h>
#define STR(x, y)   const char x[sizeof(y)-1] = y
STR(hello, "Hello");
STR(hello2, "Hello World");
STR(hello3, "Hello kerflunk");
#define PRINT(x) printf("size " #x "=%zdn", sizeof(x));
int main()
{
    STR(bar, "Bar");
    PRINT(hello);
    PRINT(hello2);
    PRINT(hello3);
    PRINT(bar);
    return 0;
}
输出:

size hello=5
size hello2=11
size hello3=14
size bar=3