На этом шаге мы рассмотрим использование ассемблерного модуля с транслятором Borland C++ 5.02.
Начиная с этого шага рассматривается простой модуль на языке ассемблера, содержащий процедуру, копирующую одну строку в другую. Мы подсоединяем этот модуль к программам, написанным на языке Си и Паскаль, с использованием трех трансляторов: Borland C++ 5.02, Visual C++ 6.0, Delphi 6.0.
Функцию, вызываемую из модуля, написанного на языке ассемблера, мы объявляем при помощи модификаторов extern "С" и stdcall. Поскольку модуль на языке ассемблера транслируется с помощью транслятора TASM, проблемы с подчеркиванием не возникает. Тип вызова stdcall предполагает, что стек освобождается в вызываемой процедуре. В ассемблерном модуле вызываемая процедура должна быть дополнительно объявлена при помощи директивы PUBLIC.
Текст исходного CPP-файла:
#include <windows.h> #include <stdio.h> extern "C" __stdcall COPYSTR(char*,char*); void main() { char s1[100]; char *s2="Privet!"; COPYSTR(s1,s2); printf("%s\n", s1); ExitProcess(0); }
Ассемблерный модуль:
.386P ;Эта процедура будет вызываться из внешнего модуля. PUBLIC COPYSTR ;Плоская модель. .MODEL FLAT, stdcall _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' ;Процедура копирования одной строки в другую. ;Строка, куда копировать - [ЕВР+08Н]. ;Строка, что копировать - [ЕВР+0CН]. ;Не учитывает длину строки, куда производится копирование. COPYSTR PROC PUSH EBP MOV EBP,ESP MOV ESI,DWORD PTR [EBP+0CH] MOV EDI,DWORD PTR [EBP+08H] L1: MOV AL,BYTE PTR [ESI] MOV BYTE PTR [EDI],AL CMP AL,0 JE L2 INC ESI INC EDI JMP L1 L2: MOV EAX,DWORD PTR [EBP+08H] POP EBP RET 8 COPYSTR ENDP _TEXT ENDS END
Трансляцию программы можно осуществить одним из перечисленных способов:
TASM32 /ml pr86_2.asm
На следующем шаге мы рассмотрим использование ассемблерного модуля с транслятором Visual C++ 6.0.