Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Microsoft-specifieke
Voordat u uw eigen prolog- en epilog-codereeksen schrijft, is het belangrijk om te begrijpen hoe het stackframe is ingedeeld. Het is ook handig om te weten hoe u het __LOCAL_SIZE symbool gebruikt.
Indeling stapelframe
In dit voorbeeld ziet u de standaard prolog-code die kan worden weergegeven in een 32-bits functie:
push ebp ; Save ebp
mov ebp, esp ; Set stack frame pointer
sub esp, localbytes ; Allocate space for locals
push <registers> ; Save registers
De localbytes variabele vertegenwoordigt het aantal bytes dat nodig is op de stack voor lokale variabelen en de <registers> variabele is een tijdelijke aanduiding die de lijst met registers vertegenwoordigt die moeten worden opgeslagen op de stack. Nadat u de registers hebt gepusht, kunt u alle andere geschikte gegevens op de stack plaatsen. Hier volgt de bijbehorende epilogcode:
pop <registers> ; Restore registers
mov esp, ebp ; Restore stack pointer
pop ebp ; Restore ebp
ret ; Return from function
De stack groeit altijd omlaag (van adressen met hoog tot laag geheugen). De basispointer (ebp) verwijst naar de gepushte waarde van ebp. De lokale bevolking begint bij ebp-4. Als u toegang wilt krijgen tot lokale variabelen, berekent u een verschuiving van waaruit ebp u de juiste waarde wilt ebpaftrekken.
__LOCAL_SIZE
De compiler biedt een symbool, __LOCAL_SIZEvoor gebruik in het inline assembly-blok van functie prolog-code. Dit symbool wordt gebruikt om ruimte toe te wijzen voor lokale variabelen in het stackframe in aangepaste prolog-code.
De compiler bepaalt de waarde van __LOCAL_SIZE. De waarde is het totale aantal bytes van alle door de gebruiker gedefinieerde lokale variabelen en door compiler gegenereerde tijdelijke variabelen.
__LOCAL_SIZE kan alleen worden gebruikt als een onmiddellijke operand; het kan niet worden gebruikt in een expressie. U mag de waarde van dit symbool niet wijzigen of opnieuw definiƫren. Voorbeeld:
mov eax, __LOCAL_SIZE ;Immediate operand--Okay
mov eax, [ebp - __LOCAL_SIZE] ;Error
In het volgende voorbeeld van een naakte functie met aangepaste prolog- en epilog-reeksen wordt het __LOCAL_SIZE symbool in de prolog-reeks gebruikt:
// the__local_size_symbol.cpp
// processor: x86
__declspec ( naked ) int main() {
int i;
int j;
__asm { /* prolog */
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
}
/* Function body */
__asm { /* epilog */
mov esp, ebp
pop ebp
ret
}
}
Microsoft-specifieke beƫindigen