Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ Ρ…Π°ΠΊΠ΅Ρ€ΠΎΠ² ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сСтСй». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 61

Автор ΠšΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ² Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²

Π‘Ρ‚Π΅ΠΊΠΎΠ²Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Как Π±Ρ‹Π»ΠΎ упомянуто Ρ€Π°Π½Π΅Π΅, стСк позволяСт Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ локальноС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ этой части Π³Π»Π°Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ рассказано, ΠΊΠ°ΠΊ компиляторы ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ функциям ΠΈ ΠΊΠ°ΠΊ это влияСт Π½Π° стСк. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π΅Π»Π΅Π½ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΡŽ вопросов использования стСка Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… процСссора Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ call ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Π½Π΅Π΅ ret.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ свСдСния

Π‘Ρ‚Π΅ΠΊΠΎΠ²Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (stack frame) – ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, выдСляСмая всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° вызываСтся функция. Она прСдназначаСтся для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ хранСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², содСрТимого рСгистра EIP ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… рСгистров, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π Π°Π½Π΅Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ читатСля Π±Ρ‹Π»ΠΎ заострСно Π½Π° использовании стСка ΠΏΡ€ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ рассказано ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… возмоТностях Π΅Π³ΠΎ использования.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ стСк, слСдуСт Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… процСссора Intel call ΠΈ ret. Команда call – основная ΠΊΠΎΠΌΠ°Π½Π΄Π° для сущСствования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Команда позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠ² ΠΏΡ€ΠΈ этом адрСс Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² стСкС. Для этого ΠΊΠΎΠΌΠ°Π½Π΄Π° call Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

1) ΠΏΡ€ΠΎΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ Π² стСк адрСс ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся адрСсом Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° – Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΡƒΠ΄Π° процСссор пСрСдаст ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ (возвратится) послС выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ;

2) ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ call адрСсу для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

А ΠΊΠΎΠΌΠ°Π½Π΄Π° ret Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ΅. Π•Π΅ Π·Π°Π΄Π°Ρ‡Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΈΠ· Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ call. Для этого ΠΊΠΎΠΌΠ°Π½Π΄Π° ret выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

1) ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΈΠ· стСка сохранСнный адрСс Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°;

2) ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½ΠΎΠΌΡƒ ΠΈΠ· стСка адрСсу Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°.

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ этих Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠ°Π½Π΄ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ управлСния ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΠΎ Π΅Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, благодаря сохранСнному Π² стСкС содСрТимому рСгистра EIP всСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· стСка адрСс Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°. ПослС изучСния ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ²ΠΎΠ³ΠΎ стСка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ± этом Π±ΡƒΠ΄Π΅Ρ‚ сказано ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ простой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ использованиС Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ²ΠΎΠ³ΠΎ стСка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ нСсколько Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, инициализируСтся ΠΈ вызываСтся функция callex, Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Ѐункция callex ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ свои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π° экранС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.

На рисункС 8.4 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая поясняСт структуру Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ²ΠΎΠ³ΠΎ стСка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΅Π³ΠΎ использованиС Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… call ΠΈ ret.

Рис. 8.4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ использованиС стСка Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°

