Asm and Delphi

Тема в разделе "WASM.BEGINNERS", создана пользователем ne0n, 21 ноя 2005.

  1. ne0n

    ne0n New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2005
    Сообщения:
    3
    Адрес:
    Россия
    Ребята,дело такое!!!

    Сам я кодю на Делфях, и вот в один прекрасный момент пришла

    идея(не мне а преподу) написать свой собственный протектор( должен проверяет crc файла в который внедрен).Вобще этот протектор должен быть моей научной работой в области системной безопасности. Нарыл unit для внедрения кода влюбой

    ехе'шник, все бы хорошо но код должен быть написан

    на Asm'e. тут то я и попал. Ладно синтаксис был бы как

    в какомнибудь известном asm компиляторе, проблема бы решилась методом Copy-Paste, но у делфи свой еврейский синтаксис. Может кто знаком с ее синтаксисом???

    И поможет мне в решении проблемы???
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    См. в хелпе Object Pascal Reference \ Inline Assembler Code. А вообще-то синтаксис вроде TASM, с некоторыми ограничениями и прибамбасами
     
  3. ne0n

    ne0n New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2005
    Сообщения:
    3
    Адрес:
    Россия
    А по русски нет ничего подобного, а то работу в пятницу-воскресенье здавать(время на перевод нету)
     
  4. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    нету такой компоненты

    убейсибяапстену
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    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
     
  6. ne0n

    ne0n New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2005
    Сообщения:
    3
    Адрес:
    Россия
    Спасибо за ценную игформацию!!!
     
  7. Styx_ROCK

    Styx_ROCK New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2005
    Сообщения:
    17
    Адрес:
    Barbados
    ne0n

    при экспорте из obj файла могут возникнуть проблемы (если это не TASM) т.к. у дельфы obj omf, а не obj coff и тебе понадобится тулза для конверта: COFF2OMF.exe вроде есть в дистрибе С Builder-a или так где скачай.