Разделение сегментов

Тема в разделе "WASM.BEGINNERS", создана пользователем Yalud66, 7 сен 2005.

  1. Yalud66

    Yalud66 New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2005
    Сообщения:
    14
    Адрес:
    Екатеринбург
    У меня имеется скелет программы для masm32:

    .386

    .MODEL Flat, STDCALL

    .DATA

    <инициализируемые данные>

    ......

    .DATA?

    <не инициализируемые данные>

    .CODE

    <метка>

    <код>

    ......

    end <метка>



    Какие мне необходимо вставить директивы и где, чтобы секции .DATA и .DATA? распологались в сегменте ds(и если это возможно с определенного адреса - xxxxxxxx),а секция .CODE располагалась в сегменте сs(и если это возможно с определенного адреса - yyyyyyyy)
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В 32-бит коде при flat-модели памяти понятие сегментов чисто условное и не имеет никакого отношения к размещению секций данных и кода в памяти. Базовые адреса сегментов DS,ES,SS,CS одинаковы и равны 0, а вот секции размещаются в памяти в соответствии с требованиями PE-формата для EXE-файлов, поэтому по произвольному (от балды) адресу xxxxxxxx их разместить в принципе нельзя. Как разместить секции решает компилятор\линковщик и повлять на адреса секций можно только изменением их размера и выравнивания. Ну а во время выполнения программы данные ес-но по умолчанию будут адресоваться через ds, код через cs, стэк через ss - это все "само-собой" подразумевается и никаких директив не требуется
     
  3. Yalud66

    Yalud66 New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2005
    Сообщения:
    14
    Адрес:
    Екатеринбург
    Хорошо, я сформулирую вопрос по другому.



    Я продисасемблировал код программы с помощью IDA.

    В заголовке кода прописанно следующее:

    _text segment para public 'CODE' use32

    assume cs:_text

    ;org 1401000h

    assume es:nothing, ss:nothing, ds:_data, fs:nothing,



    Дальше следуют два блока данных: один после метки _text

    , второй после _data

    Как выяснилось text-это код нашей программы,

    а data-это ее данные.

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

    Может вы просто подскажите, как написать то же самое для masm32(_text это будет .CODE, а _data будет .DATA)



    _text segment para public 'CODE' use32

    assume cs:_text

    ;org 1401000h

    assume es:nothing, ss:nothing, ds:_data, fs:nothing,



    За ранее благодарен.
     
  4. Yalud66

    Yalud66 New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2005
    Сообщения:
    14
    Адрес:
    Екатеринбург
    Прошу прощения за неточность, после трансляции masmom секция _data присутствует, но все же проблема остается. Суть написана выше.
     
  5. Yalud66

    Yalud66 New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2005
    Сообщения:
    14
    Адрес:
    Екатеринбург
    Кажется я сам во всем разобрался. Просто там, где был вписан адрес с вызываемой процедурой, я поменял на реальный адрес и все заработало. Спасибо за участие.