· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Вопросы по FASM

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Сен 28, 2004 15:08:11

Если я не ошибаюсь, релокация работает примерно так:

Пусть IMAGE_BASE по умолчанию = 400000h.
push $ тогда будет push 401000h.
Так как 401000h - адрес абсолютный, то для того, что бы релокация была возможной, создаётся ссылка в таблице релоков на операнд команды push.

Тепеь, если нужно загрузить PE по адресу 600000h, загрузчик посмотрит таблицу релоков и добавит к операнду push число 200000h, соответственно получится правильный операнд - 601000h.

Т.е релоки нужны именно при "положительном" адресе.

Если же адрес "отрицательный", то для "правильной релокации" нужно не прибавлять к нему смещение, а отнимать.

В случае с push 1-$ и загрузке PE по адресу 600000h, "правильное" значение операндов должно бы быть FF9FF001.
Но в загрузчике просто не предесмотрен такой случай т.к. с точки зрения PE формата отрицательных адресов просто быть не может.

То, что EXE файлы загружаются по фиксированому адресу и могут не содержать релоков (если запуск не происходит в каком-нибудь Win32S) - это частный случай, поэтому то и можно обойти ограничение, использовав RVA.
В реальной программе в общем-то сложно представить ситуацию, где может понадобиться вычитание адреса метки на момент компиляции.
(хотя у меня такое было :-)

Это не ограничение FASM - если не указывать format pe, то push 1-$ компилируется без проблем.


Дата: Сен 28, 2004 15:45:26

„загрузчик посмотрит таблицу релоков и добавит к операнду push число 200000h,“

Ого , я об релоках особо не читал и даже не подумал , что такое может быть .

„(хотя у меня такое было :-) “

И у меня уже не первый раз , вот недавно хотел сассемблировать :
00401002 | E8 13D0FA78 | CALL 793AE01A ; \ExitProcess
А как ? Только полностью ручками , и дистанцию до 793AE01A считать .

db 0E8h
dd 78FAD013h

„если не указывать format pe, то push 1-$ компилируется без проблем.“

Это я не попробывал , спасибо :)


Дата: Сен 28, 2004 18:31:03

bogrus > „я об релоках особо не читал и даже не подумал , что такое может быть . “

Гы, я совсем не читал, но почему-то думаю что это именно так :-)


> „А как ? Только полностью ручками , и дистанцию до 793AE01A считать . “

А разве нельзя плюсом тут обойтись, непойму, почему обязательно минус должен быть?


Вот, кстати, как делать на FASM PE файл без директивы 'format pe'

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.045