Консультация № 202174
17.02.2022, 15:17
0.00 руб.
0 5 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).

Обсуждение

давно
Посетитель
402218
66
17.02.2022, 15:43
общий
это ответ
0000h
0100h начало сегмента кода
2100h конец сегмента код
2102h конец стека
21xxh стек
2200h вершина стека, сюда указывает SP, когда пушим SP уменьшается на размер, который зависит от разрядности. То есть каждый PUSH приближает к адресу 2100h, и далее продолжая пушить заходить в сегмент кода.
5
Спасибо
давно
Старший Модератор
31795
6196
17.02.2022, 20:34
общий
Адресаты:
Цитата: simonovaleksey
или я неправильно понимаю написанное

Для COM-программы все как сказано:
Цитата: Алексей Гладенюк
ss равен сегменту, куда загрузилась программа, а sp = 0FFFEh

Дальше разговор о самом стеке, простая программа, типа
[code lang=asm]org 100h
mov ah,9
mov dx,dbHello
int 21h
ret
dbHello db 10,13,'rfpro$'[/code]
Любое прерывание использует стэк текущей программы, на картинке до и после выполнения программы:

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

давно
Посетитель
405825
2
18.02.2022, 17:24
общий
Спасибо, теперь дошло
давно
Старший Модератор
31795
6196
18.02.2022, 19:02
общий
Адресаты:
Цитата: simonovaleksey
Спасибо, теперь дошло


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

давно
Посетитель
405825
2
21.02.2022, 08:52
общий
Цитата: Зенченко Константин Николаевич
Цитата: simonovaleksey [пост 324453]
Спасибо, теперь дошло

Что именно?

Про переполнение
Форма ответа