Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

TPCAsm - ассемблирует на лету   Найти похожие ветки 

 
Владимир Кладов   (2004-11-15 16:47) [0]

поданный ему исходник на ассемблере PC (с макросами) в код в памяти, после чего его можно пробовать выполнять (пробовать, потому что сверку с ассемблером Delphi я сделал, но на практике опробовать еще не успел).
http://bonanzas.rinet.ru/PCAsm.zip (27K)

Так сказать побочный продукт моих трансляторских изысканий. Может еще кому сгодится.


 
Владимир Кладов   (2004-11-15 17:28) [1]

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


 
miek ©   (2004-11-16 18:17) [2]

Целый день пытался придумать, для чего бы применить PCAsm, и не преуспел:(  JIT-компилятор для AutoWars? Сверхбыстрое построение графиков заранее неизвестных функций? Буду думать дальше...


 
Владимир Кладов   (2004-11-16 20:20) [3]

мне нужно в эмуляторе спектрума для того чтобы слишком многовариантный код (более сотни сочетаний опций) мог работать быстро и не занимал много усилий. Например рендеринг графики для нескольких вариантов bpp помножить на несколько графических режимов исходной машины помножить на несколько способов эмуляции (от чего зависит формат графических данных) помножить на несколько вариантов дополнительных эффектов (сглаживание, добавление цветности)... Получается либо сотни вариантов, и для каждого код не выпишешь, либо многочисленные проверки условий во внутренних циклах, что не эффективно. А так я все условия оставляю в самых внутренних циклах, но в виде условной компиляции, и для текущего сочетания режимов компилируется свой уникальный быстро работающий код. И не надо дублировать многократно один и тот же код, легче сопровождать. Автоматически появляется возможность поддержать такие сочетания режимов, до которых просто не доходили руки. Аналогично, код самого эмулятора. Там тоже уже штук 5 вариантов кода, и если учесть, что внутри делаются опять многочисленные проверки, то реально вариантов намного больше. То же самое - условная компиляция, и все варианты сводятся в один, и компилируются по мере надобности для каждого уникального сочетания кондиций. Особого эффекта в быстродействии может и не быть, но сопровождение облегчается гарантированно. Опять же, макросы. В ассемблере Delphi нет макросов (или я плохо искал?) и нет возможности включить объектник сделанный нормальным внешним ассемблером с макросами (masm32), совместим получается только глючный tasm от самого борланда.

Да, и код программы тоже несколько уменьшиться должен.

Очевидно, для быстрого вычисления формул - в том числе для построения графиков - тоже сгодится (остается только научить парсер генерировать код сразу на ассемблере, что для такой узкой задачи не очень даже сложно, FPU сам представляет собой готовую стековую машину). В принципе, могло бы сгодиться и для моего собственного компилятора - в будущем. Сделать сразу чтобы PE-экзешник создавался из П2-программы, и тогда не нужен внешний ассемблер и линкер.


 
Destructor   (2004-11-17 12:12) [4]

А зачем нужен эмулятор спектрума?


 
Владимир Кладов   (2004-11-17 13:18) [5]

есть такое слово - хобби. А вообще, мне очень нравится система команд Zylog. Гораздо больше, чем IBM. Хотя тоже самое: груз совместимости, надуманность некоторая. Хорошая база для размышлений по моей любимой теме. Уменьшение кода - это тоже мое хобби. Я уверен, что разрастание кода приводит в конце концов в тупик, системы становятся все сложнее для разработки и поддержки и неуправляемее. Если система той же мощности в N раз меньше по объему кода, управляемость ее повышается в e**N раз.


 
Gandalf ©   (2004-11-17 18:29) [6]

Полезная штука, мне нужно, ща потестим - как затестю раскажу :)


 
Владимир Кладов   (2004-11-17 18:50) [7]

