v 1.0 19 Apr-2007
v 1.4 23-Apr-2007
English |
Russian |
This convertor program is created to translate asm files generated by MS VC++ (in result of compiling C sources) to Pascal units which can be compiled than with Delphi or other Pascal compiler. | Этот конвертер создан для трансляции ассемблерных файлов, сгенерированных MS VC++ (в результате компиляции исходного кода на языке C) в модули на языке Паскаль (.pas), которые могут быть затем скомпилированы компилятором Delphi или другим компилятором языка Паскаль. |
Important | Важно |
If you do not understand (and do not want understand) assembler or C language: do not use this utility. Knowledge of the Pascal only is not enough to be able to use it. | Если вы не понимаете (и не хотите научиться понимать) ассемблер и язык Си: не используйте данную утилиту. Знания одного только Паскаля недостаточно для использования данной утилиты. |
Intro | Введение |
The main reason to use this utility: necessary algorithm can be implemented only with a lot of code (and only C code are available) and translating it to Pascal manually either impossible or hard to do (and resulting code will contain a lot of new bugs appeared in result of mistype, bad understanding of the algorithm details, not complete understanding of C dialect used or other reasons). And as I know there are not yet exist automatic tool to translate C to Pascal completely and without other big manual changes used in your Pascal application. | Основная причина использовать эту утилиту: необходимый алгоритм может быть реализован только с большим количеством кода (и доступен только на языке C) и трансляция его на Паскаль вручную либо невозможна, либо сложна для реализации (и результирующий код будет содержать множество ошибок, появившихся в результате опечаток, плохого понимания деталей алгоритма, неуверенного знания диалекта C и т.п.). И, насколько я знаю, до сих пор не существует инструмента для полностью автоматической трансляции из Си в Паскаль, избавляющего от необходимости значительных ручных исправлений в результирующем коде, чтобы полученные модули могли начинать использоваться в вашем приложении на языке Паскаль. |
Note: still by some unknown reason Borland (when it was not Inprise Inc yet) cancelled COFF obj files support, it is not possible to create obj files (with C compiler) and link it to your Delphi application. So, converting C sources or asm sources generated by C compiler to BASM is the only way to use C coded algorithms in your application if you do not want to use external DLL's. | Примечание: так как по неизвестной причине фирма Борланд (еще когда она даже не была еще Inprise Inc.) прекратила поддержку объектных файлов формата COFF, мы не можем создать obj-файлы (компилятором C) и прилинковать их к нашему приложению на Delphi. Так что, конвертация исходных кодов на языке C или исходных кодов на ассемблере, сгенерированных компилятором Си, в BASM (встроенный ассембер Borland) - это практически единственный путь использования алгоритмов, реализованных на C, в вашем приложении - если вы не хотите для этого подключать внешние DLL. |
Usage |
Использование |
Pass as a command line parameter source (asm) file name or a directory containing such asm-files. In the second case all the units in the directory are checked for links to each others and in the implementation section, uses list is added when necessary, where necessary references are added. | Вызовите конвертер, передав в командной строке исходный (asm) файл или директорию, содержащую такие asm-файлы. Во втором случае все модули в директории проверяются на предмет взаимных ссылок, и при необходимости в список uses секции implementation результирующих файлов добавляются необходимые взаимные ссылки. |
Input(s) and output(s) | Вход(ы) и выход(ы) |
In result of working of the converter, for each input
file an output .pas file is created in the same directory. And for each
pas file a special include file <name>_add2uses.inc file is created
empty also (but only when
such file not yet exists). To use such files, add a conditional
symbol definition to your project: ADDITIONAL_USES. Then, if you want
add some additional references to the uses list in the implementation
part (but without changes in the unit) just modify such inc-file (e.g.
adding there "my_additional_unit, " - w/o quotation marks). Also, it is possible to get in result of working lists of exported, inported and not resilved names for each input assembler unit, but the converter itself should be rebuilt with a conditional symbol SAVE_LISTS turned on. |
В результате работы конвертера,
для каждого входного asm-файла
создается выходной pas-файл в той же
директории. И для каждого pas-файла так же
создается (если еще не создан) пустой файл с именем <имя_модуля>_add2uses.inc.
Для использования таких файлов, добавьте символ условной
компиляции в свое приложение ADDITIONAL_USES.
Затем, если вам понадобилось добавить ссылки на дополнительные модули из
данного модуля, это можно сделать, модифицируя не сам модуль, а поправив
соответствующий inc-файл (например,
"unit1, " - без кавычек). Так же, возможно получение списков экспортируемых, импортируемых и не разрешенных имен для каждого входного ассемблерного модуля, но сам конвертер должен быть перекомпилирован с включенны символом условной компиляции SAVE_LISTS. |
Resolving external names | Разрешение внешних ссылок |
Almost any C program if it really do
something useful calls functions from C standard library or from other
places. If you found that resulting code can not be successfully
compiled still Pascal compiler can not find a declaration of some
identifier, you should provide it by yourself. Either find its sources
and convert it manually to Pascal or use this utility again after
generating asm code from C with C compiler. At least if it is possible
to run the sources in the debugger you can find and necessary peace of
code disassembled and grab it to your Pascal unit (but be careful with
copy rights: some stuff become no legal been obtained in result of
reverse engeneering). To check only syntax without resolving links, add a conditional symbol TESTING to your application: in such case all unresolved names are declared as local procedures in the unit. This allows to check if the code will be compilable at all, before you start resolving additional external symbols. |
Почти каждая программа на C,
если она делает что-либо полезное, вызывает функции из стандартной
библиотеки C и из других мест. Если вы
обнаружили, что результирующий код не может быть успешно скомпилирован
по той причине, что имеется некоторое количество необъявленных
идентификаторов, вы должны обеспечить их сами. Либо найдите их исходный
код и переведите на Паскаль, или снова используйте этот конвертер для
получения Паскаль-кода с асм-вставками после генерации асм-кода
компилятором Си. В крайнем случае, если исходная программа может быть
запущена под отладчиком, то не составит особого труда найти интересующий
кусок кода, сграбить его из окна дизассемблера и вставить в свой модуль
на Паскале в виде асм-вставки (но будьте внимательны с авторскими
правами и патентами: многие авторы категорически возражают против того,
чтобы их код восстанавливался из откомпилированного кода путем
дизассемблирования). Для проверки только синтаксиса сгенерированных модулей, добавьте в опции проекта символ условной компиляции TESTING: в этом случае все неразрешенные внешние ссылки забиваются локальными процедурами-заглушками. Это позволяет проверить компилируемость кода до того, как вы приступите к поиску недостающих деклараций. |
Advice | Совет |
To generate asm code with C compiler
from C sources, use "Release" version of code: it is more optimized in
size and speed, easier to maintain and sometimes contain less external
references that "Debug" version (Debug version
can include additional printf statements enclosed into brackets #ifdef
DEBUG ... #endif). Also, use option "Asm code with sources" to get it more understandable (in resulting Pascal units C sources are commented but can help to understand which asm code is corresponding to which C source code). |
Для генерации асм-кода из Си с помощью компилятора Си,
используйте версию "Release" (финальную): она
более оптимальна по размеру и быстродействию, с ней легче
работать и ингода она содержит меньше внешних
ссылок, чем версия "Debug" (отладочная
версия может содержать дополнительные операторы для вывода всевозможных
сообщений, заключенные в скобки #ifdef DEBUG ...
#endif).
Так же, рекомендую использовать для генерации асм-кода опцию "Asm code with sources" (Асм-код + исходный C-код). В любом случае исходный код в выходном модуле комментируется, но помогает лучше ориентироваться в том, какой асм-код соответствует каким строкам исходного кода на Си. |
Experience | Опыт |
The utility was tested on a certain
source code, written initially on "clear" C (w/o C++), but with some
classes from C++. Special translation is provided for long names like
??_Abc@Def$_Q234?? Note that Pascal in differ to C is not case
sensitive. Fortunately in my case there were no collisions with such
names (Abc vs aBC). At this stage all steps necessary to link and use C code finished and it is working OK. |
Утилита проверялась на конкретных исходных кодах,
написанных изначально на "чистом" C, с
небольшим числом классов из C++. Специальная
конверсия обеспечивается для длинных имен вроде
??_Abc@Def$_Q234?? , чтобы Паскаль-компилятор не ругался на такие
имена. Заметьте, что Паскаль, в отличие от С,
не чувствителен к регистру имен. Мне повезло, и в моем случае коллизий
между именами, отличающимися только регистром
букв, не наблюдалось. На данном этапе, все шаги по подключению требуемого кода выполнены, и достигнута его работоспособность. |
Calling functions | Вызов функций |
In the current version, all the public entries are
declared as procedures without params, since this is only way to stop
Delphi from providing ambigous enter and leave code. For public
functions, parallel ones (with prefix "j_") are defined as cdecl functions with all parameters declared as Integer
and returning Integer result. This is enough to start calling it
directly from the Pascal code in most cases, but if you do not want
modify generated units, take in attention real parameter types and apply
necessary typecasting. E.g. if you know that a parameter is pointer,
pass a pointer but typecast it to Integer type (fortunately, for the
Pascal this is not a problem). In case of incompatible parameter types or if "stdcall" agreement is used, you should therefore correct such functions declarations in generated units before using it. |
В нынешней версии, все точки входа
объявлены как процедуры без параметров, т.к. это
единственный способ предостеречь Delphi от
создания лишнего кода эпилога / пролога процедуры. Для внешних функций,
создаются так же зеркальные целочисленные функции со всеми параметрами, объявленными
как целые (тип Integer), и с атрибутом соглашения
о передаче параметров cdecl. Этого достаточно
во многих случаях, чтобы начать вызывать эти функции напрямую из вашего
Паскаль-кода, но учтите, что если тип параметра в действительности не
целочисленный, то следует при оформлении передаваемого параметры
выполнить для него приведение типа к Integer (что
для Паскаля, к счастью, не проблема - он спокойно позволяет привести к
целому32-битному и указатель). В случае совершенно других типов данных или используемого соглашения о передаче параметров cdecl вам, наверное, потребуется все-таки исправить декларацию сгенерированных функций, исправив полученные модули перед их использованием. |
Modifications | Модификации |
If you have found that some modifications in code must be done for your case, do it: all sources are provided and these are not too hard to understand how it works. And if it works as you wish for you after making changes you can suggest such modifications for me to include it in the next release of the utility. | Если вы обнаружили, что требуются какие-либо исправления или дополнения в коде конвертера, делайте их: все исходные коды предоставлены и они не слишком сложны для понимания того, как и что работает (ди возможно ли написать слишком сложный код за пару дней). И если после того, как вы внесли изменения, ничего не сломалось, и ваши изменения помогли вам решить вашу проблему, вы можете предложить внести ваши изменения для включения их в код конвертера в следующей версии. |
Contacts | Контакты |
malto: vk<at>kolmck.net home: http://kolmck.net |
malto: vk<at>kolmck.net Web-страница: http://kolmck.net |