2016-06-20 14 views
0

Ich verwende Inline-Assembler in gcc (unter Linux). Ich habe schrieb dieses einfache Programm:Wie übergeben variable Adressen in Inline-GCC-Assembler (Linux)

  char *str="hello world"; 

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

Ich verwende diese seltsame Syntax, um die Adresse des Strings in dem RCX-Register zu schreiben. Aber wenn ich die Binärdatei zerlegen, sehe ich, dass die Daten zuerst in Rax, dann in Rcx übertragen werden. Wie Sie sich vorstellen können, dies einige bord Effekte in meinem Programm vorstellen können ... Als ich jung war, habe ich so etwas zu schreiben:

  asm("mov _str, rcx") 

aber es funktioniert nicht auf Linux gcc ... warum ?

+0

Mit GCCs Inline-Assembler kann problematisch sein, wenn Sie neu es verwenden (und kann Probleme für erfahrene Benutzer verursachen). Zunächst einmal im Gegensatz zu MSVC Inline-Assembler - GCC Inline weiß eigentlich nichts über die Anweisungen in der Vorlage, außer dass es textuelle Substitutionen Sie müssen es sagen, was die Eingänge sind, was die Ausgänge sind und wenn Sie andere nicht aufgelistete Register zerstören in den Ausgangsoperanden müssen sie in der Clobber-Liste sein. Damit dies funktioniert, müssen Sie den Wert von _RCX_ einer Variablen mit einer Ausgabebedingung zuweisen. –

+0

Die Frage wäre, warum Sie versuchen, die Adresse von Zeichenfolge in RCX zu setzen? Scheint, dies könnte ein XY-Problem sein. Was versuchen Sie wirklich mit Inline Assembler zu erreichen? Wenn es in _C_ getan werden kann, dann sollte es dort gemacht werden. –

+0

Wenn Sie die Ausgabe von GCC ohne Optimierungen (wie "-O0") betrachten, werden Sie viel unnötigen Overhead finden (zusätzliches Laden und Speichern von Daten, die unnötigerweise Daten hin und her bewegen). –

Antwort

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

aber es funktioniert nicht auf Linux gcc ... warum?

Die Fehlermeldungen von gcc sollten erklären, warum. Die wahrscheinlichsten Ursachen sind

  • kein Strich muss
  • ein Prozentzeichen auf die globalen Variablennamen vorangestellt werden muss

So etwas wie asm("mov str, %cx") Werke des Registernamen vorangestellt werden.