[c++] Dll działa w trybie debug, natomiast w release nie

0

Witam, od kilku tygodni męczę się z takim problemem, mianowicie zrobiłem sobie dll, w której funkcje pisane są w asemblerze. W trybie debug, wszystko pięknie działa, natomiast w trybie release (kompiluje się) po uruchomieniu programu w momencie wywołania funkcji z asemblera, do wskaznika dodaje liczbę i po tej operacji, wrzucenie czegokolwiek na stos powoduje błąd zapisu (dostęp do komórki pamięci zabroniony). Tutaj jest kod:

6E7D103C push ebp
6E7D103D mov ebp,esp
6E7D103F add esp,0FFFEFED4h
6E7D1045 push 0

Ostatnia operacja powoduje ww. błąd

Tak wywołuję funkcję z dll:
[code]extern "C" int _stdcall Pakowanie (unsigned short * x, int y);

Próbowałem wywoływać funkcję dynamicznie jak i statycznie, w obu wypadkach było to samo.
Program uruchamiam na 64 bitowym win 7 i VS 2008.

0

A po co zmieniasz wskaźnik stosu
6E7D103F add esp,0FFFEFED4h
od adresowania stosu w fun. masz ebp .
Jeśli ma to być rezerwacja dla danych na stosie to chyba przesadziłeś z rozmiarem i raczej nie w tą stronę
sub esp, 12 ; zarezerwowanie miejsca na stosie na 3 zmienne lokalne (3 * 4 bajty)
Przy wyjściu z fun przywracasz wskaźnik stosu
mov esp, ebp ; zdjęcie zmiennych lokalnych ze stosu
pop ebp ; przywrócenie poprzedniej wartości rejestru EBP

0

zapomniałem dopisać że jest to jest kod z disassemblacji, kompilator to dorzucił ;p i też mnie to zastanawia dlaczego

0

A nie alokujesz sobie jakiejś dużej tablicy? O ile nie jestem zaślepiony (czasami tak mam wieczorem), to 0xFFFEFED4 == 0x1012C (U2!) == 65836 -trochę ponad 2^16 (65536). Czyli tak jakbyś alokował sporą tablicę. Może np. w trybie debug stos ma rozmiar 131072 bajtów, a w release 65536, i tego nie wytrzymuje... Więcej bez kodu (maszynowego albo źródłowego... Ale lepiej źródłowego) nie dam rady wymyślić

0

no szacun, a już 3 projekt zakładałem bo myślałem, że mam gdzieś coś źle poustawiane. faktycznie alokuję dużą tablicę (65792 elementów). Teraz tylko pytanie, nie da się jakoś tego obejść? , bo dynamiczne alokowanie tej pamięci trochę mi namiesza w kodzie

0

O ile dobrze pamietam to project->[nazwa projektu] properties->configuration properties->linker->system

0

ale jak namiesza – alokujesz na wejściu do procki, zwalniasz na returnie (każdym returnie). i już.

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