logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zrozumienie kodu assemblera dla 8051: zawartość akumulatora po programach

mk22 19 Maj 2012 15:19 6960 7
REKLAMA
  • #1 10913398
    mk22
    Poziom 10  
    Posty: 14
    Ocena: 1
    Witam,

    Piszę ten temat ponieważ mam problem w zrozumieniu kodu w assemblerze dla 8051. Przeczytałem pare numerów jednego z czasopism dla elektroników z '96 i '97 roku traktujących o 8051.
    Jest to moja pierwsza styczność z 8051 oraz asemblerem, dlatego proszę o wyrozumiałość. Nie mam się do kogo z tym zwrócić, a dla niektórych z was te zadania są ta 5min.

    Zadanie jest następujące:
    "Do komputera jednoukładowego 8751 podłączono wyłącznie:
    -zasilanie
    -układ generacji przebiegu zegarowego
    -układ zerowania
    -wszystkie końcówki portu P1 podłączono do Ucc a portu P2 do masy.
    Jaka będzie zawartość akumulatora( podaj w postaci liczby dziesiętnej) po niezależnym wykonaniu każdego z podanych niżej programów.
    Jeśli z jakiś przyczyn wartość ta jest nieprzewidywalna wpisz ?.
    Przyjmij, że pamięć RAM i rejestry po włączeniu mają zawartość losową."

    a)
    mov A, #1b
    mov R0, 1
    mov R1, 2
    mov B, 1

    odp. 1

    b)
    mov A, #1
    mov P0, A
    mov A, P2
    mov P3, #10h

    odp. 10

    c)
    mov A, #feh
    mov P1, A
    mov A, 1
    mov A, #2h

    odp. ?

    d)
    clr C
    mov 1, #ah
    mov R0, #1h
    mov A, @R0

    odp.10

    e)
    setb C
    mov A, #0h
    et: rrc A
    jnb A.1, et

    odp. 2

    Teraz napiszę mój tok rozumowania i moje problemy w zrozumieniu poszczególnyh przykładów:
    ad. a)
    mov A, #1b do akumulatora wpisywana jest liczba 1 binarnie
    mov R0, 1 do rejestru R0 przepisywana jest zawartość komórki 1( z tego przykładu mogę wywnioskować co jest w komórce 1?)
    mov R1, 2 Rozumowanie jak wyżej
    mov B, 1 do rejestru B przepisywana zawartość komórki o adresie 1

    odp. 1 bierze się z 'mov A, #1b' reszta jest nieistotna dla akumulatora

    ad b)
    mov A, #1 do akumulatora wpisywana jest liczba 1( #1 to 1 dziesiętnie bo bez literki na końcu?)
    mov P0, A port P0 ustawiany jest na 1, bo akumulator miał wpisane 1
    mov A, P2 Jakie jest wynik tej operacji? P2 jest podłączony do masy czyli ma tam 0?
    mov P3, #10h na port P3 wpisywana jest liczba 10hex czyli 16dec

    odp. 10 Tej 10 w ogóle nie rozumiem. dla wyniku ma znaczenie 'mov A, P2' reszta się nie liczy dla akumulatora?

    ad. c)
    mov A, #feh do akumulatora wpisywana jest liczba fe hex czyli 254dec
    mov P1, A na port P1 przepisywana jest liczba 11111110 (254dec) Rozumiem, że każdy port w 8051 a jest ich 4 (P0, P1, P2, P3) ma 8pinów. Czyli z powyższego na pinie od 1-6 będą ustawione 1 a na pinie 8 będzie 0? ( numerowanie pinów też od 0 np. P0.0 czy od 1 P0.1?)
    mov A, 1 do akumulatora wpisywana jest zawartość komórki o adresie 1( ale co tam jest?)
    mov A, #2h do akumulatora wpisywana jest liczba 2.

    odp. ? Ale dlaczego odp. jest niewiadoma? Przecież ostatnia linijka 'mov A, #2h' wpisuje do akumulatora 2hex czyli 2dec. Wpisałbym odp. 2.

    ad. d)
    clr C znak 'C' to flaga powrotu karetki? Ustawiam ją na 0
    mov 1, #ah do komórki o adresie 1 wpisuje liczbę Ahex (dalej nie wiem co jest w tej komórce 1)
    mov R0, #1h do rejestru R0 wpsiuje 1
    mov A, @R0 przepisuje zawartość R0 do akumulatora

    czy R0 i @R0 to to samo? Chyba nie bo R bez '@ może być R0 - R7( 8051 ma 4 banki pamięci rejestrów. W tych przykładach cały czas pracuje na jednym banku?) ale nie weim co robi @R0 i @R1
    a @R może być tylko @R0 lub @R1
    odp. 10. Dałbym odp 1 ważne dla mnie były dwie ostatnie linijki.

    e)
    setb C ustawim powrót karetki na 1
    mov A, #0h do akumulatora wpisuje 0
    et: rrc A tu jest etykieta 'et'. przesuwa w prawo zawartość akumulatora, na miejsce najstarszego bitu wpisywana jest dotychczasowa zawartość bitu C, bit najmłodszy jest wpisywany jako nowa wartość C.
    czyli akumulator miał wpisane 00000000 C był ustawiony na 1 czyli akumulator ma teraz 10000000 a C jest ustawione na 0?
    jnb A.1, et jeżeli A.1 jest ustawione na 0 to skoczy do 'et' A.1 to jest bit drugi z lewej- jest on ustawiony na 0 czyli skok do 'et' czyli akumulator ustawiany jest na 11000000. ( i tak w kółko te przesunięcia) ( tu chyba coś nie zrozumiałem bo przy 8 skoku akumulator miały 11111111 i odp byłaby 255dec )

    odp. 2

    Pytanie dodatkowe: Jeśli P1 podpięty jest do Ucc( co to dokładnie jest to Ucc? myślałem, że zasilanie) to wszystkie jego (końcówki)piny są ustawione na 1?
    P2 podłączone do masy to jego końcówki mają 0?

    Dzięki za pomoc.
  • REKLAMA
  • Pomocny post
    #2 10913492
    kozak_sc
    Poziom 23  
    Posty: 752
    Pomógł: 25
    Ocena: 117
    A,B,C w porządku.

    odp D:
    C to jest akumulator bitowy i nie ma wpływu na A.
    mov 1, #ah do komórki o adresie 1 wpisuje liczbę Ahex
    mov R0, #1h do rejestru R0 wpsiuje 1
    mov A, @R0 przepisuje wartość danej która znajduje się pod adresem zawartym w rejestrze R0 do akumulatora.
    Czyli a akumulatorze pod koniec mamy 0x0A. @ oznacza adresowanie pośrednie.

    odp E:
    setb C - akumulator bitowy na 1
    mov A, #0h do akumulatora wpisuje 0
    et: rrc A
    jnb A.1, et

    Tutaj zrealizowana jest pętla. po wykonaniu rrc A w akumulatorze mamy 10000000 a w C mamy 0 po kolejnym przesunięciu w C dalej 0 a w A 01000000 i tak tą pętle wykonujemy aż do momentu wystąpienia A=00000010. I to jest ostatnia wartość w A.

    W przypadku zwarcia portu do masy i wykonaniu mov A,Px mamy w A 0. W przypadku gdy port zwieramy do Ucc to mamy po odczycie 255(same 1).

    Ps. zwieranie portu do Ucc w przypadku 51 jest bez sensu bo w przypadku gdy wystawimy na któryś pin tego portu 0 to będzie zwarcie ponieważ te porty są open collector.

    Dodano po 5 [sekundy]:

    A,B,C w porządku.

    odp D:
    C to jest akumulator bitowy i nie ma wpływu na A.
    mov 1, #ah do komórki o adresie 1 wpisuje liczbę Ahex
    mov R0, #1h do rejestru R0 wpsiuje 1
    mov A, @R0 przepisuje wartość danej która znajduje się pod adresem zawartym w rejestrze R0 do akumulatora.
    Czyli a akumulatorze pod koniec mamy 0x0A. @ oznacza adresowanie pośrednie.

    odp E:
    setb C - akumulator bitowy na 1
    mov A, #0h do akumulatora wpisuje 0
    et: rrc A
    jnb A.1, et

    Tutaj zrealizowana jest pętla. po wykonaniu rrc A w akumulatorze mamy 10000000 a w C mamy 0 po kolejnym przesunięciu w C dalej 0 a w A 01000000 i tak tą pętle wykonujemy aż do momentu wystąpienia A=00000010. I to jest ostatnia wartość w A.

    W przypadku zwarcia portu do masy i wykonaniu mov A,Px mamy w A 0. W przypadku gdy port zwieramy do Ucc to mamy po odczycie 255(same 1).

    Ps. zwieranie portu do Ucc w przypadku 51 jest bez sensu bo w przypadku gdy wystawimy na któryś pin tego portu 0 to będzie zwarcie ponieważ te porty są open collector.
  • REKLAMA
  • #3 10913637
    mk22
    Poziom 10  
    Posty: 14
    Ocena: 1
    Odp., które podałem w treści zadania są podane odgórnie a ja próbuje je zrozumieć

    e) zrozumialem. teraz mi pasuje odp. 2

    a) napisałeś, że w porządku, czyli tak jak myślałem ( odp. 1 bierze się z 'mov A, #1b' reszta jest nieistotna dla akumulatora )

    c) nie wiem dlaczego jest '?'. przecież na końcu mam mov A, #2h więc czemu odp nie jest 2? Czy ta linijka mov A, 1jest bez znaczenia dla zadania( bo nie wiem co jest w komórce o adresie 1, a ponadto mov A, #2h ustawiając A na 2 kasuje to co było w A wcześniej?)

    d)
    Czyli R0 i @R0 to są różne rejestry i nie mają ze sobą nic wspólnego.
    @R0 wskazuje na komórkę o adresie 1(która zawiera Ahex bo mov 1, #ah)
    Wykonanie instrukcji mov A, @R0 wpisuje 10 do A?

    b)pomylilem się odp jest podana 0. Czyli ważna jest mov A, P2 która ustawia A na 0 bo P2 to masa.
  • REKLAMA
  • Pomocny post
    #4 10913873
    kozak_sc
    Poziom 23  
    Posty: 752
    Pomógł: 25
    Ocena: 117
    a). TAK
    c). Operacje na B nie mają wpływu na A. (nie licząc oczywiście tych które używają i A i B)
    d)R0 to jest jeden rejestr. ale napisanie R0 zwraca wartość która jest w rejestrze natomiast @R0 zwraca wartość komórki pamięci z pod adresu zawartego w R0.
    Przykład:
    mov R0,5

    mov A,R0 ->teraz w akumulatorze jest 5
    mov A,@R0 -> teraz w akumulatorze jest dana z pamięci o adresie 5.
  • #5 10913907
    mk22
    Poziom 10  
    Posty: 14
    Ocena: 1
    d) ok dzięki teraz zrozumiałem ten przykład.
    Czyli w pojedynczym banku rejestrów( są ich 4) mam R0 do R7 i do każdego takie R mogę zrobić @rn? np. @R., @R....?

    c)napisałeś " Operacje na B nie mają wpływu na A. (nie licząc oczywiście tych które używają i A i B)". NIe wiem czy ja źle patrze czy Ty pomyliłeś przykłady ale tam nie ma żadnego 'B'.

    c) to ten przykład:
    mov A, #feh
    mov P1, A
    mov A, 1
    mov A, #2h

    odp. ?
  • REKLAMA
  • Pomocny post
    #7 10915533
    uprog
    Poziom 2  
    Posty: 2
    Pomógł: 1
    Ocena: 2
    a)
    A=1
    mov A,#1b Do akumulatora A wpisujesz wartość 1 (wartość binarna 00000001b), pozostałe instrukcje nie wpływają na wartość akumulatora.

    b)
    A=0
    mov A,P2 Do akumulatora A wpisujesz wartość z portu P2 (port P2 do masy – co daje wartość 00000000b)

    c)
    A=2
    mov A, #2h Ostatnią wartością wpisaną do akumulatora A jest 2 (wartość szesnastkowa 02h)

    d)
    A=10

    mov 1, #ah Do komórki pamięci pod adresem 1 wprowadzasz wartość szesnastkową 0Ah (wartość dziesiętna 10)
    mov R0, #1h Do rejestru R0 wprowadzasz wartość 1 (co stanowi adres pamięci RAM pod którym w poprzedniej instrukcji umieściłeś wartość 10)
    mov A, @R0 Do akumulatora A wprowadzasz wartość spod adresu pamięci RAM wskazywanego przez wartość rejestru R0, wartość umieszczona pierwszą instrukcją pod tym adresem to wartość 10 (gdyby nie było przed R0 znaku @ to do akumulatora A wprowadzona byłaby wartość będąca w rejestrze R0)

    e)
    A=2

    setb C Ustawia znacznik C na 1
    mov A, #0h Wprowadza do akumulatora A wartość 0
    Po wykonaniu powyższych instrukcji C=1 A=000000000

    et:
    rrc A
    jnb A.1, et
    Następnie wykonywana jest pętla, w której zawartość akumulatora A przesuwana jest w prawo przez C do momentu, gdy wartość bitu A.1 będzie równa 1, w tym momencie pętla dobiega końca w akumulatorze A pozostaje wartość 00000010b (wartość dziesiętna 2)

    C A
    1 00000000 A.1 = 0
    0 10000000 A.1 = 0
    0 01000000 A.1 = 0
    0 00100000 A.1 = 0
    0 00010000 A.1 = 0
    0 00001000 A.1 = 0
    0 00000100 A.1 = 0
    0 00000010 A.1 = 1 (koniec pętli et:)
  • #8 10915797
    mk22
    Poziom 10  
    Posty: 14
    Ocena: 1
    Wielkie dzięki za pomoc. Dużo mi to rozjaśniło. Mam nadzieję, że wszystkim będę mógł kliknąć 'pomógł'.

    Pozdrawiam.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zadał pytanie dotyczące zrozumienia kodu assemblera dla mikrokontrolera 8051, w szczególności dotyczące zawartości akumulatora po wykonaniu różnych programów. W odpowiedziach omówiono pięć zadań, w których analizowano wpływ poszczególnych instrukcji na wartość akumulatora. Wskazano, że w przypadku zadania a) akumulator kończy z wartością 1, w b) z wartością 0, w c) z wartością 2, w d) z wartością 10, a w e) z wartością 2. Podkreślono znaczenie adresowania pośredniego oraz różnice między rejestrami a pamięcią. Użytkownicy wyjaśnili również, że operacje na rejestrze B nie wpływają na akumulator A, a także zwrócili uwagę na znaczenie portów P1 i P2 w kontekście ich podłączenia do zasilania i masy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA