13 Stimmen

Rückgabewert einer C-Funktion an ASM

Ich versuche, eine Funktion aus ASM heraus aufzurufen. Ich weiß, wie man sie aufruft, aber ich habe Probleme, den Rückgabewert dieser Funktion zu finden. Es folgt ein Beispiel:

C-Code:

int dummy() {  
    return 5;  
}  

(N)ASM-Code:

dummyFunction:
    call dummy
    ;grab return into eax
    inc eax ; eax should be 6 now
    ret  

Irgendwelche Ideen?

18voto

Der Rückgabewert ist in eax . Wenn Sie eine C-Funktion aus asm aufgerufen haben, können Sie den Rückgabewert aus eax . Wenn Sie versuchen, von einer asm-Funktion nach C zurückzukehren, speichern Sie den beabsichtigten Rückgabewert in eax .

Etwas komplizierter wird es bei der Rückgabe von Fließkommawerten, long long Werte oder Strukturen, also fragen Sie, wenn Sie das brauchen, und jemand (vielleicht ich) wird Ihnen helfen.

12voto

legends2k Punkte 29253

Obwohl die Antworten ausreichen, um die Frage des Fragestellers zu beantworten, hier ein Auszug, der die meisten Fälle abdeckt, aus DJPPs Manpage der Vollständigkeit halber:

Rückgabewert

  • Ganzzahlen (beliebige Größe bis zu 32 Bit) und Zeiger werden in der %eax registrieren.
  • Fließkommawerte werden in das 387 Top-of-Stack-Register zurückgegeben, st(0) .
  • Rückgabewerte vom Typ long long int werden zurückgegeben in %edx:%eax (das wichtigste Wort in %edx und das niedrigste in %eax ).
  • Die Rückgabe einer Struktur ist kompliziert und selten nützlich; versuchen Sie, dies zu vermeiden. (Beachten Sie, dass dies ein Unterschied zur Rückgabe eines Zeigers auf eine Struktur ist).

Wenn Ihre Funktion Folgendes zurückgibt void (z. B. kein Wert), wird der Inhalt dieser Register nicht verwendet.

2voto

Christian Rau Punkte 44134

Es hängt von der Plattform und der Aufrufkonvention ab, aber normalerweise sollte der Rückgabewert bereits in eax wenn es sich um einen primitiven Typ oder einen Zeiger handelt und im Fließkommaregister st(0) wenn es sich um einen Gleitkommatyp handelt, denke ich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X