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

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

    Текст на языке C++ не изменится, а вот ассемблерный текст придется изменить. Дело здесь в том, что транслятор С автоматически добавит в конец вызываемой функции @8. В этом случае пришлось отказаться от нашей обычной детализации программы и положиться на транслятор MASM. Для этого потребовалось явно указать параметры при объявлении процедуры. Как только это было сделано, транслятор взял часть работы (а именно, передачу параметров) на себя и, кроме того, к имени COPYSTR он, естественно, добавил @8. Лишний раз подчеркнем, что при таком объявлении не нужно явно устанавливать регистр ЕВР и освобождать стек - за нас все делает транслятор.

    При создании нового проекта в Visual C++ выберите Win32 Console Application:


Рис.1. Создание нового проекта

    После этого добавьте в пустой проект новый файл и разместите там следующий код:

#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 str1:DWORD, str2:DWORD
      MOV  ESI,str2 ;DWORD PTR [EBP+0CH]
      MOV  EDI,str1 ;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]
      RET  
COPYSTR ENDP 
_TEXT ENDS 
      END
Текст этого файла можно взять здесь.

    Откомпилируйте его, используя MASM32:

    ml /c /coff /DASM pr87_2.asm

    Отметим, что явное указание параметров в заголовке процедуры приводит:

    Добавим созданный OBJ-файл в проект, вызвав контекстно-зависимое меню как показано на рисунке 2:


Рис.2. Добавление объектного файла к проекту

    Результат выполнения приложения показан на рисунке 3:


Рис.3. Результат выполнения приложения

Текст приложения можно взять здесь.

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




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