是否可以在 C++ 結構中編寫靜態程序集數據? (Is it possible to write static assembly data in C++ struct?)


問題描述

是否可以在 C++ 結構中編寫靜態程序集數據? (Is it possible to write static assembly data in C++ struct?)

I'm trying to declare a static const data using asm syntax inside of a struct.

Maybe something like this?

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

Note that this does not come even close to working. :)  And my assembly is super rusty.

EDIT:

For those interested in this question and the reasons behind it, please see store non‑nul terminated C string constant in C++.

This question was tangential and I didn't want to clutter that question up with it as well as it could have other uses beyond what I wanted it for which is why I started up a separate question.

Thanks for your interest and help.


參考解法

方法 1:

No, not like this. You can make inline assembly if your compiler supports it, however. Another common (and likewise non‑portable) technique is to use an assembler to assemble the code to raw machine code, then wrap it into a byte array (you can see this in action in various kinds of shellcode where the payload is stored like this).

方法 2:

You comment says you want to "generate a string of bytes that is not null terminated". That is easy, use

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

方法 3:

Assuming you know (or can count) the size of the string:

 char hello[5] = "Hello";

will do exactly what you want. 

You could also do a macro, like this:

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

This works for me:

#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;
}

Output:

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

(by Adrianuser529758brian beuningMats Petersson)

參考文件

  1. Is it possible to write static assembly data in C++ struct? (CC BY‑SA 3.0/4.0)

#assembly #C++






相關問題

內聯彙編 - cdecl 和準備堆棧 (Inline assembly - cdecl and preparing the stack)

ASM 使用代碼查找偏移量 (ASM find offset with code)

顯示字符的 Ascii 值 (Displaying Ascii values of characters)

x86 彙編程序崩潰,可能忽略了簡單的錯誤 (x86 assembly procedure crashes, possibly overlooking simple error)

是否可以在 C++ 結構中編寫靜態程序集數據? (Is it possible to write static assembly data in C++ struct?)

將小於 %ecx 的 1 推入堆棧 (push 1 less than %ecx to stack)

emu8086 : ARR 不包含任何值 (emu8086 : ARR do not contain any value)

劊子手游戲,語法修復 x86 gcc 程序集和 C (hangman game, syntax fix x86 gcc assembly & C)

如何將內存中的 96 位加載到 XMM 寄存器中? (How to load 96 bits from memory into an XMM register?)

如何使用 Assembly 中的 printf? (How do you use printf from Assembly?)

摩托羅拉 68HC12 實時中斷寄存器 (Motorola 68HC12 Real Time Interrupt Registers)

我可以用 OR 操作代替 MOV 操作嗎? (Can I substitute a MOV operation with an OR operation?)







留言討論