ДизассСмблированиС

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½Π° рис. 8.4 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° скомпилирована ΠΊΠ°ΠΊ консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Windows Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ построСния ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ вСрсии Release. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ дизассСмблирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ callex() ΠΈ main() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π° рис. 8.5 ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ callex() ΠΈ main() послС компиляции. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠΎ ссылкС Π±ΡƒΡ„Π΅Ρ€Π° памяти buffer ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex(). Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, функция callex() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±ΡƒΡ„Π΅Ρ€ buffer, Π° Π½Π΅ копию содСрТащихся Π² Π½Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС измСнСния Π² Π±ΡƒΡ„Π΅Ρ€Π΅ buffer, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex(), Ρ‚ΡƒΡ‚ ΠΆΠ΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° содСрТимом Π±ΡƒΡ„Π΅Ρ€Π° buffer Π² main(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° самом Π΄Π΅Π»Π΅ это ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ пСрСмСнная.

Рис. 8.5. ДизассСмблированный Π²ΠΈΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex()

Π”Π°ΠΌΠΏΡ‹ стСка

На рисунках 8.6–8.9 прСдставлСн стСк Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° рисунках 8.6–8.9 Π΄Π°ΠΌΠΏΠ°ΠΌΠΈ, исходным тСкстом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС C ΠΈ Π΅Π΅ дизассСмблСрным Π²ΠΈΠ΄ΠΎΠΌ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ происходящиС Π² стСкС измСнСния ΠΈ ΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ²ΠΎΠ³ΠΎ стСка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΅Π³ΠΎ Ρ€ΠΎΠ»ΡŒ ΠΈ мСсто Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

На рисункС 8.6 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π΄Π°ΠΌΠΏ стСка сразу послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½ΠΎ Π΄ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ записи Π² стСк Π΅Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ «чистого» стСка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Рис. 8.6. Π”Π°ΠΌΠΏ стСка послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main()

Π”Π°Π»Π΅Π΅, ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex() Π² стСк Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π΅Π΅ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (см. рис. 8.7).

Рис. 8.7. Π”Π°ΠΌΠΏ стСка Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex() ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main()

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ измСнСния Π² Π΄Π°ΠΌΠΏΠ΅ стСка ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с рис. 8.6. ПослС размСщСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² области стСка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() Π² стСк Π±Ρ‹Π»ΠΈ записаны ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex(), Π½ΠΎ сама функция ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π°. На рисункС 8.8 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π΄Π°ΠΌΠΏ стСка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex() послС Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π°.

Рис. 8.8. Π”Π°ΠΌΠΏ стСка послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex() ΠΈ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΡ€ΠΎΠ»ΠΎΠ³Π°, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° printf Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex()

ΠŸΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° рис. 8.8 стСк ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ callex(). ЕдинствСнноС, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, β€“ это Π²ΠΈΠ΄ стСка ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf(), список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… элСмСнтов.

НаконСц, ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex() ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… printf() Π² стСк ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π­Ρ‚ΠΎ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄Π°ΠΌΠΏΠ° стСка, прСдставлСнного Π½Π° рис. 8.9.

Рис. 8.9. Π”Π°ΠΌΠΏ стСка ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf() Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ callex()

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π΄Π°ΠΌΠΏΡ‹ стСка позволят Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ заполнСния стСка. ΠŸΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Π½Ρ‹Π΅ знания пригодятся ΠΏΡ€ΠΈ обсуТдСнии способов пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π°.

Π‘Ρ‚Π΅ΠΊΠΎΠ²Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ ΠΈ соглашСния ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² соглашСний ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… отличаСтся способом использования стСка. Иногда очистка стСка послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ возлагаСтся Π½Π° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π° Π²Ρ‹Π·Π²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ΠΈΠΏ Π²Ρ‹Π·ΠΎΠ²Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ компилятору, ΠΊΠ°ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стСковый Ρ„Ρ€Π΅ΠΉΠΌ.

НаиболСС часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ соглашСниС ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ языка C (C declaration syntax). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, объявлСнной Π² стилС языка Π‘, Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² стСк Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС (справа Π½Π°Π»Π΅Π²ΠΎ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ записываСтся Π² стСк послСдним). Для Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ это ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ выталкиваСтся ΠΈΠ· стСка Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ стСк, зная число ΠΈ Ρ‚ΠΈΠΏ Ρ€Π°Π½Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π² стСкС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ОписанноС соглашСниС ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° MS Visual C/C++ ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСн Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…. Иногда Π΅Π³ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ синтаксисом Π²Ρ‹Π·ΠΎΠ²Π° cdecl (cdecl calling syntax). Ѐункция printf() являСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ синтаксис cdecl для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ числа ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf() Π²Ρ‹Π·Π²Π°Π²ΡˆΠ°Ρ Π΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ стСк.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ соглашСниС ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ синтаксиса стандартного Π²Ρ‹Π·ΠΎΠ²Π° (standard call syntax). Аналогично синтаксису cdecl ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² стСк Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. Π Π°Π·Π½ΠΈΡ†Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ вызванная функция измСняСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка Π΄ΠΎ своСго Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Иногда это ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ Π½Π°Π΄ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, это позволяСт Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ измСнСния стСка Π² Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ WIN32 API написано с использованиСм синтаксиса стандартного Π²Ρ‹Π·ΠΎΠ²Π°, ΠΈΠ½ΠΎΠ³Π΄Π° извСстного ΠΊΠ°ΠΊ stdcall.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ соглашСния ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π½Π°Π·Π²Π°Π½ΠΈΠ΅ синтаксиса быстрого Π²Ρ‹Π·ΠΎΠ²Π° (fast call syntax). Он схоТ Π½Π° синтаксис стандартного Π²Ρ‹Π·ΠΎΠ²Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ вызываСмая функция ΠΏΠ΅Ρ€Π΅Π΄ своим Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ стСк, Π½ΠΎ отличаСтся способом записи ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² стСк. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· рСгистры, поэтому ΠΎΠ½ΠΈ Π² стСк Π½Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ вызываСмая функция обращаСтся ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π²ΡƒΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· рСгистры, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹. Бинтаксис быстрого Π²Ρ‹Π·ΠΎΠ²Π° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Delphi-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ Π² пространствС ядра ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы NT (пространство ядра (kernel space) – Π±Π»ΠΎΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти, ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ для использования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ядра Π² ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅).