Witam.
Właśnie rozpocząłem swoją przygodę z asemblerem. Piszę program C++, który skopiuje zawartość z jednej tablicy dynamicznej do drugiej. Funkcja kopiująca jest importowana z biblioteki DLL napisanej w asemblerze.
Kod C++:
#include <windows.h>
#include <stdio.h>
using namespace std;
typedef int(*importFunction)(char*, char*, int);
int main(int argc, char * argv[])
{
importFunction copy; //funkcja importowana
HINSTANCE hLib; //uchwyt biblioteki
int length_of_text; //długość tekstu
char *text = NULL; //wskaźnik na tablicę tekstu
char *copiedText = NULL; //wskaźnik na tablicę skopiowanego tekstu
//alokacja pamięci na tablice, wypełnienie tablicy text
hLib = LoadLibrary(TEXT("ASM.dll")); //przypisanie uchwytu
copy = (importFunction)GetProcAddress(hLib, "copy"); //przypisanie importowanej funkcji
copy(text, copiedText, length_of_text); //wywołanie zaimportowanej funkcji
//wyświetlanie tablicy
FreeLibrary(hLib);
return 0;
}
biblioteka DLL asemblera:
.386
.MODEL FLAT, C
OPTION CASEMAP:NONE
INCLUDE \masm32\include\windows.inc
.CODE
DllEntry PROC hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax, TRUE
ret
DllEntry ENDP
copy proc text: DWORD, copiedText: DWORD, length_of_text: DWORD
MOV esi, text ;adres pierwszej tablicy do ESI
MOV edi, copiedText ;adres drugiej tablicy do EDI
MOV ecx, length_of_text ;ilość bajtów do skopiowania
CLD ;kierunek kopiowania
REP MOVSB ;kopiowanie
ret
copy endp
END DllEntry
Po zakończeniu wykonywania funkcji copy VS2012 wyrzuca błąd: Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
Czego brakuje w moim kodzie?