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

 WASM Phorum —› WASM.ASSEMBLER —› JIT в FASM

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


Дата: Апр 28, 2004 09:59:56

Не подскажете, как сделать следующее наиболее цивилизованным образом.
Есть программа на асм, включающая FASM. Ей дается кусок кода на ассемблере. Надо этот кусок скомпилировать и запустить, не записывая на диск.


Дата: Апр 28, 2004 10:17:31 · Поправил: johnfound

В DOS возможно, а в Windows нет, AFAIK. Если говорим "запустить самостоятельно". А как часть етого процесса, надо только сделать память где код записан "executable".


Дата: Апр 28, 2004 10:45:22

Не совсем понял, что именно можно, а что нельзя сделать под виндой?

Вообще мне это нужно для прототипа интерпретатора, который критичные места компилит в ассемблер.


Дата: Апр 28, 2004 11:04:43

Теоретически, если скоипиленый код запихать в память и из своей проги прыгнуть на начало кода в памяти, может получиться. Только область памяти, где лежит прога сделать executable (флаги выставить). Но для этого придется самому компилировать (всмысле твоя программа должна уметь компилить асм-код), так как все известные мне компиляторы не спрашивают куда компилить и сразу пишут на диск.


Дата: Апр 28, 2004 11:33:07

Но для этого придется самому компилировать
Ну, есть же исходники FASM:) Можно в нем в районе formatter покопаться.

Но меня интересует еще как это сделать цивилизовано, без особых хаков. Например, можно ли код, скомпилированный как DLL подключить, не записывая в файл а только имея его в памяти?


Дата: Апр 28, 2004 12:02:32

> не записывая в файл а только имея его в памяти

Если я правильно понимаю идеологию виндос нт - нельзя.
См., например, CreateFileMapping с INVALID_HANDLE_VALUE


Дата: Апр 28, 2004 12:20:43

> можно ли код, скомпилированный как DLL подключить, не записывая в файл а только имея его в памяти?

Можно.


Дата: Апр 28, 2004 13:19:38

Dr.Golova
Человек просит без особых хаков


mihoshi
А нельзя просто зарезервировать место в вашем PE и туда компилить код?


Дата: Апр 28, 2004 14:00:06

S_T_A_S_
А нельзя просто зарезервировать место в вашем PE и туда компилить код?

Вообще задача такая. Надо сделать интерпретатор (вроде
joy), который при выполнении определяет критические участки и пытается их компилировать в код. Переписывать файл при каждом таком изменении как-то невесело.

P.S. А здесь разве на "вы"?


Дата: Апр 28, 2004 14:23:01

Dr.Golova
А как это можно сделать, даже есди с хаками? Если уж NT то, что не взято из файла, за приличный код не считает...


Дата: Апр 28, 2004 14:49:54 · Поправил: S_T_A_S_

mihoshi

Про joy я не знаю :(

Идея такая (упрощенно):
;;==================================================================== =======

EXE_IMAGE_BASE	EQU 400000h
format	PE GUI	4.0 at EXE_IMAGE_BASE

section	'Tai Chi'code executable data readable writeable
entry

;;  здесь собственно сам интерпретатор, данные и т.п.


data	import
.....
;;  импорт
.....
end data

RESERVED_FOR_JIT_COMPILED_CODE:
rb	2000h	;;  суда компилируем в процессе работы
;;===========================================================================

imho это самый простой способ. Последние 8Кб все равно в готовый экзешник не пойдут.
А при его загрузке виндос место выделит, осталось тока туда записать нужный код и вызывать его.

Если я, конечно, правильно все понял :)


Дата: Май 2, 2004 12:51:54

Спасибо.
А VirtualAlloc с флагом EXECUTABLE не катит?


Дата: Май 4, 2004 02:28:46 · Поправил: S_T_A_S_

Дык в чем проблема с этим-то? Так сразу все и писАли.
Тока это будет уже JIT в win32 :). Тут уже не важно чем компилировать.

А если именно в FASM - тогда можно зарезервировать пустую секцию в PE файле и туда код компилировать - пускай выделением памяти виндосный загрузчик занимается.

ЗЫ
(я чего-то сдуру подумал, что для скомпилированного кода надо впринципе исключить запись на диск, даже в pagefile)

ЗЫЫ
imho, Dr.Golova имел ввиду это.


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