Прямо сейчас я пытаюсь изучить ассемблер в системах x86. Поэтому готовлю книгу «Программирование с нуля». (Доступно бесплатно по адресу http://download.savannah.gnu.org/releases/pgubook/ < / а>)
На странице 53 объясняется, как работает стек компьютера:
Стек компьютера находится в самых верхних адресах памяти. Вы можете помещать значения в верхнюю часть стека с помощью инструкции pushl. [...] Ну, мы говорим, что это верх, но "верх" стека на самом деле является низом памяти стека. [...] В памяти стек начинается с вершины памяти и увеличивается вниз по архитектурным соображениям. Поэтому, когда мы говорим о «вершине стека», помните, что она находится в нижней части памяти стека.
Я понимаю эту часть. Допустим, память стека начинается с адреса 0 и заканчивается по адресу 11 (включительно). Это означает, что в настоящее время в стеке есть три слова (по 4 байта). Насколько я понимаю, слово, которое находится «наверху» стека, в настоящее время занимает адреса 8, 9, 10 и 11. (поскольку одно слово имеет 4 байта и, следовательно, занимает четыре места хранения в основной памяти). Однако теперь в книге говорится следующее:
Регистр стека% esp всегда содержит указатель на текущую вершину стека.
Хорошо, в моем примере регистр% esp будет содержать адрес 8. Он указывает на слово, которое в настоящее время находится на вершине стека. Но...
Каждый раз, когда мы помещаем что-то в стек с помощью pushl,% esp вычитается на 4, так что он указывает на новую вершину стека (помните, что каждое слово имеет длину четыре байта, и стек увеличивается вниз).
Какие? Разве не наоборот? Если я помещу в стек еще одно машинное слово размером 4 байта, это слово займет адреса основной памяти с 12 по 15. Как они и сказали: стек растет вниз. Теперь регистр% esp указывает на слово, которое в данный момент находится на вершине стека. Он начинается с адреса 12. До того, как мы поместили еще одно слово в стек, адрес, который был сохранен в% esp, был 8. Итак,% esp явно был добавлен 4, а не вычтен. Откуда у них вычитание? Что я пропустил? Я очень смущен...
Помощь очень ценится;)