Die Konvention für x86-32 ist dass der Aufrufer einer Funktion (der "caller") die Inhalte der Register %eax, %ecx, und %edx irgendwo zwischenspeichern muss (die sog. "caller-save" Register). Hingegen ist die aufgerufene Funktion (der "callee") dafür verantwortlich die Inhalte der Register %ebx, %esi, und %edi (die sog. "callee-save" register) beim return wieder so herzustellen wie sie am Anfang der Funktion waren.
Zusätzlich ist nach dem Funktionsaufruf in %eax der Return-Wert der Funktion.
Beispiel:
Code:
// im caller, die werte in %eax, %ecx, und %edx
// werden nach dem Funktionsaufruf weiterhin gebraucht.
push %eax
push %ecx
push %edx
call fun
// hier ist %eax der Returnwert der aufgerufenen Funktion
pop %edx
pop %ecx
pop %eax
fun: // braucht alle register
// setup
push %ebp
mov %esp %ebp
// backup callee-saves
push %ebx
push %edi
push % esi
....
// restore callee-saves
pop %esi
pop %edi
pop %ebx
// return 0
mov %eax, $0
// cleanup stack and return
leave
ret
Siehe auch: http://www.cs.virginia.edu/~evans/cs...6.html#calling
edit: für x86_64
System V: http://www.x86-64.org/documentation/abi.pdf
Windows: http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
Lesezeichen