Ребята,дело такое!!! Сам я кодю на Делфях, и вот в один прекрасный момент пришла идея(не мне а преподу) написать свой собственный протектор( должен проверяет crc файла в который внедрен).Вобще этот протектор должен быть моей научной работой в области системной безопасности. Нарыл unit для внедрения кода влюбой ехе'шник, все бы хорошо но код должен быть написан на Asm'e. тут то я и попал. Ладно синтаксис был бы как в какомнибудь известном asm компиляторе, проблема бы решилась методом Copy-Paste, но у делфи свой еврейский синтаксис. Может кто знаком с ее синтаксисом??? И поможет мне в решении проблемы???
См. в хелпе Object Pascal Reference \ Inline Assembler Code. А вообще-то синтаксис вроде TASM, с некоторыми ограничениями и прибамбасами
ne0n По русски нет, да и незачем - все довольно просто 1) Основное отличие - внутри блока asm..end не допускается объявление обычных именованных переменных и меток, за исключением меток с именами, начинающимися на "@". Например, если в MASM\TASM можно объявить в коде константу X dd 0 и грузить ее в регистр как mov eax,X то в дельфях это не прокатывает и нужно использовать одно из двух: а) либо убрать объявление X dd 0, а в начале функции (до "asm") объявить const X:dword = 0; б) либо заменить имя X на метку @X: dd 0 и грузить ее как mov eax,dword[@X] Тоже самое с метками - нужно либо объявить все используемые метки вначале функции (label ...), либо заменить имена меток, чтобы они начинались с символа @. Также не поддерживаются анонимные метки @@: + jcc @B или jcc @F и фасмовские локальные метки, начинающиеся с точки. Еще одно ограничение - все метки в дельфях являются локальными, поэтому перепрыгнуть из одной функции внутрь другой не получится (только на начало). 2) Передача параметров функций. Во-первых, по умолчанию используется вызов register и три первых параметра размером не более dword передаются через регистры eax,edx,ecx. Это нужно иметь ввиду, чтобы ненароком их не затереть, например function foo(X,Y:integer):integer; mov eax,Y - затирает параметр X, т.к. здесь X==eax, Y==edx. С вызовами pascal или stdcall конечно таких проблем нет, поэтому для asm-функций лучше всегда явно указывать тип вызова, чтобы знать что к чему независимо от настроек по умолчанию. Ну ес-но var и const параметры рассматриваются как указатели на переменные: procedure foo(var X:integer); mov ecx,X - грузит указатель на X при любом типе вызова, а вот mov ecx,[X] при register грузит значение переменной X (==mov ecx,[eax]), но для pascal\stdcall по прежнему грузится указатель, т.к. одна операция mov не может сделать две загрузки из памяти и mov eax,X == mov eax,[X] == mov eax,[ebp+8]. Комбинация mov ecx,X + mov ecx,[ecx] ес-но работает при любом вызове. 3) Прологи\эпилоги не генерятся только при условии: тип вызова register, число параметров <= 3 и все они передаются через регистры, нет объявления локальных переменных. В остальных случаях компилятор всегда вставляет пролог push ebp + mov ebp,esp + при объявлении локальных add esp,-(размер_локальных) и соответсвующий эпилог. Ес-но при наличии пролога\эпилога нужно аккуратно обращться с ebp и ret PS: Если у тебя есть готовый код на асме, то возможно проще его скомпилить на том же асме в obj и инклюдить к дельфям - останется только обявить external функции из готового obj
ne0n при экспорте из obj файла могут возникнуть проблемы (если это не TASM) т.к. у дельфы obj omf, а не obj coff и тебе понадобится тулза для конверта: COFF2OMF.exe вроде есть в дистрибе С Builder-a или так где скачай.