2016-06-20 1 views
0

J'utilise l'assembleur en ligne dans gcc (sous Linux). J'ai écrit ce programme simple:Comment passer les adresses de variables dans l'assembleur gcc en ligne (linux)

  char *str="hello world"; 

      int main(int argc, char *argv[] 
      { 
      ... 
       asm("mov %0, %%rcx" 
         : 
         : "g" (str)); 
      ... 
      } 

J'utilise cette syntaxe étrange d'écrire l'adresse de la chaîne dans le registre RCX. Mais quand je désassemble le binaire, je vois que les données sont d'abord transférées dans rax, puis dans rcx. Comme vous pouvez l'imaginer, cela peut présenter des effets dans mon programme Bord ... Quand j'étais jeune, je l'habitude d'écrire quelque chose comme ça:

  asm("mov _str, rcx") 

mais il ne fonctionne pas sur Linux gcc ... pourquoi ?

+0

L'utilisation de l'assembleur en ligne de GCC peut être problématique si vous l'utilisez pour la première fois (et peut poser problème aux utilisateurs expérimentés). Tout d'abord, contrairement à l'assembleur en ligne de MSVC - GCC ne sait rien sur les instructions à l'intérieur du gabarit sauf qu'il fait des substitutions textuelles Vous devez lui indiquer quelles sont les entrées, quelles sont les sorties et si vous détruisez d'autres registres non listés dans les opérandes de sortie, ils doivent être dans la liste de clobber. Pour que cela fonctionne, vous devrez assigner la valeur de _RCX_ à une variable avec une contrainte de sortie. –

+0

La question serait pourquoi vous essayez de mettre l'adresse de chaîne dans RCX? Cela semble être un problème XY. Qu'est-ce que vous essayez vraiment de réaliser avec l'assembleur en ligne? Si cela peut être fait en _C_ alors cela devrait être fait là. –

+0

Si vous regardez la sortie de GCC sans optimisations (comme '-O0'), vous constaterez beaucoup de frais inutiles (des charges supplémentaires et des magasins de déplacement de données inutilement d'avant en arrière). –

Répondre

-1
  char *str="hello world"; 
... 
      asm("mov _str, rcx") 

mais il ne fonctionne pas sur Linux gcc ... pourquoi?

Les messages d'erreur de gcc doivent indiquer pourquoi. Les causes les plus probables sont

  • pas underscore doit être préfixé au nom de la variable globale
  • un signe pour cent doit être préfixé au nom du registre

Quelque chose comme asm("mov str, %cx") œuvres.