Шаг 86.
Использование ассемблерного модуля с транслятором Borland C++ 5.02

    На этом шаге мы рассмотрим использование ассемблерного модуля с транслятором Borland C++ 5.02.

    Начиная с этого шага рассматривается простой модуль на языке ассемблера, содержащий процедуру, копирующую одну строку в другую. Мы подсоединяем этот модуль к программам, написанным на языке Си и Паскаль, с использованием трех трансляторов: Borland C++ 5.02, Visual C++ 6.0, Delphi 6.0.

Borland 5.02

    Функцию, вызываемую из модуля, написанного на языке ассемблера, мы объявляем при помощи модификаторов 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
Тексты этих файлов можно взять здесь.

    Трансляцию программы можно осуществить одним из перечисленных способов:

    На следующем шаге мы рассмотрим использование ассемблерного модуля с транслятором Visual C++ 6.0.




Предыдущий шаг Содержание Следующий шаг