Ассемблер для Windows

) Borland C++



1) Borland C++ 5.0

Функцию, вызываемую из модуля, написанного на языке ассемблера, мы объявляем при помощи модификаторов extern "С" и stdcall. Поскольку модуль на языке ассемблера транслируется с помощью транслятора TASM, проблемы с подчеркиванием не возникает. Тип вызова stdcall предполагает, что стек освобождается в вызываемой процедуре. В ассемблерном модуле вызываемая процедура должна быть дополнительно объявлена при помощи директивы PUBLIC.

// файл copyc.cpp #include <windows.h> #include <stdio.h> extern "C" _stdcall COPYSTR(char *, char *); void main() { char s1[100]; char *s2="Privet!"; printf("%s\n",(char *)COPYSTR(s1, s2)); ExitProcess(0); }

; файл copy.asm .386P ; эта процедура будет вызываться из внешнего модуля PUBLIC COPYSTR ; плоская модель .MODEL FLAT, stdcall _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' ; процедура копирования одной строки в другую ; строка, куда копировать [EBP+08Н] ; строка, что копировать [EBP+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



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