Wat zijn de ESP- en de EBP-registers?

Ik ontdekte dat het ESP-register de huidige stapelaanwijzer is en EBP de basisaanwijzer voor het huidige stapelframe. Ik begrijp deze definities echter niet (ik begin net te leren coderen in assembler).

Wat ik begrijp is dat ESP naar de stapel zelf wijst en EBP naar wat zich boven op de stapel bevindt1. Maar dit zijn slechts mijn gissingen en ze zijn hoogstwaarschijnlijk onjuist. Wat zou anders een uitspraak als de volgende betekenen?

MOV EBP, ESP    

Voetnoot 1: Noot van de redactie: Ja, dat is onjuist. In standaardterminologie is de “top of the stack” waar ESP naar wijst, ook al is dit het laagste adres in het stackframe. Naar analogie met een stapelgegevensstructuur die naar boven groeit, ook al groeit de callstack op x86 (zoals de meeste ISA’s) naar beneden.


Antwoord 1, autoriteit 100%

esp is de stapelaanwijzer, ebp is/was voor een stapelframe, zodat wanneer u een functie invoerde, ebp op dat moment een kopie van esp zou kunnen krijgen, alles op de stapel voordat dat gebeurt, retouradres, doorgegeven in parameters, enz. en dingen die globaal zijn voor die functie (lokale variabelen) zullen nu een statische afstand van de stackframe-aanwijzer zijn voor de duur van de functie. esp is nu vrij om rond te dwalen zoals de compiler wenst en kan worden gebruikt bij het nesten naar andere functies (elk moet de ebp op natuurlijke wijze behouden).

het is een luie manier om de stapel te beheren. maakt het debuggen van de compiler een stuk eenvoudiger, maakt het begrijpen van de code die door de compiler wordt gegenereerd gemakkelijker, maar brandt een register dat anders een algemeen doel zou kunnen zijn.


Antwoord 2, autoriteit 31%

Normaal gesproken wordt EBP gebruikt om ESP te back-uppen, dus als ESP wordt gewijzigd door de code in een functie, is het enige dat nodig is om ESP te herstellen, ESP, EBP. Omdat EBP normaal gesproken ongewijzigd wordt gelaten door de code in een functie, kan het worden gebruikt om toegang te krijgen tot doorgegeven parameters of lokale variabelen zonder de offsets aan te passen.

Voor gebruik van “stackframe” wordt EBP aan het begin van een functie op de stapel geduwd, dus de waarde van EBP die op de stapel wordt geduwd, is de waarde van EBP van de functie die de huidige functie heeft aangeroepen. Dit maakt het mogelijk voor code of voor een debugger om alle gevallen waarin EBP naar de stapel is gepusht, te “terugsporen”, en elk exemplaar van een EBP-waarde op de stapel kan worden beschouwd als de basisaanwijzer van een stapelframe .

Houd er rekening mee dat sommige compilers een optie hebben om frame-pointers weg te laten, in welk geval EBP niet wordt gebruikt om ESP op te slaan of als stack-frame-pointer. In plaats daarvan houdt de compiler ESP bij en alle lokale offsets zijn offsets van de huidige waarde van ESP.


Antwoord 3, autoriteit 20%

EBP en ESP zijn overblijfselen van het tijdperk, waar compilers b.v. statische analyse hebben om te detecteren hoeveel bytes van een stapel nodig zijn in een functieaanroep. Ook moest de stapel dynamisch groeien en krimpen tijdens het uitvoeren van een functie, interrupts zouden het mogelijk hebben gemaakt om de hele stapel van 0 tot SP te vernietigen, en spaghetticode was de de facto standaard. Eigenlijk waren interrupts (en het doorgeven van parameters alleen via registers) de ontworpen methode om kernelfuncties aan te roepen.

In deze omgeving is een nodig om een ​​vast punt van de stapel te hebben, waar het retouradres naar de beller, lokale variabelen en de argumenten van een functie altijd worden gevonden. Dus de bpregister was gerechtvaardigd. In deze architectuur mag bpworden geïndexeerd ([BP – 300H]), maar spWAS NIET. Die opcodes / instructiecoderingen die kunnen worden geïnterpreteerd als mov ax, [sp + 1111h]werden hergebruikt voor andere doeleinden.

In 386+ en via de introductie van de ‘E’, heeft ESP het eigendom van offset opgedaan. Op dit moment werd EBPbevrijd van het enige doel, zoals espin staat om beide taken aan te pakken.

Opmerking, dat zelfs nu EBPPUNTEN NAAR HERMORTEN DOOR HET STACK SEGMENT (SS), Net als esp. Andere adresseermodi (zonder ESP / EBP als basis) standaard aan het DS-segment. (Absolute, DI, SI en / of BX in 16-bits modus, en in 32-bits adressiemodi kan elk register een basis zijn in een adressatiemodus).


Antwoord 4, Autoriteit 8%

Het ESP-register is de stapelaanwijzer voor de systeemstapel. Het wordt zelden direct gewijzigd door een programma, maar is veranderd
Wanneer gegevens op de stapel worden geduwd of van de stapel worden geduwd. Eén gebruik voor de stapel is in procedure-oproepen. Het adres van de instructies na de oproepinstructie van de procedure wordt opgeslagen op de stapel. de EBP-registerwijzers op de basis.
Normaal gesproken is het enige data-item dat in de stapel is bereikt, degene die bovenaan de stapel staat. Hoewel het EBP-register vaak wordt gebruikt om een ​​vast punt in de stapel anders dan de bovenkant van de stapel te markeren, zijn bijvoorbeeld de parameters van dergelijke gegevens. Ze worden gecompenseerd van de stapelaar van de stapel EBP van de basisaanwijzer na het retouradres. Dus je zult iets zien als EBP + 0x8, EBP + 0XC, dit is parameters zoals respectievelijk 1 en 2.

Het begrijpen van de stapel is erg cruciaal bij het programmeren in assembler, omdat dit van invloed kan zijn op de belconventies die je gaat gebruiken, ongeacht het type. Zelfs de cdecl of __stdcall is bijvoorbeeld ook afhankelijk van de ESP- en EBP-registers, en ook andere zijn op de een of andere manier afhankelijk van sommige registers en de stapel.

Other episodes