Verwenden der Inline-Assembly in C / C ++

8

Ich versuche Inline-Assembly zu verwenden ... Ich habe diese Seite Ссылка gelesen, aber ich kann die Parameter nicht verstehen, die an meine Funktion übergeben werden.

Ich schreibe ein C-Schreibbeispiel .. das ist meine Funktion header:

%Vor%

Und das ist mein Assembler-Code:

%Vor%

Was muss ich tun, um den Code an die C-Funktion zu übergeben? Ich mache so etwas:

%Vor%

Das liegt daran, dass ich keine Ausgabevariable habe, also wie gehe ich damit um? Auch mit diesem Code:

%Vor%

Wie kann ich diesen Code in meinen Code einfügen .. so kann ich die PID für den Benutzer fragen .. so .. Dies ist mein Precode

%Vor%     
RodrigoCR 27.02.2011, 05:05
quelle

1 Antwort

10

Nun, Sie sagen nicht speziell, aber bei Ihrem Post scheint es so, als ob Sie gcc und seine Inline-Asm mit Constraintsyntax verwenden (andere C-Compiler haben eine sehr unterschiedliche Inline-Syntax). Das heißt, Sie müssen wahrscheinlich AT & amp; T Assembler-Syntax anstelle von Intel verwenden, wie es mit gcc verwendet wird.

Also, mit dem oben Gesagten, schauen wir uns Ihre write2-Funktion an. Erstens möchten Sie keinen Stapelrahmen erstellen, da gcc einen erstellt. Wenn Sie also einen im asm-Code erstellen, erhalten Sie zwei Rahmen, und die Dinge werden wahrscheinlich sehr verwirrend sein. Zweitens, da gcc den Stapelrahmen auslegt, können Sie nicht mit der Anzeige "[ebp + offset]" auf vars zugreifen, da Sie nicht wissen, wie es angelegt wird. Das ist, wofür die Einschränkungen sind - Sie sagen, welche Art von Platz gcc den Wert (irgendein Register, Speicher, spezifisches Register) und die Verwendung "% X" im asm-Code geben soll. Wenn Sie schließlich explizite Register im asm-Code verwenden, müssen Sie diese im dritten Abschnitt (nach den Eingabeeinschränkungen) auflisten, damit gcc weiß, dass Sie sie verwenden. Sonst könnte es einen wichtigen Wert in eines dieser Register setzen, und Sie würden diesen Wert überlisten.

Mit all dem sieht Ihre write2-Funktion folgendermaßen aus:

%Vor%

Beachten Sie die AT & amp; T-Syntax - src, dest statt dest, src und % vor dem Registernamen.

Jetzt wird das funktionieren, aber es ist ineffizient, da es viele zusätzliche movs enthalten wird. Im Allgemeinen sollten Sie niemals mov-Anweisungen oder explizite Register in asm-Code verwenden, da Sie Constraints besser verwenden können, um zu sagen, wo Sie Dinge haben wollen und lassen Sie den Compiler sicherstellen, dass sie da sind. Auf diese Weise kann der Optimierer wahrscheinlich die meisten movs loswerden, insbesondere wenn er die Funktion inline darstellt (was es tun wird, wenn Sie -O3 angeben). Praktischerweise verfügt das i386-Maschinenmodell über Einschränkungen für bestimmte Register, sodass Sie stattdessen Folgendes tun können:

%Vor%

oder noch besser

%Vor%

Beachten Sie auch die Verwendung von volatile , die benötigt wird, um dem Compiler mitzuteilen, dass dies nicht als tot beseitigt werden kann, obwohl seine Ausgaben (von denen es keine gibt) nicht verwendet werden.

Bearbeiten

Eine letzte Anmerkung - diese Funktion führt einen Schreib-Systemaufruf durch, der einen Wert in eax zurückgibt - entweder die Anzahl der geschriebenen Bytes oder einen Fehlercode. Sie können das mit einer Ausgabebedingung erreichen:

%Vor%

Bei einer echten Ausgabe möchten Sie vielleicht oder nicht, dass der Volatile - wenn Sie es nicht haben - es dem Compiler erlaubt, den Schreibvorgang zu deaktivieren, wenn der Rückgabewert nicht verwendet wird. Aber Sie überprüfen immer den Rückgabewert auf Fehler, oder?

    
Chris Dodd 27.02.2011, 06:37
quelle

Tags und Links