Консультация онлайн # 202174

Раздел: Assembler
Автор вопроса: simonovaleksey (Посетитель)
Дата: 17.02.2022, 15:17 Консультация неактивна
Поступило ответов: 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Цитата из книги Калашникова по ассемблеру:

не следует забывать о таком понятии, как переполнение стека. Мы знаем, что
после загрузки COM-программы в память, ss равен сегменту, куда загрузилась
программа, а sp = 0FFFEh. Код программы начинается с адреса 100h (org 100h).
Вершина стека — конец сегмента. Если наша программа занимает, скажем,
2000h байт, то можем установить sp в 2200h. В этом случае мы отводим 100h
(именно сто) байт для стека (т. к. программа загружается в память по адресу
100h (org 100h), то к 2000h нужно прибавить 100h). Стек, как вы помните, рас-
тет снизу вверх. Если мы переполним стек (например, поместим более 100h
данных), то затрется часть нашей программы снизу.


Не понимаю здесь ошибка или я неправильно понимаю написанное? 2000h байт это размер программы или сегмент памяти, в который загружается программа. Если сегмент, то не понимаю почему sp не устанавливается в 2300h (то есть 100h на код, 100h на стек), ведь код начинается 2000h + 100h = 2100h. Стек начинается с 2200h, то есть он сразу начнет затирать код программы (если конечно код и стек не уместятся в эти 100h).

Ответ # 1, Kdsfofwe21 (3-й класс)

0000h
0100h начало сегмента кода
2100h конец сегмента код
2102h конец стека
21xxh стек
2200h вершина стека, сюда указывает SP, когда пушим SP уменьшается на размер, который зависит от разрядности. То есть каждый PUSH приближает к адресу 2100h, и далее продолжая пушить заходить в сегмент кода.

Kdsfofwe21

3-й класс
17.02.2022, 15:43
5
Спасибо

Мини-форум консультации # 202174

Зенченко Константин Николаевич

Старший модератор

ID: 31795

324448

= общий =    17.02.2022, 20:34

или я неправильно понимаю написанное


Для COM-программы все как сказано:

ss равен сегменту, куда загрузилась программа, а sp = 0FFFEh


Дальше разговор о самом стеке, простая программа, типа
Код [Assembler]
org 100h
mov ah,9
mov dx,dbHello
int 21h
ret
dbHello db 10,13,'rfpro$'

Любое прерывание использует стэк текущей программы, на картинке до и после выполнения программы:

На выделеных участках "как бы" полезная для программы информация, но игра с SP приводит к тому, что полезная для программы информация, может быть изменена, т.е. переполнение стэка.
=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile
simonovaleksey

Посетитель

ID: 405825

324453

= общий =    18.02.2022, 17:24
Спасибо, теперь дошло
Зенченко Константин Николаевич

Старший модератор

ID: 31795

324454

= общий =    18.02.2022, 19:02

Спасибо, теперь дошло



Что именно?
=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile
simonovaleksey

Посетитель

ID: 405825

324494

= общий =    21.02.2022, 08:52

Цитата: simonovaleksey [пост 324453]
Спасибо, теперь дошло

Что именно?


Про переполнение
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.