Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

80537 - Porównywanie liczb zapisanych w komórkach pamięci

damekr 14 Sty 2013 19:53 1344 7
  • #1 14 Sty 2013 19:53
    damekr
    Poziom 12  

    Witajcie, w projekcie o którym pisałem w innym temacie natrafiłem na następny problem. Mianowicie opisze po krótce zasadę działania:

    -Wprowadzam hasło z terminala do mikroprocesora zapisuje je w komórkach wskazywanych przez rejestr R1 od 10h
    -Zapisuje do komórek kolejno bajty odbierane z terminala tj do 10h,11h itd w zależności od długości hasła i odpowiednio zwiększam rejestr R2 (licznik ilości liter w kodzie)
    -Po wprowadzonym kodzie wchodzę do głównej pętli programu odrazu przenosi mnie do wprowadzania ponownie kodu, kolejno wprowadzam i zapisuje do komórek pamieci wskazywanych przez rejestr R0 od 50h i kolejno odbierane bajty przenosze do 50h,51h itd.

    Do tej chwili jest ok, jednak teraz chciałbym sprawdzić kod czy zgadza się z zadanym na początku hasłem i nie mam pomysłu jak to rozwiązać, wymyśliłem taki kodzik:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Przy pierwszym przebiegu pętli jest ok, jednak przy drugim odrazu przenosi do zly_k pomimo iż hasła wprowadzam identycznie.

    Poniżej zamieszczam cały kod:

    Kod: asm
    Zaloguj się, aby zobaczyć kod



    Pozdrawiam, Panowie z góry dzięki za pomoc!

    0 7
  • #2 14 Sty 2013 20:31
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Co za pomysł, żeby zamiast zadeklarować dane z nazwami, ręcznie pilnować adesów pamięci? Od tego jest asembler.

    2. Jest taka instrukcja CJNE - przyjrzyj się jej wariantom, któryś powinien pasować. Ew. użyj XRL. SUBB to odejmowanie z pożyczką - tu Ci nie pomoże.

    0
  • #3 14 Sty 2013 20:35
    damekr
    Poziom 12  

    Od samego początku tak robie:) Wymyśliłem takie coś:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    I znów przy pierwszym przejściu jest ok a przy drugim obserwując akumulator zauważam że pojawia się w nim 0x90 i wychodzi z pętli sprawdzającej.

    0
  • #4 14 Sty 2013 21:00
    BlueDraco
    Specjalista - Mikrokontrolery

    prawie dobrze, tylko po co SUBB, którego efektu nie znasz ? dlaczego nie CJNE A, @R0 ?

    0
  • #5 15 Sty 2013 00:14
    kspro
    Poziom 27  

    Jak używasz do porównania SUBB to musisz wpierw wyzerować wskaźnik C (Carry), bo w odróżnieniu od ADD/ADDC nie ma instrukcji SUB nie korzystającej z C. Dla sprawdzenia czy wartości są sobie równe wystarczy sprawdzić flagę Z (Zero), więc używanie CJNE A,#0,addr nie ma sensu, wystarczy zwykły skok warunkowy:

    Code:
    LOOP:  MOV   A,@R1
    
           CLR   C
           SUBB  A,@R0
           JNZ   BADPWD   ;Zle haslo
           INC   R0
           INC   R1
           DJNZ  R2,LOOP
           ...
    BADPWD:

    Można też zamiast SUBB użyć instrukcji XRL, która dla dwóch identycznych bajtów daje w wyniku zero (i nie trzeba kasować przeniesienia C).
    Code:
    LOOP:  MOV   A,@R1
    
           XRL   A,@R0
           JNZ   BADPWD   ;Zle haslo
           INC   R0
           INC   R1
           DJNZ  R2,LOOP
           ...
    BADPWD:

    Natomiast instrukcja CJNE raczej nie mogłaby być w takiej pętli użyta do porównywania, bo brak w tej instrukcji adresowania indirect zawartością rejestru (nie ma CJNE A,@R0,label ), chociaż jest to jedyna instrukcja 8051 nie niszcząca zawartości akumulatora przy porównaniu. Z tego względu najlepiej nadaje się ona do porównania A z kolejnymi stałymi (coś jak w instrukcji switch() w języku C).

    0
  • #6 16 Sty 2013 18:46
    damekr
    Poziom 12  

    Witajcie, rozumiem kod ale nie wiem z jakiego powodu nie działa mi. Tak jakby kod się nie zgadzał pomimo tego że wprowadzam dwa razy poprawnie.

    0
  • #7 16 Sty 2013 18:55
    BlueDraco
    Specjalista - Mikrokontrolery

    Niestety, my nie rozumiemy kodu, bo nie byłeś łaskawy go pokazać. Bo to, że ten poprzedni jest błędny - to chyba rozumiesz, prawda?

    0
  • #8 16 Sty 2013 21:47
    damekr
    Poziom 12  

    Już wiem gdzie był problem, zadeklarowałem sobie zapisywanie od komórki 10h a tam mam stos i zmieniało mi wartość dlatego był błąd. Dokładnie tutaj zmieniłem:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Dodano po 2 [godziny] 35 [minuty]:

    Wklejam cały działający kod z komentarzami, a nóż się komuś przyda.

    Wielkie podziękowania dla Panów z Elektrody, zawsze można na Was liczyć!

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0