[Asembler a raczej Delphi] Stack

0

Jaki rozmiar ma stos?

BTW. Czy zdarzylo sie Wam kiedys napisac taki program, zeby przepelnic stos? i jak temu zaradzic?

0
  1. Stos ma taki rozmiar jaki sobie zadeklarujesz np: [code].stack 10h[/code]
  2. Pewnie, np wystarczy nieodpowiednio wykorzystywać rekurencję.
0

Stos ma taki rozmiar, jaki mu przydzielisz. Np.:
[code]Stosik Segment Stack
db 64 DUP (?)
Stosik EndS[/code]
W tym przypadku ma on 64 bajty.

A przepełnić stos? Żaden problem. Jeśli np. przydzieliłeś stosowi 4 bajty i wykonasz taki kod:
[code]push ax
push 30h
call Funkcja
[/code]
 
To w tym momencie przepełnisz stos, ponieważ odkładasz na niego 4 bajty i wywołujesz funkcję instrukcją call, która odkłada na stos adres powrotu (w tym przypadku już on się nie zmieści).
Oczywiście w prostych programach pod DOSa przepełnienie stosu może być nie odczuwalne, ale może również wykrzaczyć nasz prog. Wyniku nie możesz przewidzieć, dlatego należy unikać takich sytuacji.

[<font color="blue">dopisane</span>]
AndRew mnie wyprzedził.

0

[wstyd] [wstyd] [wstyd] [wstyd] [wstyd] [wstyd] [wstyd] [wstyd] [wstyd] [wstyd]

Ale ja lakonicznie pisze [wstyd] [wstyd] [wstyd]

Otoz chodzi o to, ze ten program jest w Delphi a dalem to do tego dzialu z prefixem Asembler, bo wiedzialem, ze odpowiedz na moje pytanie sprowadzi sie do asemblera.

Kurcze, sorx za taką gafe.

Bycmoze nawet dalem to do zlego dzialu:(

Otoz mam program napisany w Delphi oczywiscie i wyskakuje mi tabliczka o przepelnieniu stosu. I jak temu zaradzic?

BTW. Bardzo prosze mnie nie bluzgac za to, ze dalem to do zlego dzialu i za moje roztargnienie, taki juz jestem:(

<font size="7">Dopisane</span></sup>

  1. Dzieki Dryo za podpunkt 2.
  2. Faktycznie byl blad w programie:)
0

To czy dotyczy Delphi czy Assemblera to nie ma większego znaczenia. Odpowiedź jest taka sama: unikać sytuacji na jakie wskazali poprzednicy. Sprawdź warunki opuszczania funkcji rekurencyjnych. To najczęstsza przyczyna. Delphi zwykle rezerwuje wystarczająco dużo pamięci na stos. Jednak jeżeli sprawdziłeś wszystko dokładnie i program jest poprawny w każdym calu, tylko przeprowadza tak skomplikowane obliczenia to masz do wyboru:

  1. Przejrzeć program i spróbować napisać te fragmenty powodujące przepełnienie inaczej
  2. Zwiększyć rozmiar stosu (Projects->Options->Linker->Memory sizes->Max stack size)

Ja zalecam ten pierwszy sposób.

1 użytkowników online, w tym zalogowanych: 0, gości: 1