Есть следующий вопрос. Скомпилировал DOS программу. Затем встроенным в windows отладчиком debug решил воспользоватся. Посмотрел на значения сегментных регистров. Вот.. DS => 0C01h ES => 0BEFh SS => 0C02h CS => 0BFFh Но это логические адреса. Преобразуем в физические. DS => C010h ES => BEF0h SS => C020h CS => BFF0h В стек я ничего не брал. SP = 0100h Так вот, найдём физический [SS-SP]. [SS-SP] = C020h-0100h = BF20h Отсортируем по возрастанию адресов: ES => BEF0h SS-SP => BF20h CS => BFF0h DS => C010h SS => CO20h Получается чертовщина. Все сегменты "ЗАДЕВАЮТ" друг-друга. Вопрос. Где я ошибся? В преобразовании в физические?
Во-первых, SS-SP. Стек растёт вниз от максимально аозмодного адреса. Во-вторых, если они задевают, то я могу, скажем, записав в стек, изменить значение переменной, т.к. адреса будут совпадать.
Какая разница, куда растет стек. Ты вычисляешь адрес. В SS начало сегмента, SP - смещение от начала сегмента. Так что SS+SP
Границы сегментов могут пересекаться. И, соответственно, запись данных в один сегмент может привести к порче данных в другом. COM-программы, например, вообще в одном сегменте содержат и код, и данные, и стек. В начале сегмента - код, за ним данные, а то, что осталось отводится под стек.