Asembler - Błędne adresowanie elementów

0

Witam :) Mam problem z programem w asemblerze. Jednym z zadań programu jest kopiowanie elementów z jednej tablicy do drugiej, gdzie druga jest przekazywana jako wskaźnik. Mam problem z kodem, gdyż aktualnie zwracane jest ok 30% danych (przykładowo na 10 liczb tylko 3 pierwsze są prawidłowo skopiowane, reszta liczb to wartości przed kopiowaniem). Wyczytałem, że mój problem może być związany ze złymi wartościami (8 bitów zamiast 32) lecz nie potrafię znaleźć co, jak i w jakim miejscu poprawić.

Kopiuj proc uses ebx ecx edx esi edi tablica:DWORD, nowa_tablica:DWORD, ilosc:DWORD, liczbaWatkow:DWORD, indexWatku:DWORD

local liczbaWatkowZmienna:DWORD ;lokalna zmienna przechowywująca "iloscWatkow"
local iloscElem:DWORD   ;lokalna zmienna przechowywująca ilość elementów
local licznik:DWORD             ;licznik z informacją o aktualnym indeksie tablicy

local adrNowaTab:DWORD

mov eax, ilosc          ;wpisanie do rejestru eax "ilość" z parametrów
mov iloscElem, eax      ;wpisanie do zmiennej lokalnej
mov eax, liczbaWatkow           ;wpisanie do rejestru eax liczby wątków
mov liczbaWatkowZmienna, eax    ;wpisanie do zmiennej lokalnej wartości z eax

xor eax, eax            ;wyzerowanie rejestru eax

mov ecx, indexWatku             ;wpisanie do ecx indeksu aktualnie przerabianego wątku
mov ebx, tablica        ;przekazanie adresu tablicy do ebx
mov edx, nowa_tablica   ;przekazanie adresu nowej_tablicy do edx
mov adrNowaTab, edx
 xor esi, esi

add ebx, ecx                ;zwiększenie indeksu tablicy o numer wątku
add edx, ecx                 ;zwiększenie indeksu nowej tablicy o numer wątku
add esi, ecx                    ; zwiększenie licznika o numer wątku

petla:
mov eax, [ebx]           ;przeniesienie do rejestru eax pierwszego elementu z tablicy ebx
mov [edx], eax           ;wpisanie do pierwszego elementu nowa_tablica wartości spod eax

add ebx, liczbaWatkowZmienna ;zwiększenie indeksu tablicy o ilość wątków
add edx, liczbaWatkowZmienna ;zwiększenie indeksu nowej tablicy o ilość wątków
add esi, liczbaWatkowZmienna ;zwiekszenie eax o ilość wątków

cmp esi, iloscElem  ;porównanie ilości wątków z licznikiem
jbe petla                               ;skok do pętla jeżeli mniejsze lub równe

mov eax, adrNowaTab
ret

Kopiuj endp

end

Poglądowa funkcja w c++

for (int i=indexWatku; i<=ilosc; i+=liczbaWatkow){

            nowa_tablica[i]  = tablica[i];

        }

Będę niezmiernie wdzięczny za pomoc, gdyż cały dzień spędziłem próbując to naprawić :)

0

A dla jakich wartości parametrów to wołasz?

0

Dla integerów

0

Nie no ale jak odpalisz to dla 10 liczb i 3 "wątków" to przepisze ci 3 liczby. Nadal nie rozumiem co ci nie działa.

0

Ten kod jest przygotowany pod obsługę wielu wątków (jedno z wymagań projektu)

Przykład
jeżeli mamy 4 wątki, 10 liczb w tabeli to:
1 wątek skopiuje 1 5 9 element
2 wątek 2 6 10 element
3 wątek 3 7
4 wątek 4 8

Do tego założenie jest, że ilość wątków (lista rozwijana wyboru) nie może być większa niż ilość liczb w tabeli.
Funkcja jest puszczona w pętli i wykonuje się dla każdego wątku, ale dla testów i tak wykonuje ją na ilości wątków =1
W c++ kod działa mi poprawnie. W asemblerze nie. Oczekuje, że po zakończeniu kodu otrzymam zapełnioną tablicę, w obecnej chwili otrzymuję tylko cześć elementów.

0

Ok. Błąd jest taki że przesuwasz edx i ebx o liczbę która jest interpretowana jako liczba bajtów podczas gdy chcesz się przesuwać o dwordy.
Pomyśl! Masz np adres 0 i chcesz przesunąć się na kolejnego inta czyli o 4 bajty więc nie możesz dodać 1 bo się kompilator nie domyśli że chodzi o 1 dworda no bo jak? Musisz dodać 4 bo dword ma tyle bajtów.

0

Zamiast add ebx, ecx dałem add ebx, [adresPoczątkowy+ecx*4] i analogicznie dla edx. Podczas debugowania widzę, że wywala mi błąd na instrukcjach odpowiedzialnych za wrzucanie danych do tablic mov eax, [ebx] i mov [edx], eax (czy eax czy ah też to sie dzieje) Szczerze powiedziawszy nie wiem czemu tak się dzieje, skoro jestem teraz w odpowiednich adresach to nie powinno być problemów z odczytem. Już skończyły mi się pomysły, wczorajszą noc i dzisiejszy cały dzień nad tym spędziłem zmęczony jestem :)

Edit: Sprawdziłem jeszcze w mov zamiast [ebx] dać [adresB+ecx*4] to z kolei to mi przechodzi podczas uruchomienia, ale zwraca same zera (czyli to co było w tablicy przed wywołaniem)

0

A pewny jesteś że wolno ci takie operacje robić? Bo ja nie wiem co to akurat za asembler którego uzywasz, ale są pewne ograniczenia do tego co można sobie wpisywać do [] ;)
add ebx, [adresPoczątkowy+ecx*4] to jest akurat bez sensu bo przecież dodajesz do ebx WARTOŚĆ pod pewnym adresem a nie adres...

0

Asembler x86.

0

Ech chłopie, tyle to ja widzę. Chodziło mi raczej o to czy to masm, fasm, tasm, nasm czy jeszcze jakaś inna składnia ;] Zresztą nie ważne. Jeśli zrobiłeś taką zmianę jak napisałeś wyżej to zrobiłeś to źle i tyle.

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