2013-08-04 3 views
2

Я любопытно, что эквивалент (например)Встроенный ассемблер эквивалент .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

На самом деле, в приведенном выше коде, который вы считаете обманом, память для 'x' не выделяется в разделе данных. Он выделяется в стеке. – Aaron

+1

Я сомневаюсь, что вы можете выделить память в разделе данных, используя встроенную сборку. Но если вы хотите создать глобальную переменную, память этой переменной будет выделена в разделе данных. – Aaron

+0

'const int x = 42;' или 'static int x = 42;'? – BCS

ответ

4

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

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

__gshared int x = 42; 

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

Смежные вопросы