Casm2Basm (C) by Vladimir Kladov, 2007

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