Buffer von C in Assembler

Hi,

ich wurde gestern etwas gefragt, wo ich keinen Rat wusste.

Mal folgendes kleines C Programm

Code:
void function(int a, int b, int c)
{
	char buffer1[8];
	char buffer2[16];
}

int main(void)
{
	function(1,2,3);
	return 0;
}
[\code]

function will also 24 Byte reservieren, wenn ich nun mit [I]gcc -S ....[/I] compiliere bekommei ch folgendes Assembler Code :

[code]
function:
	pushl	%ebp            
	movl	%esp, %ebp
	subl	$40, %esp

Wieso reserviert er 40 Byte ?
 
Soweit ich das beurteilen kann wird doch nciht nur Speicher für die Char buffer reserviert,sondern auch für die Funktion bzw. die Returnadresse(also die Adresse, an der der Code nach dem Ausführen der Funktion weiter ausgeführt werden soll).

Außerdem wird nciht immer genau der Speicher reserviert, benötigt wird, sondern immer in 4Byte-Schritten(1 Word-Größe).

Vermutung:
buffer1: 8
buffer2: 16
int a: 4
int b: 4
int c: 4
return: 4

= 10+4 = 40
 
Für Returnadresse wird normalerweise nichts "manuell" reserviert, das Microprogramm für "Call XYZ" Opcode manipuliert automatisch den ESP Wert samt Stack (schreibt Returnwert rein).
Die Argumente werden auch außerhalb der Funktion auf den Stack gelegt und für gewöhnlich (dank MOV EBP,ESP am Anfang der Funktion )über [EBP+8] angesprochen. Ich gehe jetzt natürlich von "normalen" C-Callingkonventions aus ;).

Ansonten habe ich das hier in meiner Linksammlung ausgegraben:
http://www.trapkit.de/papers/gcc_stack_layout_v1_20030830.pdf
demnach werden 8 Bytes pro Buffer zusätzlich registriert (je nach GCC Version) als Bufferoverflowschutz.Warum das erst ab einer gewissen Größe passiert, bleibt wohl das GCC Mysterium. Hab mich da ehrlich gesagt nicht sonderlich eingearbeitet, es könnte aber ein Anstoss für eine gezielte Suche sein.
 
Danke, das PDF hilft mir erstmal weiter !

Wieso es erst ab 8 Byte gemacht wird, verstehe ich bis jetzt auch nicht X(
 
Zurück
Oben