Встроенный сборочный эквивалент директивы.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, для доступа ко всем данным сегмента данных потребуется специально сгенерированный код.