是否可以在C ++结构中编写静态汇编数据?

时间:2013-05-10 16:55:09

标签: c++ assembly

我正在尝试使用结构中的asm语法声明静态const数据。

也许是这样的?

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

请注意,这甚至不接近工作。 :)我的装配超级生锈。

修改

对于对此问题感兴趣的人及其背后的原因,请参阅store non-nul terminated C string constant in C++

这个问题是切合实际的,我不想把这个问题弄得一团糟,除了我想要它之外还有其他用途,这就是为什么我开始一个单独的问题。

感谢您的关注和帮助。

3 个答案:

答案 0 :(得分:3)

不,不是这样的。但是,如果编译器支持内联汇编,则可以进行内联汇编。另一种常见的(同样是非便携式)技术是使用汇编程序将代码组装到原始机器代码,然后将其包装到字节数组中(您可以在各种shellcode中看到这种情况,其中有效负载存储如下)。

答案 1 :(得分:2)

你评论说你想“生成一个非空终止字节的字符串”。 这很简单,使用

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

答案 2 :(得分:2)

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

 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 "=%zd\n", 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