Run-Time Check Failure #0 biblioteki DLL w asemblerze

Run-Time Check Failure #0 biblioteki DLL w asemblerze
AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
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++:

Kopiuj
#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:

Kopiuj
 
.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?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
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.

AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
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 ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.