2013-08-04 5 views
2

Je suis curieux de savoir ce que l'équivalent (par exemple)assembleur en ligne équivalent de directive .data MASM

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

serait, si je en train d'écrire l'assemblage en ligne (en D). Je comprends que je pouvais faire quelque chose comme

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

    return 0; 
} 

, mais le but de l'exercice est de ne pas « tricher » en utilisant D lui-même.

+1

En fait, dans le code que vous avez affiché au-dessus de celui que vous avez considéré comme triche, la mémoire de 'x' n'est pas allouée dans la section de données. Il est alloué sur la pile. – Aaron

+1

Je doute que vous pouvez allouer de la mémoire dans la section de données en utilisant l'assemblage en ligne. Mais si vous deviez créer une variable globale, la mémoire de cette variable serait allouée dans la section de données. – Aaron

+0

'const int x = 42;' ou 'static int x = 42;'? – BCS

Répondre

4

L'assembleur en ligne de D n'a pas la possibilité de définir à quelle section le code ou les données seront émis. Il va toujours dans la même section que le code de la fonction qu'il est intégré dans

Mais vous pouvez insérer des données dans le segment de données de D'utilisant des déclarations de D ordinaires:.

__gshared int x = 42; 

Notez que si vous n » t use __gshared, x se terminera dans les blocs de stockage locaux de thread et nécessitera un code spécialement généré pour y accéder. En outre, si le code est compilé avec -fPIC, un code spécialement généré sera requis pour accéder à toutes les données du segment de données.

Questions connexes