Адресация

Тема в разделе "WASM.BEGINNERS", создана пользователем klim, 6 авг 2006.

  1. klim

    klim New Member

    Публикаций:
    0
    Есть следующий вопрос.
    Скомпилировал 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

    Получается чертовщина. Все сегменты "ЗАДЕВАЮТ" друг-друга.
    Вопрос. Где я ошибся? В преобразовании в физические?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Во-первых, не SS-SP, а SS+SP.
    Во-вторых, что страшного в том, что задевают? :)
     
  3. klim

    klim New Member

    Публикаций:
    0
    Во-первых, SS-SP. Стек растёт вниз от максимально аозмодного адреса.
    Во-вторых, если они задевают, то я могу, скажем, записав в стек, изменить значение переменной, т.к. адреса будут совпадать.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Какая разница, куда растет стек. Ты вычисляешь адрес. В SS начало сегмента, SP - смещение от начала сегмента.
    Так что SS+SP
     
  5. klim

    klim New Member

    Публикаций:
    0
    Ну ладно, а как насчёт "задевания"?
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Границы сегментов могут пересекаться. И, соответственно, запись данных в один сегмент может привести к порче данных в другом.
    COM-программы, например, вообще в одном сегменте содержат и код, и данные, и стек. В начале сегмента - код, за ним данные, а то, что осталось отводится под стек.
     
  7. klim

    klim New Member

    Публикаций:
    0
    Всем спасибо.