Встроенный сборочный эквивалент директивы.data MASM

Мне любопытно, что эквивалент (например)

        .data
x       dword 42
        .code
main    proc
        ; Do stuff here.
        ret
main    endp
        end

было бы, если бы я писал встроенную сборку (в D). Я понимаю, что мог сделать что-то вроде

int main()
{
    int x = 42;
    asm
    {
        // Do stuff here.
    }

    return 0;
}

, но смысл упражнения не в том, чтобы "обманывать", используя сам D.

1 ответ

Решение

Встроенный ассемблер D не может установить, в какой раздел будет передан код или данные. Он всегда будет находиться в том же разделе, что и код функции, в которую он встроен.

Но вы можете вставить данные в сегмент данных D, используя обычные объявления D:

__gshared int x = 42;

Обратите внимание, что если вы не используете __gshared, x попадет в локальные блоки памяти потока и потребует специально сгенерированного кода для доступа. Кроме того, если код скомпилирован с -fPIC, для доступа ко всем данным сегмента данных потребуется специально сгенерированный код.

Другие вопросы по тегам