Einfache Frage. Die Funktion asm
in C wird verwendet, um Inline-Assembly in Ihrem Code auszuführen. Aber was bringt es zurück? Ist es das herkömmliche eax
, und wenn nicht, was gibt es zurück?Ist __asm {}; den Wert von eax zurückgeben?
Antwort
__asm__
selbst gibt keinen Wert zurück. Der C-Standard definiert nicht, wie __asm__
den Rückgabewert verarbeiten soll, daher kann das Verhalten zwischen Compilern unterschiedlich sein. Sie haben angegeben, dass Visual Studio-Beispiel gültig ist, Visual Studio jedoch __asm
verwendet. __asm__
wird zumindest von GCC verwendet.
Visual Studio
Um das Ergebnis in einem C-Programm zu erhalten, sollten Sie Rückgabewert eax
in dem Assembler-Code platzieren, und Rückkehr aus der Funktion. Der Aufrufer erhält als Rückgabewert den Inhalt eax
.
Visual Studio 2015 documentation:
int power2(int num, int power)
{
__asm
{
mov eax, num ; Get first argument
mov ecx, power ; Get second argument
shl eax, cl ; EAX = EAX * (2 to the power of CL)
}
// Return with result in EAX
}
GCC
GCC inline assembly HOWTO kein ähnliches Beispiel enthalten. Dies bedeutet wahrscheinlich, dass Sie die implizite Rückgabe nicht wie in Visual Studio verwenden können. Das HOWTO zeigt jedoch, dass Sie das Ergebnis in C-Variable innerhalb des Assemblyblocks speichern können und den Wert dieser Variablen nach dem Beenden des Assembly-Blocks zurückgeben können.
Ein Beispiel für eine String-Kopierfunktion, Rückkehr Wert von dest
:
static inline char * strcpy(char * dest,const char *src)
{
int d0, d1, d2;
__asm__ __volatile__( "1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2)
: "0" (src),"1" (dest)
: "memory");
return dest;
}
Es ist unwahrscheinlich; pro der C99 spec unter J3 Implementierung definiert Verhalten:
Das ASM Schlüsselwort kann direkt in den Übersetzer Ausgang (6,8) zum Einfügen in Assemblersprache verwendet werden. Die häufigste Anwendung ist über eine Anweisung der Form:
asm (character-string-literal);
So ist es unwahrscheinlich, dass ein Implementierer mit einer Annäherung kommen wird, die sowohl die Assembler-Sprache in die Übersetzer Ausgabe einfügt und auch erzeugt ein zusätzlicher Zwischenverbindungscode, um ein bestimmtes Register als ein Rückgabeergebnis zu verdrahten.
Es ist ein Schlüsselwort, keine Funktion.
z. GCC verwendet die Constraint-Semantik vom Typ "=r"
, damit Sie in Ihrer Assembly Schreibzugriff auf eine Variable haben. Aber Sie stellen sicher, dass das Ergebnis am richtigen Ort ist.
- 1. `testl` eax gegen eax?
- 2. Der Punkt Test% eax% eax
- 3. Verschieben von Variablen vom Typ short in EAX mit __asm in C++ (VS 2010)
- 4. xorl% eax,% eax in x86_64 assembly code produziert von gcc
- 5. "Unpassender Operandentyp" mit MSVC __asm
- 6. Soll ich den Wert von Collections.addAll() in meinen Methoden zurückgeben?
- 7. Was bedeutet "__asm __ (". Previous "); ' bedeuten?
- 8. PHP open_basedir - Wert zurückgeben?
- 9. Python: überprüfen, ob Variable definiert ist und seinen Wert zurückgeben oder einen anderen Wert zurückgeben
- 10. Wie speichere ich den Wert eines Registers in einen Speicherbereich, auf den ein Zeiger zeigt?
- 11. Was ist die Funktion der "mov eax, cr3; mov cr3, eax" in x86 Assemblercode?
- 12. Einen Wert zurückgeben IEnumerator
- 13. Warum Konstruktoren diesen Zeiger "zurückgeben"?
- 14. Kann keinen Wert von einer Funktion zurückgeben
- 15. Warum ist Perls $? den falschen Wert für den Exit-Code eines gegabelten Prozesses zurückgeben?
- 16. Fehler beim Zurückgeben von Wert mit JSONP
- 17. XPathNavigator.Evaluate falscher Wert zurückgeben?
- 18. jeden Wert von for-Schleife zurückgeben?
- 19. Python zurückgeben Zeigerspeicherort anstelle von Wert
- 20. Ich brauche Wert zurückgeben von Ajax
- 21. Den letzten Wert aus einer Zeile in Excel zurückgeben
- 22. Jquery: Den Wert eines Ajax-Anrufs an die Anruferfunktion zurückgeben?
- 23. Linux x86 NASM - Subroutine: Drucken Sie ein DWord von EAX
- 24. Warum tauscht Clojures Atom aus? den neuen Wert zurückgeben?
- 25. mit ESI langsamer als EAX?
- 26. Ist es möglich,% eax mit Pufferüberlauf zu überschreiben?
- 27. Berechneten Wert vom Modellmanager zurückgeben?
- 28. was ist leal (% edx,% edx, 4),% eax bedeutet?
- 29. html von der Variable in den Wert von react zurückgeben <input />
- 30. mysql - keine Zeile zurückgeben, wenn Wert in NULL ist
Es ist auf dem Compiler abhängt, aber AFAIK ist es keine Funktion, und es gibt nichts zurück, so 'int i = __asm__() 'ist nur ein ungültiges Konstrukt – myaut
Welcher Compiler? Welcher Prozessor? Die meisten Prozessoren haben kein eax-Register. – atturri
Wahr. Okay, vorausgesetzt, es ist Visual Studio Compiler (nicht sicher, welches ist das) und ein 32-Bit-Intel-Prozessor. – Delupara