0

構造体内で asm 構文を使用して static const データを宣言しようとしています。

たぶん、このようなものですか?

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

これは機能にさえ近づいていないことに注意してください。:) そして、私のアセンブリは非常にさびています。

編集:

この質問とその背後にある理由に興味がある方は、C++ で非ヌル終了 C 文字列定数を格納するを参照してください。

この質問は接線であり、その質問を混乱させたくありませんでした。また、私が望んでいた以外の用途がある可能性があるため、別の質問を開始しました。

ご関心をお寄せいただきありがとうございます。

4

3 に答える 3

3

いいえ、そうではありません。ただし、コンパイラがサポートしている場合は、インライン アセンブリを作成できます。もう 1 つの一般的な (そして同様に移植性のない) 手法は、アセンブラーを使用してコードを生のマシン コードにアセンブルし、それをバイト配列にラップすることです (ペイロードがこのように格納されているさまざまな種類のシェルコードでこれを実際に確認できます)。 )。

于 2013-05-10T16:58:11.810 に答える
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
于 2013-05-10T17:17:05.270 に答える
2

「null で終了していないバイトの文字列を生成する」とコメントしています。それは簡単です、使用してください

char hello[] = { 'H', 'e', 'l', 'l', 'o' };
于 2013-05-10T17:10:13.800 に答える