Mam dwa wektory; jeden z nich (VectorA) jest wprowadzany przez użytkownika, a drugi (VectorB) zawiera kilka liczb jednocyfrowych. Oba są wektorami char. Chodzi o to, że program musi porównywać kolejno numery VectorA, aby upewnić się, że są one poprawnymi liczbami, porównując je z tymi w VectorB, które zawierają wszystkie ważne dostępne numery.Porównanie wektorów w złożeniu
Jeśli wszystkie liczby w VectorA są zawarte w VectorB, program zwraca 0. Jeśli którykolwiek z numerów VectorA nie jest obecny w VectorB, program zwraca 1 zamiast tego. Rejestr zwrotny to EAX
.
Oto kod, mam nadzieję, że to nie jest zbyt brudny, ale pokrywa się ze mną (także proszę wybaczyć, jeśli mogę użyć złego terminologii ponieważ angielski nie jest mój język ojczysty) ...
MOV edi, 5 ;VectorA is a 5 digit vector.
character_1:
mov rcx, 10 ;VectorB is a 10 digit vector.
character_2:
mov eax, [ebx+edi-1] ;ebx contains the address of VectorA
cmp eax, [VectorB+rcx-1]
je found_it
loop character_2
mov eax, 1
jmp end_comp
found_it:
dec edi
cmp edi, 0
jne character_1
mov eax, 0
end_comp:
Po pierwsze, wiem, że prawdopodobnie nie powinienem był używać EAX
jako indeksu, ale po wypróbowaniu z całą masą innych rejestrów EAX
był jedynym, który nie spowodował maniaka .
Problem jest ... Nie wydaje się działać. Pierwsza pętla weryfikacyjna działa dobrze. Jeśli ostatnia liczba VectorA to 9, to faktycznie trafia do tagu found_it
i robi to, co ma zrobić. Jednak niezależnie od tego, jaki jest drugi numer, nigdy go nie znajdzie na VectorB.
Do celów debugowania dodałem linię mov esi, [VectorB+rcx-1]
tuż nad główną linią CMP
, w której porównywane są dwie wartości. Dowiedziałem się, że po raz pierwszy są one porównywane, ESI
ma poprawną wartość. Jednak po raz drugi program przechodzi przez tę instrukcję, ESI
zwraca wartość 14648, która oczywiście nie odpowiada zawartości EAX
w następnym wierszu.
Czy ktoś wie, co robię źle?
rcx i edi mają -1 w liniach cmp, ponieważ muszą przechodzić przez pozycje 0-9 i 0-4 ich odpowiednich wektorów, zamiast 1-10 i 1-5. Sposób działania: Edi przeszukuje wszystkie cyfry w Vector1. Dla każdego, rcx przechodzi przez Vector2 i zaczyna porównywać liczby. W momencie znalezienia zbiegów okoliczności, edi zostaje zmniejszone do następnej liczby w Vector1, a rcx zostaje zresetowane do 10, aby można było ponownie zacząć porównywać. Jeśli pojedyncza pętla rcx przechodzi bez przeskakiwania do znacznika found_it, oznacza to, że walor w edi nie znajduje się w Vector2, więc cała sprawa się zatrzymuje. – user2333787