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

Assembler dla 8051 - Co to jest stos i jak działa? Szukam dobrego objaśnienia

Uzytkowniik 06 Lis 2005 20:06 15557 15
  • #1 1960906
    Uzytkowniik
    Poziom 16  
    Posty: 291
    Pomógł: 16
    Ocena: 21
    Co to jest stos?? Może ma ktoś jakiegoś linka z dobrym objaśnieniem tego??
  • Pomocny post
    #3 1961194
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    wyobraź sobie stos talerzy. a teraz talerzy nie ma a widzisz miejsce gdzie były . dane sa tak jakby takie taleze. piszesz instrukcje np: push r7 ( odłuż na stos r7 ) to jak by dokładaż jeden tależ na "stos" wiecej kolejny push - nastepny tależ i tak dalej; ale zciągnać ze stosu możesz tylko w sposób odwrotny do tego w jaki odkładałeś ( w koncu jak masz poukładane kiklanascie tależy to zeby sie dostać do najniżej położonego to musisz po kolei sciągać ); ( 8051) np:
    push r1
    push r2
    push r3
    "odkładasz na stos" ( tależe )


    pop r3
    pop r2
    pop r1
    zciagasz ze stosu ( tależe ).

    p.s. mam nadzieje że mnie chodz troche zrozumiales ( dość zagmatwanie opisuje ). pozdrawiam
  • #4 1961329
    Zaquadnik
    Poziom 27  
    Posty: 998
    Pomógł: 103
    Ocena: 25
    Ściślej mowiąc, na 8051 nie da się zrobić operacji push R2 (na przykład). Na stos można odkładać (i zdejmować z niego) tylko akumulator i rejestr B. Trzeba wtedy zrobić tak:
    mov A,R2
    push ACC
    I tu uwaga, rozkaz push A też nie przejdzie. Nie pamiętam dokładnie, ale jest to coś z adresowaniem rejestrów w przestrzeni SFR. Podobnie zachowuje się rozkaz pop .
    Natomiast sam stos jest to po prostu obszar pamięci zorganizowany w taki sposób, że dane umieszcza się niejako jedna na drugiej. Jest to tak zwana struktura LIFO - Last In First Out. To, co ostatnie położymy na stosie musimy zdjąć jako pierwsze. Wygodne jest to we wszelkiego rodzaju pętlach, bo nie trzeba się martwić o adresowanie pamięci. A jak nam się stos nie podoba, to zawsze możemy zaadresować bezpośrednio do komórki pamięci będącej na przykłąd w środku stosu (a nie na jego wierzchołku, do którego mamy dostęp poprzez rozkazy push i pop). Acha, rozkaz pop usuwa daną z wierzchołka stosu, natomiast zaadresowanie bezpośrednie i odczyt danej z dowolnego miejsca stosu nie naruszają jej.
    Pozdrawiam :)
  • #5 1961693
    strdaniel
    Poziom 20  
    Posty: 357
    Pomógł: 29
    Ocena: 4
    Zaquadnik napisał:
    Ściślej mowiąc, na 8051 nie da się zrobić operacji push R2 (na przykład). Na stos można odkładać (i zdejmować z niego) tylko akumulator i rejestr B. Trzeba wtedy zrobić tak:
    :)


    Witam no muszę powiedzieć że troche kolegę poniosło bo niestety intrukcja PUSH i POP pozwala zapisywać do całego obszaru adresowanego w 51 bezpośrednio - czyli 128 bajtów pamięci wewnętrznej danych i całą przestrzeń rejestrów SFR jak sama nazwa wskazuje rozkazy nazywają się w asemblerze
    push direct <- na stos daną z komórki direct

    pop direct <- ze stosu daną do komórki direct

    gdzie direct oznacza 0-127 to adresy wewnętrzenej pamięci danych
    od 128-255 adresy rejestrów SFR

    czyli nie jest prawdą że można zapisywac tylko acc i b <skąd ten pomysł>
    a rejestry r1 r2 itd. można zapisać bezpośrednio na stos

    odsyłam do literatury
  • #6 1963036
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    zgadzam sie z kolegą wyżej można na stos odłożyć r2 jak i wszystko od 00H do FEh ( tj. 0 do 80h i sfr ) . pozdrawiam
  • #7 1963869
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Spoko z tym odkładaniem na stos, piszecie a nikomu sie nie chce sprawdzić, skompiluj cos z rozkazem push r2 i zobaczysz co ci kompilator wywali, poza tym pisząc push 250 nie odłozysz nic z sfr-u tylko bajt z ramu o adresie 250, jesli chcesz odłożyć na stos bajt z sfr-u to musisz najpierw pobrac do akumulatora i push acc. I nie sprzeczaj się że nie mam racji tylko sprawdz na żywym organizmie mikroprocesora.
    PS. Jeśli chcesz odłozyć na stos którys z rejestrów R0-R7 to najpierw musisz zastanowić który bank w danej chwili jest aktywny i dopiero push 2 (odkładam R2 banku 0). A push 8 to bedzie odłożenie R0 banku 1.
    Pisanie push R? nie ma sensu bo rozkaz push nie moze analizowac (nie analizuje) ktory bank w danej chwili jest czynny
  • #8 1964217
    strdaniel
    Poziom 20  
    Posty: 357
    Pomógł: 29
    Ocena: 4
    oczywiście że można !!
    a czy ja napisałem że można użyć takiej składni push r2 albo pop r3 ???
    chodzi o to że rozkazy mają taką składnie

    pop direct
    push direct
    a direct odnosi się we wszystkich rozkazach '51 do dwóch przestrzeni :
    - 0 do 7Fh - to jest pamięć wewnętrzna danych
    - 80 do FFh - to jest przestrzeń sfr

    jeśli więc chcemy zapisać rejestr np. r1 to użyjemy adresu 01h jeśli rejestr r1 z banku 1 to użyjemy adresu 08h itd.. bankowanie rejestrów nie zmienia ich miejsca w przestrzeni adresowej .. one nadal tak siedzą pomimo wszystko... trzeba niestety wiedzieć troche więcej o organizacji pamięci '51 (opisanej w każdej książce na początku) niż tylko znać mnemoniki

    co do możliwości zapisu sfr-ów to też jestem pewny, bo chociażby dlaczego składania dla jednych instrukcji miałaby być inna niż dla innych a raczej inna dla tych dwóch instrukcji
    po drugie bo co instrukcje push i pop są dwubajtowe skoro zawsze wymiana informacji jest pomiędzy stosem a akumulatorem - czyżby inżynierowie byli tak rozrzutni
    i po trzecie pytam na jakim kompilatorze kolega pracował bo chciałbym sprawdzić dlaczego adresując bezpośrednio rejestry sfr rozkazami push i pop kolega nie zapisywał/odczytywał tych rejestów

    Dodano po 27 [minuty]:

    tak na marginesie świetni są ludzie którzy mówią : "nie sprzeczaj się bo i tak zawsze mam racje "
    gratulacje !!!
  • #9 1965901
    Uzytkowniik
    Poziom 16  
    Posty: 291
    Pomógł: 16
    Ocena: 21
    Dzięki za pomoc, teraz już wszystko jasne !
  • #11 1966001
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    oto listing "twój" on prawde ci powie (Rn- banku zerowego):
    linia adres kod instrukcje

    352 01CE C001 push r1
    353 01D0 C002 push r2
    354 01D2 C003 push r3
    355 01D4 C0E0 push acc
    356 01D6 C0F0 push 240
    357 01D8 C0F0 push b
    358 01DA C0E0 push 224
    359 01DC C0E0 push E0H
    360 01DE C0E0 push a
    361
    362 01E0 D0E0 pop a
    363 01E2 D0E0 pop E0H
    364 01E4 D0E0 pop 224
    365 01E6 D0F0 pop b
    366 01E8 D0F0 pop 240
    367 01EA D003 pop r3
    368 01EC D002 pop r2
    369 01EE D001 pop r1
    a to co pisza o push i pop :
    push ( edw kurs asm )cytuje:
    "push onto stack", prześlij na stos."
    "w wyniku tej operacji zawartość wskaźnika stosu SP jest zwiększana o 1, po czym na wierzchołek stosu (adresie w wew. RAM wskazywanym przez SP) zostaje zapisana zawartość komórki z wew. RAM o podanym adresie bezpośrednim „adres". Innymi słowy wykonywana jest operacja „przesłania na stos". SP <-SP + 1, (SP) <-(adres)"
    pop ?( też z edw kurs asm )cytuje:
    „pop from stack" , zdejmij ze stosu
    w wyniku tej operacji dana znajdująca się pod adresem w wewn. RAM określonym w SP zostaje wpisana do komórki o podanym adresie bezpośrednim „adres". Następnie wskaźnik stosu SP zostaje zmniejszony o 1. Innymi słowy wykonywana jest operacja „zdjęcia ze stosu". (adres) <- (SP}, SP <- SP - 1". powyższe słowa napisał: pan Sławomir Surowiński. pozdrawiam.
  • #12 1969620
    jj
    Poziom 19  
    Posty: 145
    Pomógł: 42
    jony15 napisał:
    oto listing "twój" on prawde ci powie (Rn- banku zerowego):
    linia adres kod instrukcje

    352 01CE C001 push r1
    353 01D0 C002 push r2
    354 01D2 C003 push r3
    355 01D4 C0E0 push acc
    356 01D6 C0F0 push 240
    357 01D8 C0F0 push b
    358 01DA C0E0 push 224
    359 01DC C0E0 push E0H
    360 01DE C0E0 push a
    361
    362 01E0 D0E0 pop a
    363 01E2 D0E0 pop E0H
    364 01E4 D0E0 pop 224
    365 01E6 D0F0 pop b
    366 01E8 D0F0 pop 240
    367 01EA D003 pop r3
    368 01EC D002 pop r2
    369 01EE D001 pop r1


    Czy możesz zdradzić jaki program wygenerował ten kod? Z góry dzięki za odpowiedź.

    Pozdrawiam
    Jacek
  • #13 1970607
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Taki listing potrafi wygenerować kompilator assemblera(np. plik *.lst) lub disassembler.Ten , którego użył jj , to jakiś kiepski , bo ...
    
     360 01DE C0E0 push a
    361
    362 01E0 D0E0 pop a 
    

    ... takie coś wygenerował ;)
    Wracając do rozterek , z jakimi "borykają się" programiści MCS-51 przy odkładaniu rejestrów Rx na stos , to "konstruktorzy" kompilatorów rozwiązali ten problem , za pomocą ... pseudoopcji.
    
    ...
    Using 0     ;dyrektywa kompilatora "odwołaj się do banku 0" 
    Push Ar0   ;C000 push 00H 
    Using 1     ;dyrektywa kompilatora "odwołaj się do banku 1" 
    Pop Ar0    ;D008 pop 08H  
    ...
    

    Mam na myśli kompilator ASEM v1.3. Jak i czy jest w innych , należało by sprawdzić .

    Piotrek
  • #14 1971296
    jj
    Poziom 19  
    Posty: 145
    Pomógł: 42
    :arrow:zumek
    Wiem, że potrafi to wygenerować kompilator assemblera. Listing z mojego poprzedniego postu to CYTAT z wypowiedzi kolegi jony15. A moje pytanie wynikło stąd, że też ten kompilator wydał mi się kiepski, i chciałem się dowiedzieć jaka to wersja.
    Sorry za nieprecyzyjne pytanie.

    Ja używam (a raczej używałem, teraz jeśli już piszę na '51, to raczej w C) 8051 Cross-Assembler v 1.2k. I składnia była taka jak w Twoim przypadku, czyli dyrektywa USING x i push/pop ARx.
    Natomiast rozkazy typu:
    push a
    pop a
    push r1
    pop r2
    wywoływały bunt kompilatora.

    :arrow:jony15
    Poprawione pytanie: jaki kompilator assemblera wygenerował taki listing?

    Jacek
  • #15 1971392
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    :arrow: jj sorry :| - miało być
    Cytat:

    Ten , którego użył jony15 ....


    Piotrek
  • #16 1971513
    jony15
    Poziom 25  
    Posty: 604
    Pomógł: 68
    Ocena: 74
    jaki kompilator to wygenerował? a taki maly smieszny z edw ( AVT2250D ). jakos przypadl mnie do gustu i tak pozostalo ( nie zanosi sie na przesiadke na co innego ). pozdrawiam.

Podsumowanie tematu

LABEL_AI_GENERATED
Stos w mikrokontrolerze 8051 to obszar pamięci wewnętrznej zorganizowany jako struktura LIFO (Last In First Out), służący do tymczasowego przechowywania danych, np. rejestrów czy akumulatora. Operacje push i pop umożliwiają odkładanie i zdejmowanie danych ze stosu, jednak składnia tych rozkazów wymaga adresowania bezpośredniego (push direct, pop direct), gdzie direct to adres w pamięci wewnętrznej (0x00-0x7F) lub przestrzeni rejestrów specjalnych SFR (0x80-0xFF). Nie można bezpośrednio używać rozkazów push/pop z rejestrami R0-R7 bez uwzględnienia aktywnego banku rejestrów, co wymaga znajomości organizacji pamięci i bankowania. Kompilatory assemblera często stosują pseudooperacje i dyrektywy (np. USING) do obsługi banków i generowania poprawnych rozkazów push/pop dla rejestrów. Dyskusja podkreśla, że push/pop nie ogranicza się tylko do akumulatora i rejestru B, lecz obejmuje cały zakres pamięci danych i SFR, choć składnia musi być zgodna z architekturą 8051. Przykładowe listingi kodu pokazują różne formy użycia push/pop, a także różnice w generowanym kodzie przez różne kompilatory assemblera, takie jak ASEM v1.3 czy 8051 Cross-Assembler v1.2k. Linki do materiałów edukacyjnych oraz wyjaśnienia metaforyczne (stos talerzy) pomagają zrozumieć działanie stosu w asemblerze 8051.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA