Par poznámek k tomu tvojemu rozčilování.
Neexistuji nejake figly, jak kompileru rici, ze se jedna o opravdu jednoduchy program a neni treba brat na vrabce delo?
Ten "odpornej" kód, do kterýho se ti to skompilovalo, je nejspíš inicializace CRT (na Windows msvcr*.dll). Možná jde nějak kompileru říct, ať CRT nepoužívá, ale nikdy jsem to nezkoušel.
Dale me dost vytaci, ze program uklada zminovane retezce v SS (zaplatpanbuh ze aspon citace cyklu uklada do registru). Cmecko to ukladalo do DS, s cimz se dobre pracovalo a bylo to tisickrat prehlednejsi.
To je tím, že používáš
auto proměnný, který mají platnost jenom v daným bloku (u tebe to bude nejspíš
main()). Z toho důvodu kompiler používá zásobník (aspoň na architektuře x86), protože přes ten toho jde docílit nejjednodušším a nejrychlejším způsobem. Počítám, že kdybys tam našel na začátku každé funkce volání alokace paměti a na konci dealokace, taky by se ti to nelíbílo. Pokud to nutně potřebuješ uložit "do DS" (nechápu ale proč - chceš to snad debugovat na úrovni asm?), použij třídu
static. Tím ale zase zvětšuješ paměťový nároky programu v době jeho spouštění.
Ukladani vetsich promennych do zasobniku se mi vubec nelibi (ten retezec byl mnohem delsi nez 5 znaku ). Uz na vysce do nas tloukli, ze zasobnik muze zradit, koneckoncu pro to existuji pseudozasobniky tvorene spojovymi seznamy...
Že zásobník může zradit je pravda, ale je to hlavně teorie. Většina programů je napsaná "normálním" způsobem, a kolikrát zažils, že by ti nějakej program spadnul se
STATUS_STACK_OVERFLOW? Já za posledních několik let ani jednou. (Je pravda, že nějaký unixový tooly skompilovaný pro Windows mě občas padají dost záhadně, ale tam to spíš bude narušením paměti, než přeplněním zásobníku).
Tím "normálním" způsobem myslím to, že každá funkce si pro svoje
auto proměnný ukousne pořádnej kus stacku; navíc
auto proměnný vytváří kompiler sám pro svoje potřeby, protože registrů je relativně málo.