2013-04-29 11 views
6

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?

Odpowiedz

0

Dwie oczywiste błędy zacząć

mov edi, 5

a zarazem pierwszy CMP ma edi-1, a więc rozpoczyna się 4

====

mov RCX, 10

a zarazem pierwszy CMP został rcx-1, a więc rozpoczyna się 9

====

CMP edi, 0

jne character_1

mov RCX, 10

character_1 resetuje pętlę 10 na środku pętli EDI jest ok?

====

nie wiem co RCX jest, zakładam swoją ECX wykorzystywane do pętli character_2

mov RCX, 10 Przypuszczam jest dziesięć cyfrowy, a nie 16 binarny

po sort wszystkie guffy małe szczegóły się, że będzie kołysać, ale diabeł tkwi w szczegółach z tych malusieńka rutyny

=========

„Jeśli ostatnia liczba VectorA jest 9, to faktycznie idzie do znacznika found_it”

To dlatego, że skok zawsze resetuje RCX na 10, wtedy ma cmp RCX-1 (tak RCX = 9)

tak to idzie CMP 10 9 10 9 10 9 CMP CMP zamiast 10 CMP CMP 9 8 7 6 CMP itp

+0

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

0

character_1:

mov RCX, 10; VectorB jest 10-cyfrowy wektorowych.

character_2:

mov eax, [ebx+edi-1]  ;ebx contains the address of VectorA  

cmp eax, [VectorB+rcx-1]  

je found_it  

pętla character_2

Co się stanie, jeśli tu nie pasuje?

edi będzie edi-1 zawsze

Trzeba jeszcze znaleźć sposób, aby potępiać edi

edi = edi-1 trochę rzeczą

Robisz

dec edi

jeśli jest odpowiednik, ale zachowaj edi tak samo, jeśli nie ma dopasowania

+0

To dlatego, że jeśli nie ma dopasowania, to nie ma już sensu szukać. W chwili znalezienia pojedynczej cyfry w VectorA, która nie jest częścią VectorB, cały VectorA staje się nieważny, a program wychodzi z powrotem 1 przez eax. – user2333787

1

Ups, myślę, że znalazłem problem ... Wygląda na to, że rejestr eax nie jest przeznaczony dla zawartości jednobajtowej (wektory mają w sobie znaki, które mają rozmiar bajtowy). Zmieniłem linie ...

mov eax, [ebx+edi-1]  
cmp eax, [VectorB+rcx-1] 

... do ...

mov al, [ebx+edi-1]  
cmp al, [VectorB+rcx-1] 

A teraz wydaje się działać. Wygląda na to, że eax rzeczywiście odczytał 4 bajty wektora zamiast 1.

Dzięki i tak. :)