Stapelausrichtung in x64-Assembly

8

Wie ist der Wert von 28h (dezimal 40), der von rsp im folgenden berechnet wird:

%Vor%

aus: Ссылка

Nach meinem Verständnis müsste ich nur 20h subtrahieren, da jeder Wert, den ich benutze, 8 Bytes in 4 ist, ist 20h . Also warum wird 28h subtrahiert und wie ergibt dies 16 Byte Alignment?

Siehe auch Ist die Reservierung von Stapelspeicher für Funktionen mit weniger als vier Argumenten erforderlich?

    
vandale 02.10.2013, 00:45
quelle

2 Antworten

9

Ich glaube, das liegt daran, dass der Stapel ausgerichtet ist, bevor main aufgerufen wird. Dann, nach dem call , war der Akt des call , einen 8-Byte-Zeiger (Adresse des Aufrufers) auf den Stapel zu schieben. Also am Anfang von main sind es 8 Bytes von der 16-Byte-Ausrichtung. Statt 20h benötigen Sie also 28h und bringen die tatsächliche Summe auf 28h + 8h (von call ) oder 30h . Ausrichtung. :)

    
lurker 02.10.2013, 01:19
quelle
1

Ich war über denselben Fall gestolpert. Versuchte Lurker Antwort und war in Ordnung. Später habe ich etwas Code hinzugefügt (übrigens verwende ich meinen eigenen Compiler) und bekam Probleme.

Das Problem war, dass die Schattenraumadresse mit 8 auf dem Stapel endete. Wenn die Adresse des Schattenbereichs mit 0 endete ("Stapel auf 16 Bytes ausgerichtet"), war der Anruf OK. Hinzufügen von 8 Bytes wird die App in meinem letzten Fall zum Absturz bringen.

    
Sam 17.01.2015 09:40
quelle

Tags und Links