Turbo Assembler 3.0. Руководство пользователя


Компоновка ассемблерных модулей с С++


Важной концепцией С++ является безопасная с точки зрения стыковки типов компоновка. Компилятор и компоновщик должны рабо- тать согласованно, чтобы гарантировать правильность типов переда- ваемых между функциями аргументов. Процесс, называемый "корректи- ровкой имен" (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

; 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 @testSqfd endp



Содержание раздела