На этом шаге мы рассмотрим использование ассемблерного модуля с 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.