Заставить MASM думать про другой адрес.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Desliner, 6 фев 2009.

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Desliner
    Ты написал, что тебе нужно чтобы адрес был другим. Каким другим? Если нужно сделать рибейз, так и напиши. Можешь по-нормальному написать или нет?
     
  2. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Booster
    Таким, какой укажу я. Что значит "рибейз"? А как, по Вашему, "по-нормальному"?
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Desliner
    Если такой какой укажешь ты, то ничего кроме mov eax, moy посоветовать не могу.
    Под рибейзом имел ввиду фиксацию релоков, для загрузки по конкретному адресу.
    Если ты грузишь кусок кода самостоятельно, то необходимо пофиксить релоки.
    Если же ты каким-то образом хочешь встроить этот кусок в другое приложение, то релоки и здесь помогут, пока конечно оно будет грузиться по родному адресу. Объясняй подробней что у тебя. Как ты изложил проблему в первом посте это для телепатов. По третьему посту картина стала проясняться, но не совсем. Какие данные, куда хочешь запихнуть и как? Здесь не место упражнениям по телепатии.

    З.Ы Неплохо бы почитать, как нужно задавать вопросы.
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Desliner
    А ты отвлекись от масма и попробуй придумать хоть какой-нибудь способ коррекции всех абсолютных адресов на новую базу кроме как прибавить дельту во всех командах использующих абсолютные адреса ;) - вот и получается только 3 варианта - 1)сразу задавать нужный адрес под конкретную базу, 2)использовать релоки (готовые или "самодельные"), 3)не использовать абсолютные адреса совсем (только относительные). Если все эти варианты тебя не устраивают то совершенно непонятно чего-же ты хочешь.
    А com файл это DOS - в винде он работает только через эмуляцию.
     
  5. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Booster
    В таком случае, рибейз будет выполнятся загрузчиком Windows, но зачем он здесь нужен? Я ничего фиксить не собираюсь, в результирующем файле релоки не к чему. Приложение, которое создаст мой линкер будет грузиться только по заранее известному ImageBase и не иначе.
    В третьем посте я достаточно четко описал ситуацию, ни о каком запихивании данных там не было речи.

    Что ж, повторю еще раз...
    Всего-лишь есть линкер, который я пишу. Этот линкер должен слинковать PE файл. Причем код, который будет в этом файле, заранее известен. И было бы удобно, если бы этот код находился в самом линкере.
    И здесь возникает проблема: линкер загружен по адресу 400000h, код линкера по адресу 401000h. А код, подлежащий записи, по адресу, ну допустим, 401200h. И все смещения внутри этого кода привязаны именно к этому адресу.
    А в результирующем файле этот код должен быть по адресу 401000h, куда он, в последствии, и загрузится. Но этот код по прежнему будет расчитан на VA 401200h, и все смещения уйдут в ..... ну, понятно куда.

    А насчет телепатии, могу в ответ заметить, что не помешало бы внимательней читать. Проблема, изложенная в первом посте, имеет, по крайней мере, один четкий ответ: "Нет, так нельзя". И я все больше склоняюсь к мысли, что этот ответ - единственный...
     
  6. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Y_Mur
    Да! Именно первый способ! Для этого как раз таки и нужно заставить компилятор думать, что нужный код находится по левому адресу. Другой вопрос - как это реализовать?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Desliner
    Если именно твой линкер сам настраивает адреса на 401200h то что мешает ему их настроить на нужную базу?или код должен сначала исполняться под линкером, а затем без него? или ты хочешь чтобы всю эту работу сделали масм и его link? - тогда не понятно о каком "своём" линкере ты говоришь.
     
  8. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Y_Mur
    Мой линкер скомпилирован и слинкован, с ним все. Нужный код будет исполнятся в новом файле, который будет создан моим линкером, и больше нигде.
    Настройку каких именно адресов Вы имели ввиду? В любом случае, линкер ничего не настраивает, берет код из нужного места, и пишет его как он есть. В случае, если этим местом было виртуальное адресное пространство линкера, то есть, код просто был расположен после кода линкера, получается так, что этот код расчитан на тот VA, где он был, а после загрузки уже нового exe будет загружен по другому VA. И, следовательно, будет обращаться по инвалидным адресам.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Вообще-то не понятно о чем тут спорите. Задача поставлена глупо. Все что нужно - разобраться с таблицей релоков и весь нужный код вынести в отдельную секцию или вообще в конце приклеить оверлей со своей таблицей релоков и со своим разбиением на секции.
     
  10. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    max7C4
    Вы уж извините - как сумел, так и поставил.
    Разбираться с таблицей релоков - лишняя работа и мне, и линкеру. Впринципе этот нужный код можно отдельно собрать в exe с нужными адресами, выдрать оттуда секцию кода, сохранить в файл. И линкер будет брать код оттуда.


    Мой вопрос про use32 в MASM так и остался без ответа...
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Во блин, есть линкёр который не умеет делать релоки, и с ним всё. Подскажите как сказать компилятору, чтобы в слинкованном файле появились релоки.

    Desliner
    Так? Твой линкёр и абсолютные, правильные адреса не умеет высчитывать? Заставить компилятор их высчитать не получиться.
     
  12. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а .use32 - разве не работает
    но только от этого будет зависеть под MASM гораздо больше чем под FASM.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Desliner
    адреса всегда считает именно линкер а не компилятор, но насколько я понял твой "псевдолинкер" это всего лишь заголовок программы, который сохраняет на диск кусок кода слинкованного настоящим линкером масма - размести эту функцию - "псевдолинкер" в конце программы, указав масму стартовую метку на неё и тогда остальной (сохраняемый) код будет расположен где надо.
    masm32 не работает с ДОС программами - для этого нужен masm 6 - в нём use32 конечно есть, но зачем тебе com, исполняемый под ДОС эмулятором тоже непонятно.
     
  14. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Y_Mur
    com файл нужен не для исполнения. Из него очень удобно брать код, который содержится там в чистом виде.

    max7C4
    .use32 - не работает.

    Booster
    Я не говорил, что у меня полноценный линкер.
    Да ну не нужны мне релоки в результируещем файле, не нужны! Пусть он будет базозависимым.
    Хорошо, мой "линкер" даже линкером назвать нельзя, ну и ладно. Он не выполняет никакой работы с кодом, кроме чтения его откуда-либо, и последующей записи в файл.


    Между прочим, дискуссия отошла от вопроса, заданного в 1м посте. На вышеупомянуиый вопрос не прозвучало ни одного внятного ответа, даже ответа "нет" - все скатилось к релокам, линкерам и иже с ними.
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Desliner
    Если нужно слинковать PE файл, тогда бери релоки и вперёд. Настроил адреса на новый ImagBase и копируй.
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Ответ - звучал чуть ли не в каждом посте - "Вопрос сформулирован совершеннно невнятно и потому как на него отвечать тоже непонятно", а вот вразумительной постановки задачи - чего же ты делаешь или хочешь сделать на самом деле так до сих пор и не прозвучало.
     
  17. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Desliner
    Код (Text):
    1. com файл нужен не для исполнения. Из него очень удобно брать код, который содержится там в чистом виде.
    Бред - можно так же создать и обычный bin файл в фасме. Чем он хуже com файла, чтоб из него брать код?
    Y_Mur
    Не парьтесь. Каков вопрос, такой и ответ. Вы уже вторую страницу из него выдавливаете информацию. Но здесь либо автор не сам пишет код, а пытаешь на коленке разобраться в чьем-то коде, либо просто автор не знает базовой терминологии, чтоб объяснить свою задачу.

    Из названия темы - он хочет что программа масм думала - гм. Ладно прекращаю.
    По сути автору проще взять - перестроить код под FASM, дальше берется исходники фасма, изменяются и вауля - фасм начинает думать :derisive:
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Desliner
    Потому, что исходный вопрос - это нонсенс из разряда "можно ли заставить калькулятор думать, что 2х2 равно не 4, а 0yyyyyyyyh". Ответ - НЕТ НЕЛЬЗЯ, т.к. идентификаторы меток, функций и переменных юзаются как раз для того, чтобы компиляторы\линкеры сами заменяли ссылки на эти идентификаторы на реальные правильные адреса = ImageBase + offset, а не на какие-то левые\произвольные\"как я захочу".

    Поэтому для твоей задачи в общем случае для произвольного ImageBase есть два способа: 1) править релоки, которые собс-но для этого и предназначены, 2) создать отдельный экзешник с нужным ImageBase и смещением твоего куска (proc1 и т.п.), выдрать из него нужный кусок и вставить его в твой "линкер" или юзать как отдельный файл.

    Но для частного случая, приведенного тобой в #25, когда ImageBase по сути остается тем же и речь идет только о задании нужно смещения твоей proc1, то это ес-но можно сделать, разместив proc1 в начале секции кода (+можно добавить в начале db 0 dup(X) если нужно доп.смещение), а точку входа start линкера разместить после proc1
     
  19. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    Booster
    Таким линкер будет в перспективе. И, судя по всему, не далекой.

    Y_Mur
    Ну как еще внятней сформулировать? Есть код. Компилируется и линкуется по адресу А, но выглядит так, будто скомпилирован и слинкован по адресу Б. Достаточно не сложная формулировка.
    А то, что я делаю в общем, - звучало в 3м, 10м и 25м постах, еще раз повторять уже нет сил.

    TermoSINteZ
    Да, именно в FASMе. bin файл только лучше, хотябы потому, что можно использовать весь диапазон адресов. А вот возможно ли это в MASMе?
    Автор пишет код, в этом можете не сомневаться. О какой базовой терминологии идет речь? Я пытаюсь изложить нормальным понятным языком, каких терминов Вам не хватает?
    Насчет "думающего" MASMа, если Вам не нравятся думающие программы, могу сформулировать тему по другому: "Заставить MASM компилировать код так, будто он расположен по другому адресу".
    Перестраивать исходники компилятора в мои планы не входило, да и я не могу сказать, что это действительно будет проще.
     
  20. Desliner

    Desliner New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    23
    Адрес:
    Heaven
    leo
    Спасибо за этот ответ, сразу бы так.
    К частному случаю в #25 лучше не привязываться. Именно по 2му способу все сейчас и работает. А к перестроению на 1й способ все и идет.