Тестить еще можно погодить. Пара видов адресаций неверна. Доделаю надеюсь сегодня оптимизацию jump-ов тогда выложу исправленный вариант. А так Windasm говорит что код вполне похож - на реальных кусках кода.


 
lse   (2004-11-17 19:50) [8]

инсталлер от nullsoft - nsis тоже использует компиляцию скрипта в асм.
В форуме когда-то предлагали сделать свой инсталлер, вот еще один шаг сделан...


 
Владимир Кладов   (2004-11-17 21:21) [9]

выложил исправленную версию. С оптимизацией переходов - облом. При таком экономичном подходе как у меня сделано сейчас, без отдельного прохода препроцессора и разворачивания всего макро-кода, ничего не выйдет. А мне так развертывать ни к чему. В общем, для переходов вперед можно писать Jxx SHORT, это работает. Главное, чтобы команды все генерировались нормально. Сверка и тест на реальном коде показывает, что вроде все нормально. Тестировать можно.


 
Андрей ©   (2004-11-18 06:33) [10]

А как будет работать при запущеной DEP (Data Execution Prevention) на WinXP SP2? Там же вроде нельзя исполнять облась данных...


 
SPeller ©   (2004-11-18 07:21) [11]

ВРоду у Владимира SP2 и стоит, если я не ошибаюсь.


 
Владимир Кладов   (2004-11-18 16:12) [12]

Я же выделяю память для кода через VirtualAlloc с атрибутом PAGE_EXECUTE_READWRITE


 
Владимир Кладов   (2004-11-29 22:02) [13]

Оптимизировал PCAsm по скорости. Пришлось вообще отказаться от ANSI строк где только можно. И сделал аналог TStrListEx: TFastStrListEx. Пригоден для работы в условиях, когда есть только PChar и нет строк (с обычными ANSI строками в общем тоже можно но особых преимуществ тогда не будет). Есть одна существенная фича в TFastStrListEx, даже для тех, кого не интересует скорость: без проблем хранятся #0 внутри строк.

Да, финальная (надеюсь) версия PCAsm уже лежит (и работает в 10 раз быстрее, и FastStrList - тоже. См. на моем сайте в Дополнениях \ Утилитах.


 
dmd   (2004-12-28 12:06) [14]

А где можно посмотреть пример использования PCAsm? Или направте плиз, как скомпилировать строку мат.формул и многократно передавать в нее данные для вычисления.


 
Владимир Кладов   (2004-12-28 20:07) [15]

пожалуйста, вот вам пример:


var P: PPCAsm;
   x1, x2: integer;

new( P, Create );
P.Src := "multiplier equ 123"#13#10" cmp eax, 0"#13#10 +
" jle short @F1"#13#10" mov edx, multiplier"#13#10 +
" mul edx"#13#10"@@:"#13#10" ret";
P.CompileSrc;

x1 := P.Execute( -12 );
x2 := P.Execute( 1007 );

ShowMessage( int2str( x1 ) + " " + int2str( x2 ) );

P.Free;


Если знаете ассемблер, какие проблемы составить код для вычисления простого выражения? Задачка мне сложной не кажется.


 
Tommy_Russian   (2004-12-29 20:57) [16]

2 Destructor наши химмашевцы на Spectrum..... летают и излучают.
Хи-хи.



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.05 c
4-1118325354
Андрей Жук
2005-06-09 17:55
2005.08.07
Какой функцией можно получить параметры памяти процесса


1-1121327704
Apachi
2005-07-14 11:55
2005.08.07
Работа с большими целыми числами


14-1121761290
cyborg
2005-07-19 12:21
2005.08.07
Можно как нибудь найти или дать знать по Wi-Fi?


14-1121770959
BorisMor
2005-07-19 15:02
2005.08.07
Письмо 15000 (Не про Украинцев)


4-1117900157
NeoVariant
2005-06-04 19:49
2005.08.07
Свой текст в подсказке для TrayIcon состояние соединения