PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : reg's Sicherung in ASMB-Funktionen die aus C gerufen werden



FriedrichLaher
14-03-2012, 15:02
offenbar sichert calloc zumindest die Register si,di,cx nicht und hinterläßt sie verändert.
Ist
es allgemein so, daß der C-Compiler nicht, nach Aufruf einer Funktion,
unveränderte RegWerte erwartet?

Braucht also eine manuell in Assembler codierte Funktion RegInhalte nicht sichern
und vor Rückkehr wiederherstellen?

jeebee
14-03-2012, 16:36
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:


// 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/cs216/guides/x86.html#calling

edit: für x86_64
System V: http://www.x86-64.org/documentation/abi.pdf
Windows: http://msdn.microsoft.com/en-us/library/ms235286(v=vs.80).aspx

FriedrichLaher
14-03-2012, 17:26
Danke, vorallem auch für die Links

FriedrichLaher
20-01-2013, 09:17
ich habe damals http://www.x86-64.org/documentation/abi.pdf heruntergeladen,
jetz
möchte ich aber andere vielleicht darauf verweisen,
aber klick auf den Link meldet auch nach vielen Versuchen

Der Server unter www.x86-64.org braucht zu lange, um eine Antwort zu senden.

Ist die Doku nun vielleicht anderswo?