| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
Сначала мы рассмотрим использование встроенного в Borland
C++ Ассемблера. Далее мы подробно обсудим компоновку отдельно ас-
семблированных в Турбо Ассемблере модулей с Borland C++ и иссле-
дуем процесс вызова функций, написанных с помощью Турбо Ассембле-
ра, из программы, созданной в Borland C++. И наконец, мы рассмот-
рим вызов функций Borland C++ из программы на Турбо Ассемблере.
Вызов из Borland C++ функций Турбо Ассемблера
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Обычно C++ и Ассемблер совместно используют путем написания
отдельных модулей целиком на C++ или Ассемблере, компиляции моду-
лей С++ и ассемблирования модулей Ассемблера с последующей сов-
местно компоновкой этих раздельно написанных модулей. Это пока-
зано на Рис. 1.18.
Турбо Ассемблер 3.0/tasm/#2-2 = 75 =
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Исходный файл на языке С++ і і Исходный файл на Ассемблере і
і имя_файла.СPP і і имя_файла.ASM і
АДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДЩ АДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДЩ
і і
Компиляция Ассемблирование
ХНННННННННННННё ХННННННННННННННННННё
і Borland C++ і і Турбо Ассемблер і
ФНННННННННННННѕ ФННННННННННННННННННѕ
і і
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Объектный файл языка С++ і і Объектный файл языка С++ і
і имя_файла.OBJ і і имя_файла.OBJ і
АДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДЩ АДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДЩ
і і
і і
АДДДДДДДДДДДДДї ЪДДДДДДДДДДДДДЩ
і і
ХНННННННННННННё
і TLINK і Компоновка
ФНННННННННННННѕ
і
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Выполняемый файл і
і имя_файла.EXE і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 1.18 Цикл компиляции, ассемблирования и компоновки
Borland C++, Турбо Ассемблера и компоновщика TLINK
Выполняемый файл получается из "смеси" модулей С++ и Ассемб-
лера. Этот цикл можно запустить командой:
bcc имя_файла_1.cpp имя_файла_2.asm
которая указывает Borland C++, что нужно сначала компилировать
файл имя_файла_1.СPP в файл имя_файла_1.OBJ, а затем вызвать Тур-
бо Ассемблер для ассемблирования файла имя_файла_2.asm в имя_фай-
ла_2.obj, и, наконец, вызвать компоновщик TLINK для компоновки
файла имя_файл_1.OBJ и имя_файл_2.OBJ в файл имя_файла.EXE.
Раздельную компиляцию полезно использовать для программ с
большим объемом кода на Ассемблере, так как это позволяет исполь-
зовать все возможности Турбо Ассемблера и программировать на язы-
ке Ассемблера в чисто ассемблерном окружении без ключевых слов
asm, дополнительного времени на компиляцию и связанными с С++
непроизводительными затратами при работе со встроенным Ассембле-
ром.
Турбо Ассемблер 3.0/tasm/#2-2 = 76 =
За раздельную компиляцию приходится платить следующую цену:
программист, работающий с Ассемблером, должен вникать во все де-
тали организации интерфейса между С++ и кодом Ассемблера. В то
время как при использовании встроенного Ассемблера Borland C++
сам выполняет спецификацию сегментов, передачу параметров, ссылку
на переменные С++ и т.д., отдельно компилируемые функции Ассемб-
лера должны все это (и даже более) делать самостоятельно.
В интерфейсе Турбо Ассемблера и Borland C++ есть два основ-
ных аспекта. Во-первых, различные части кода С++ и Ассемблера
должны правильно компоноваться, а функции и переменные в каждой
части кода должны быть доступны (если это необходимо) в остальной
части кода. Во-вторых, код Ассемблера должен правильно работать с
вызовами функций, соответствующих соглашениям языка С++, что
включает в себя доступ к передаваемым параметрам, возврат значе-
ний и соблюдение правил сохранения регистров, которых требуется
придерживаться в функциях С++.
Давайте теперь приступим к изучению правил компоновки прог-
рамм Турбо Ассемблера и Borland C++.
Основные моменты в интерфейсе Турбо Ассемблера и Borland C++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Чтобы скомпоновать вместе модули Borland C++ и Турбо Ассемб-
лера, должны быть соблюдены следующие три пункта:
1. В модулях Турбо Ассемблера должны использоваться соглаше-
ния об именах, принятые в Borland C++.
2. Borland C++ и Турбо Ассемблер должны совместно использо-
вать соответствующие функции и имена переменных в форме,
приемлемой для Borland C++.
3. Для комбинирования модулей в выполняемую программу нужно
использовать утилиту-компоновщик TLINK.
Здесь ничего не говориться о том, что в действительности де-
лают модули Турбо Ассемблера. Пока мы коснемся только основных
моментов, обеспечивающих разработку функций Турбо Ассемблера,
совместимых с С++.
Турбо Ассемблер 3.0/tasm/#2-2 = 77 =
Компоновка ассемблерных модулей с С++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Важной концепцией С++ является безопасная с точки зрения
стыковки типов компоновка. Компилятор и компоновщик должны рабо-
тать согласованно, чтобы гарантировать правильность типов переда-
ваемых между функциями аргументов. Процесс, называемый "корректи-
ровкой имен" (name-mangling), обеспечивает необходимую информацию
о типах аргументов. "Корректировка имени" модифицирует имя функ-
ции таким образом, чтобы оно несло информацию о принимаемых функ-
цией аргументах.
Когда программа пишется целиком на С++, корректировка имен
происходит автоматически и прозрачно для программы. Однако, когда
вы пишете ассемблерный модуль для последующей его компоновки с
программой на С++, вы сами обязаны обеспечить корректировку имен
в модуле. Это легко сделать, написав пустую функцию на С+ и ском-
пилировав ее с ассемблерным модулем. Генерируемый при этом
Borland С++ файл .ASM будет содержать исправленные имена. Затем
вы можете их использовать при написании реального ассемблерного
модуля.
Например, следующий фрагмент кода определяет четыре различ-
ные версии функции с именем test:
void test()
{
}
void test( int )
{
}
void test( int, int )
{
}
void test( float, double )
{
}
Если этот код компилируется с параметром -S, то компилятор
создает на выходе файл на языке Ассемблера (.ASM). Вот как он
выглядит (несущественные детали убраны):
; void test()
@testSqv proc near
push bp
mov bp,sp
popo bp
ret
@testSqv endp
Турбо Ассемблер 3.0/tasm/#2-2 = 78 =
; void test( int )
@testSqi proc near
push bp
mov bp,sp
popo bp
ret
@testSqi endp
; void test( int, int )
@testSqii proc near
push bp
mov bp,sp
popo bp
ret
@testSqii endp
; void test( float, double )
@testSqfd proc near
push bp
mov bp,sp
popo bp
ret
|
adfun.ru
|
|
|
|