Вызов из Borland C++ функций Турбо Ассемблера
Обычно C++ и Ассемблер совместно используют путем написания отдельных модулей целиком на C++ или Ассемблере, компиляции модулей С++ и ассемблирования модулей Ассемблера с последующей совместно компоновкой этих раздельно написанных модулей. Это показано на Рисунке.
Выполняемый файл получается из "смеси" модулей С++ и Ассемблера. Этот цикл можно запустить командой:
bcc имя_файла_1.cpp имя_файла_2.asm
которая указывает Borland C++, что нужно сначала компилировать файл имя_файла_1.СPP в файл имя_файла_1.OBJ, а затем вызвать Турбо Ассемблер для ассемблирования файла имя_файла_2.asm в имя_файла_2.obj, и, наконец, вызвать компоновщик TLINK для компоновки файла имя_файл_1.OBJ и имя_файл_2.OBJ в файл имя_файла.EXE.
Раздельную компиляцию полезно использовать для программ с большим объемом кода на Ассемблере, так как это позволяет использовать все возможности Турбо Ассемблера и программировать на языке Ассемблера в чисто ассемблерном окружении без ключевых слов asm, дополнительного времени на компиляцию и связанными с С++ непроизводительными затратами при работе со встроенным Ассемблером.
За раздельную компиляцию приходится платить следующую цену: программист, работающий с Ассемблером, должен вникать во все детали организации интерфейса между С++ и кодом Ассемблера. В то время как при использовании встроенного Ассемблера Borland C++ сам выполняет спецификацию сегментов, передачу параметров, ссылку на переменные С++ и т.д., отдельно компилируемые функции Ассемблера должны все это (и даже более) делать самостоятельно.
В интерфейсе Турбо Ассемблера и Borland C++ есть два основных аспекта. Во-первых, различные части кода С++ и Ассемблера должны правильно компоноваться, а функции и переменные в каждой части кода должны быть доступны (если это необходимо) в остальной части кода. Во-вторых, код Ассемблера должен правильно работать с вызовами функций, соответствующих соглашениям языка С++, что включает в себя доступ к передаваемым параметрам, возврат значений и соблюдение правил сохранения регистров, которых требуется придерживаться в функциях С++.
Давайте теперь приступим к изучению правил компоновки программ Турбо Ассемблера и Borland C++.
Основные моменты в интерфейсе Турбо Ассемблера и Borland C++
Чтобы скомпоновать вместе модули Borland C++ и Турбо Ассемблера, должны быть соблюдены следующие три пункта:
В модулях Турбо Ассемблера должны использоваться соглашения об именах, принятые в Borland C++.
Borland C++ и Турбо Ассемблер должны совместно использовать соответствующие функции и имена переменных в форме, приемлемой для Borland C++.
Для комбинирования модулей в выполняемую программу нужно использовать утилиту-компоновщик TLINK.
Здесь ничего не говориться о том, что в действительности делают модули Турбо Ассемблера. Пока мы коснемся только основных моментов, обеспечивающих разработку функций Турбо Ассемблера, совместимых с С++.
1 2 3 4 5 6 7 8 9
8 8 8
| |