Czytanie z pliku - assembler

0

Witam, nie bardzo rozumiem dlaczego nie mogę się odnieść do przydzielonego bloku pamięci jak do tablicy bajtów:

INVOKE GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT or GMEM_FIXED, MEMSIZE
mov    pMemory, eax
INVOKE ReadFile, hFile, pMemory, MEMSIZE-1, ADDR SizeR, NULL
mov ebx, pMemory
mov al, BYTE PTR [ebx] ;nie działa
3

Sieroto jedna, poczytaj co za flagi dajesz do GlobalAlloc:

GMEM_MOVEABLE
0x0002
...
This value cannot be combined with GMEM_FIXED.

"Nie działa" bo pamięć nie zostaje przydzielona, GlobalAlloc zwraca 0, ReadFile pewnie robi test na NULL i zraca FALSE. Kto Ci podsunął taką idiotyczną konfigurację flag?

0
PS napisał(a):

Sieroto jedna, poczytaj co za flagi dajesz do GlobalAlloc:

GMEM_MOVEABLE
0x0002
...
This value cannot be combined with GMEM_FIXED.

"Nie działa" bo pamięć nie zostaje przydzielona, GlobalAlloc zwraca 0, ReadFile pewnie robi test na NULL i zraca FALSE. Kto Ci podsunął taką idiotyczną konfigurację flag?

Co ty taki sfrustrowany ;)
Czyli że powinno być tak?:

INVOKE GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE
mov    hMemory, eax
INVOKE GlobalLock, hMemory
mov    pMemory, eax
INVOKE ReadFile, hFile, pMemory, MEMSIZE-1, ADDR SizeR, NULL
INVOKE GlobalUnlock, pMemory
INVOKE GlobalFree, hMemory
INVOKE CloseHandle, hFile

Może i nie można mieszać tej flagi z GMEM_FIXED jednak moje pytanie jednak dotyczy czegość innego.

2
Mistren napisał(a):

Może i nie można mieszać tej flagi z GMEM_FIXED jednak moje pytanie jednak dotyczy czegość innego.

Po pierwsze to powinieneś używać GPTR, które jest kombinacją GMEM_FIXED i GMEM_ZEROINIT. Po drugie to Twoje pytanie dotyczy właśnie tego, dostajesz NULL z nieudanej alokacji i masz null pointer dereference. Człowieku, zabierasz się za assemblera i nie korzystasz z debuggera?

Poza tym "nie działa" to możesz powiedzieć żonie jak Ci Viagra nie pomoże, tu jest serwis techniczny, pisz konkretnie, "nie kompiluje się: {tutaj log kompilacji}", "otrzymuję wyjątek {tutaj informacje o wyjątku}". Krótka piłka: albo assembler albo bycie humanistą.

0
PS napisał(a):
Mistren napisał(a):

Może i nie można mieszać tej flagi z GMEM_FIXED jednak moje pytanie jednak dotyczy czegość innego.

Po pierwsze to powinieneś używać GPTR, które jest kombinacją GMEM_FIXED i GMEM_ZEROINIT. Po drugie to Twoje pytanie dotyczy właśnie tego, dostajesz NULL z nieudanej alokacji i masz null pointer dereference. Człowieku, zabierasz się za assemblera i nie korzystasz z debuggera?

Poza tym "nie działa" to możesz powiedzieć żonie jak Ci Viagra nie pomoże, tu jest serwis techniczny, pisz konkretnie, "nie kompiluje się: {tutaj log kompilacji}", "otrzymuję wyjątek {tutaj informacje o wyjątku}". Krótka piłka: albo assembler albo bycie humanistą.

Ty człowieku jesteś psychol, zmocz głowę, uspokój się ;) Otóż nie masz racji, ponieważ nawet w poprzedniej konfiguracji flag program wykonywał się poprawnie tj. czytał 10 bajtów do zarezerwowanego bloku pamięci po czym dopisywał go do końca tego samego pliku. Przy poprawionej wersji również brak właściwych rezultatów. Co do pytania o debugger, tak używam go, tylko nie wiem jak miałby mi pomóc w tej sprawie, nie będę przecież analizował całej funkcji readfile. Reasumując, plik otwieram poprawnie, wskaźnik do bloku pamięci jest poprawny, a sposób w jaki chce odczytać dany bajt nie. Więc potrafisz pomóc czy tylko pokazywać swoją "wyższość" na każdym kroku?

P.S "nie działa" w odniesieniu do linijki mov al, BYTE PTR [ebx], miałem nadzieję, że domyślisz się i nie muszę pisać "w najmłodszym bajcie rejestru eax nie zostaje umieszczona wartość odpowiadająca pierwszemu bajtowi w pamięci o adresie pMemory...

1
Mistren napisał(a):

w najmłodszym bajcie rejestru eax nie zostaje umieszczona wartość odpowiadająca pierwszemu bajtowi w pamięci o adresie pMemory...

Słuchaj, cuda to były dobre w Betlejem. Te dwa movy muszą zrealizować dokładnie to, co napisałeś, nie ma innej opcji. Jesteś pewien, że ReadFile się powiodło?

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