Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.11.2010, 20:42
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию Странный вопрос

Мне необходимо чуток подправить машинный код функции A "на ходу", из другой функции. Но вот беда: если я делаю

byte((@A)^):=123;

мне пишут Access Violation: Write of address блаблабла.
Как обойти эту ошибку? можно ли ее отключить? или как иначе поменять код?

Копировать функцию в новое место и там извращаться не вариант, делфа использует относительные адреса, и для нового положения функции не будут работать никакие переменные.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 02.11.2010 в 21:12.
Ответить с цитированием
  #2  
Старый 02.11.2010, 21:14
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Если я правильно понял, то вы пытаетесь внести изменения в файл, который в данный момент исполнаяется, что невозможно. Хотя, возможно, я что-то не так понял
Ответить с цитированием
  #3  
Старый 02.11.2010, 21:20
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

нет, EXE грузится в оперативку, и в ней я уже работаю. На ассемблере такой код сделать можно вроде бы (под ДОС пробовал, под винду нет, но должно быть все нормально). Мне кажется, что это делфа отлавливает ошибки Access Violation. Если так - то надо как-то выключить это.

хотя, в принципе, с устройством винды, может это действительно нереально...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #4  
Старый 02.11.2010, 21:33
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Как вариант, можно еще запустить проект без отладки, тогда среда не будет перехватывать ничего
Ответить с цитированием
  #5  
Старый 02.11.2010, 21:36
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

так я и не из среды вообще запускал - там же ошибки вделаны в прогу. Например, I/O Error 3 возникает при открытии несуществующего файла даже при запуске вне среды, но отключить можно через {$I-}. Может тут так же?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #6  
Старый 02.11.2010, 21:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не совсем так.
Ты не можешь править exe в тот момент, когда он уже запущен. Область кода блокированна для изменений. Однако, можно хитрым способом записать в память некоторые данные, объявить этот блок как код и передать туда указатель на выполнение.

Другое дело, что обычно такие фокусы редко когда нужны. Данная проблема имеет другое, более простое решение. точнее два.
Первое - использовать dll. Правда тут ты ограничен тем набором, котрый у тебя реализован в dll.
второй - использовать встраиваемый интерпретатор (да того же паскаля или JSript). в этом случае тебе просто надо где-то хранить код соотв функций в вызывать его через этот интерпретатор.
Ответить с цитированием
  #7  
Старый 02.11.2010, 21:56
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

не, мне необходимо именно менять код функции на ходу. Впринципе, если есть некие директивы, которые заставят делфу писать не относительные вызовы, а нормальные, то я могу копировать код функции в отдельное место, полученное через GetMem, туда копировать функцию, и работать уже с ней.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 02.11.2010, 22:33
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Кхе-кхе написал эту заветную процедуру на встроенном ассемблере - заработало. Я копирую её в новое место, там изменяю и запускаю оттуда.
Эх.. ну что ж, ручками - так ручками... Мне не привыкать
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter