Run-Time Check Failure #0 biblioteki DLL w asemblerze

0

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?

1

ABI Windowsa wymaga abyś zapamiętał i, po wykonaniu funkcji, przywrócił wartości części rejestrów, w tym esp, tak jak masz napisane w komunikacie błędu.

0

Problem rozwiązany. Przywracałem już wcześniej wartości rejestrów, ale jeden z nich przeoczyłem, dlatego problem pozostawał. Dzięki za pomoc ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1