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

 WASM Phorum —› WASM.RESEARCH —› "патч самого себя" vs "конвеер"

<< . 1 . 2 .

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


Дата: Май 25, 2004 12:09:41

не только, в том числе и в приплюснутых компиляторах для вычислениях this'а в сложных случаях множественного наследования.
А можно объяснить чуточку по подробнее или дать ссылку где можно прочитать про это?


Дата: Май 25, 2004 14:52:39

есть хорошая книга "Дизайн и эволюция языка Си++" от Страустрапа, глава 12.4: множественное наследование - модель размещения объекта в памяти. у объекта может быть несколько таблиц виртуальных функций и при вызове f1() для объекта X нужно чтобы указатель this был направлен на подобъект x объекта X, тогда как при вызове f2() для объекта X нужно, чтобы this указывал на весь объект C.
для этого применяются различные техники: коррекция this через дельту указателей на X и x, самодифицирующийся код и шлюзование (think) - передача управления на код, корректирующий this.


Дата: Май 25, 2004 15:41:03

kaspersky
коррекция this через дельту указателей на X и x, самодифицирующийся код и шлюзование (think) - передача управления на код, корректирующий this

Хотелось бы увидеть пример такого самомодифицируещегося кода.


Дата: Май 25, 2004 15:46:44

за примером нужно обращаться к компилятору (только бы вспоминть какие компиляторы и при каких обстоятельствах генерируют самомодифицирующийся код)...


Дата: Май 25, 2004 17:41:12

для этого применяются различные техники: ...
Я видел "генерирование" кода на лету (в некотором буфере), но не его самомодификацию. Или это одно и тоже? Imho, нет, т.к. генерирование на лету не требует никаких издержек при выполнении (код сначала целиком генерируется, а потом целиком исполняется). А пример именно самомодификации хотелось бы увидеть...


Дата: Май 25, 2004 18:13:19

а че там смотреть...
есть у тебя например jmp relofs на процедуру, которая считает нечто через fpu инструкции.
а если проц поддерживает sse, ты впариваешь туда адрес процедуры, которая делает то-же самое, только через sse инструкции, предварительно установив атрибуты защиты страниц в секции кода.
вот и вся "самомодификация"

З.Ы. во всяких жутко оптимизированных мат. либах это нормальное явление


Дата: Май 25, 2004 18:24:44

> Я видел "генерирование" кода на лету (в некотором
> буфере), но не его самомодификацию.
> Или это одно и тоже? Imho, нет,
нет конечно, это разновидность шлюза (часто он генерируется динамически и забрасывается на стек, но это тоже издежки).
подлинно самомодифицирующийся код модифицирует именно машинный код. в живых программах мне такое попадалось лишь несколько раз, да и то под дос, но знающие люди мне говорили, что такой прием на самом деле не редкость. кто-то с ним сталикается чаще, кто-то реже, но он есть ;)


Дата: Май 25, 2004 18:30:48

kaspersky

- видишь волк?
- нет.
- но он есть ;)


Дата: Май 25, 2004 20:35:18

вообще-то в оригинале там про сурка было ;)


Дата: Май 26, 2004 05:29:52

> в живых программах мне такое попадалось лишь несколько раз, да и то под дос

Чем дальше смотреть в сторону прошлого - тем больше будет таких примеров imho.
На Z80 это было совершенно обычным делом. Ведь там не было кеша :)


Дата: Май 26, 2004 10:04:35

да, но на Z80 не было Си++ ;)
а мы про него говорим ;)


Дата: Май 27, 2004 09:57:54 · Поправил: S_T_A_S_

Причём здесь С++? Тем более без примеров.
Топик про самомодифицирующийся код.

Самый примитивный пример для зилога:
foo:	CALL  bar
.......

bar:	LD  HL, bar2
	LD  (foo+1), HL
.......
	RET

bar2:	LD  HL, bar
	LD  (foo+1), HL
.......
	RET
Конечный автомат, если я не ошибаюсь.
Кто так будет делать сейчас? И почему - не будет ??


ЗЫ
Суслик может и есть, но я его не вижу.


Дата: Май 27, 2004 12:02:33

> Конечный автомат, если я не ошибаюсь.
> Кто так будет делать сейчас? И почему - не будет ??
не будет потом, что модифицировать аргумент call [xxx] намного проще, тем более что это можно реализовать на ЯВУ без извратов

> Причём здесь С++? Тем более без примеров.
потому что разговор защел о Си++ и технике вызова виртуальных функций со сложным наследованием, чего на Z80 машнах никогда не было и уже не будет ;)


Дата: Май 28, 2004 05:51:33

> модифицировать аргумент call [xxx] намного проще

Какая разница какую ячейку менять? Мой пример - простая экономия памяти :).
Но так не будут делать т.к. это отрицательно скажется на производительности.

Пример Max с MMX / SSE - другое дело. Изменения происходят один раз во время инициализации программы.
Но во время выполнения нет постоянной модификации кода.


> разговор защел о Си++ и технике вызова виртуальных функций со сложным наследованием

Раз уж разговор зашёл, то хотелось бы увидеть реальный пример кода.
А то у меня с фантазией проблемы :(

<< . 1 . 2 .


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