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.

assembler 8051 - Wyciąganie wartości z adresu rejestru

Rigid 01 Lip 2015 12:21 711 8
  • #1 01 Lip 2015 12:21
    Rigid
    Poziom 9  

    Witam.

    Czy istnieje jakas osoba która potrafi dość jasno wyjaśnić takie zagadnienie:

    Jest liczba zapisana w pamięci do której adres jest w rejestrze np R3.
    Jak najlepiej wyciągnąć wartość tej liczby
    i jeśli jest ona równa y to do adresu 5 przypisujemy 1
    a jeśli nie, to do rejestru R4 przypisujemy 0

    0 8
  • #2 01 Lip 2015 13:31
    atom1477
    Poziom 43  

    Jak wiem jak najlepiej? Skoro jest tylko jedna metoda?
    Tak więc trzeba użyć właśnie tej jednej metody.
    Jak to metoda to na razie nie napiszę, bo jednak jakieś minimum wiedzy o mikrokontrolerach jednak pasuje mieć (szczególnie że zadane pytania sugerują że to są pytania z jakiejś szkoły/uczelni).
    Co do drugiej części podobnie. Tutaj tylko podpowiem że będą dwie albo nawet 3 "metody". Zależnie od tego czy y jest podane jako stała, jako zmienna w pamięci RAM czy jako wartość w jakimś rejestrze roboczym mikrokontrolera.
    No i podpowiem że trzeba użyć instrukcji skoku warunkowego.
    Przypisania 0 do R4 oczywiście też raczej nie będę wyjaśniał :D

    0
  • #3 02 Lip 2015 08:31
    greg789
    Poziom 16  

    Rigid napisał:
    Witam.

    Czy istnieje jakas osoba która potrafi dość jasno wyjaśnić takie zagadnienie:

    Jest liczba zapisana w pamięci do której adres jest w rejestrze np R3.
    Jak najlepiej wyciągnąć wartość tej liczby
    i jeśli jest ona równa y to do adresu 5 przypisujemy 1
    a jeśli nie, to do rejestru R4 przypisujemy 0


    8051 ma architekturę harwardzką, stąd ma oddzielone pamięci programu (zazwyczaj ROM)) i danych (RAM).
    Dodatkowo każda z nich może być wewnętrzną i (lub) zewnętrzną.
    Stąd są różnice w sposobach dostępu, napisz o jaki rodzaj pamięci ci chodzi.
    Do tego aby było ciekawiej to dane (stałe) można przechowywać w każdej z tych pamięci, choć sposób dostępu będzie różny.

    0
  • #4 02 Lip 2015 09:08
    2rs232
    Poziom 17  

    Rigid napisał:
    Jest liczba zapisana w pamięci do której adres jest w rejestrze np R3.
    Jak najlepiej wyciągnąć wartość tej liczby

    Poczytaj o adresowaniu pośrednim :wink:
    Kod: x86asm
    Zaloguj się, aby zobaczyć kod

    0
  • #5 03 Lip 2015 16:51
    Rigid
    Poziom 9  

    assembler jest dla mnie bardzo niezrozumiały po kursie C++.

    Czyli będzie to wyglądało tak?:

    Kod: x86asm
    Zaloguj się, aby zobaczyć kod

    (może się ktoś obrazić, ale ten język jest strasznie toporny)

    0
  • #6 03 Lip 2015 17:22
    greg789
    Poziom 16  

    Ten język jest bardzo prosty, wystarczy dobrze go zrozumieć.
    Instrukcje warunkowe we wszystkich procesorach działają tak samo, albo dokonują skoku, albo wykonują następną instrukcję.
    W tym wypadku wykona następną instrukcję po
    cjne A,y,rowne.
    czyli też MOV R5,#4 ; jesli ma do R5 wpisać wartość 4 ,znak "#" oznacza wartość bezpośrednią , a "D" jest zbyteczne dla wartości w systemie dziesiętnym

    0
  • #7 03 Lip 2015 19:23
    Rigid
    Poziom 9  

    Czyli jak powinna wyglądać instrukcja

    z C++:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    nie da sie łatwiej niż:
    Kod: x86asm
    Zaloguj się, aby zobaczyć kod

    0
  • #8 03 Lip 2015 20:01
    Marek_Skalski
    Moderator Projektowanie

    0. Proponuję przeczytać opis instrukcji rdzenia z rodziny C51. Widać, że tego nie zrobiłeś.

    1. Adresowanie indeksowe może być zrealizowane tylko w oparciu o rejestry R0, R1, DPTR i PC.
    Poprawne są zapisy:

    Kod: x86asm
    Zaloguj się, aby zobaczyć kod

    2. Instrukcja CJNE, to Compare and Jump if Not Equal. Ta instrukcja to porównanie, ustawienie/skasowanie flagi C i jeżeli wartości argumentów są różne, to dodaje do PC wartość trzeciego argumentu funkcji (offset). Jeżeli dwa pierwsze argumenty są równe, to wykonuje kolejną instrukcję.

    Kod mógłby wyglądać tak:
    Kod: x86asm
    Zaloguj się, aby zobaczyć kod


    Jeżeli aktywny jest bank 0 (RS0 = 0 i RS1 = 0), to rejestrom R0..R7 będę odpowiadały komórki pamięci 0x00..0x07, ale jeżeli włączony jest inny bank, to należy to uwzględnić. Dlatego wartość do porównania przesłałem w rejestrze B, który ma stały adres.

    3. Średnik w asemblerze to początek komentarza. Nie jest wymagany jako znacznik końca instrukcji.

    0
  • #9 03 Lip 2015 22:42
    greg789
    Poziom 16  

    Kod: x86asm
    Zaloguj się, aby zobaczyć kod

    0