Wie ist der Wert von 28h
(dezimal 40), der von rsp
im folgenden berechnet wird:
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?
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. :)
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.
Tags und Links assembly