Ik ga ervan uit dat u onder een 32-bits omgeving werkt omdat in een 64-bitsomgeving argumenten in registers worden doorgegeven.
Vraag 1
Misschien geef je hier een floating point-argument door. Je kunt niet direct hierop duwen, omdat de push
-instructie in een 32-bits runtime 4 bytes per keer pusht, dus je zou de waarde moeten opsplitsen. Het is soms eenvoudiger om 8 af te trekken van esp
en ze verplaatsen het 8-byte quadwoord naar [esp]
.
vraag 2
ebp
is frequently used to index the parameters and locals in stack frames in 32-bit code. This allows the offsets within frames to be fixed even as the stack pointer moves. For example consider
void f(int x) {
int a;
g(x, 5);
}
Als u nu alleen toegang hebt tot de inhoud van het stapelframe met esp
, dan is a
op [esp]
, het adres van de retour is [esp + 4]
en x
staan op [esp + 8]
. Laten we nu code genereren om g
aan te roepen. We moeten eerst op 5 drukken en vervolgens op x
drukken. Maar na het drukken op 5 is de offset van x
van esp
veranderd! Dit is de reden waarom ebp
wordt gebruikt. Normaal bij het invoeren van functies drukken we op de oude waarde van ebp
om het op te slaan en kopiëren we vervolgens esp
naar ebp
. Nu kan ebp
worden gebruikt om toegang te krijgen tot de inhoud van het stapelframe. Het zal niet bewegen wanneer we ons in het midden van voorbijgaande argumenten bevinden.
vraag 3
Met deze instructie en
worden de laatste 4 bits van esp
uitgelijnd en uitgelijnd op een 16-byte-begrenzing. Aangezien de stapel naar beneden toe groeit, is dit leuk en veilig.