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.

8085 - Dodawanie z przeniesieniem na procesorze 8085

madiz08 12 Lis 2013 14:40 2127 15
  • #1 12 Lis 2013 14:40
    madiz08
    Poziom 14  

    Witam
    Na studiach zaczęliśmy początki programowania właśnie na takim procesorze jak w temacie na symulatorze pobranym z http://8085software.tripod.com/8085Setup.zip
    Czy mógłby mi ktoś pomóc z prostą rzeczą ale nie moge sobie poradzić:
    8085 - Dodawanie z przeniesieniem na procesorze 8085
    Dodaję dwie liczby, jeżeli wynik mieści się w 8 bitach to tak jak widać wynik został przeniesiony do komórki pamięci i wynosi 50h
    Ale jak chcę już dodać:
    8085 - Dodawanie z przeniesieniem na procesorze 8085
    to wynik już wychodzi poza 8 bitów, użyłem tu dodawania z przeniesieniem, ale gdzie jest ta jedynka z wyniku 168h. Widać że znacznik przeniesienia jest podświetlony ale jak mogę np. w następnej komórce pamięci umieścić to przeniesienie???

    0 15
  • Pomocny post
    #2 12 Lis 2013 15:06
    BlueDraco
    Specjalista - Mikrokontrolery

    Dodawanie ADD i ADC różni się tylko tym, że ADC uwzględnia przeniesienie wchodzące jako trzeci argument. Jeśli chcesz dodać dwie liczby 16-bitowe, to najpierw dodajesz mniej znaczące bajty używając ADD, a następnie dodajesz bardziej znaczące bajty używając ADC. Twój pierwszy program - to pierwsza połówka tego, co masz zrobić. Drugi - to błędna wersja tej samej połówki - tak jak ten drugi ma wyglądać druga połówka. :)

    0
  • Pomocny post
    #3 12 Lis 2013 15:30
    voytaschec
    Poziom 24  

    Nigdzie nie znajdziesz tego przeniesienia poza właśnie flagą CY. To jest procesor 8-bitowy i tylko takie operacje wykonuje. Jeśli chcesz dodawać liczby większe lub chcesz mieć wynik 9-bitowy po dodaniu dwóch 8-bitowych to ten najwyższy bit musisz zapisać "ręcznie".
    Np.: po dodawaniu ADD (patrz uwaga kol. BlueDraco) wykonujesz skok warunkowy "skocz jeśli flaga CY nie jest ustawiona" (JNC) na koniec swojej procedury, a jeśli flaga CY jest ustawiona to do adresu 3001 wpisujesz "1". Dobrze by było na początku wyczyścić komórkę 3001. To tylko przykład, można to zrobić na wiele innych sposobów.

    0
  • #4 12 Lis 2013 20:25
    madiz08
    Poziom 14  

    8085 - Dodawanie z przeniesieniem na procesorze 8085
    Aha czyli ADC to dodaj przeniesienie, dzięki panowie. Czy w takim razie taki zapis programu jest prawidłowy?
    A jeszcze chciałbym zapytać bo nie mogę znaleźć, stos jest 16-bitowy. Jaka komenda pozwala na "umieść zawartość rejestru na stosie" ???

    0
  • #5 12 Lis 2013 20:40
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie komenda, a instrukcja - "wrzuć na stos" oczywiście. Wystarczy zajrzeć do listy instrukcji procesora.

    0
  • #6 12 Lis 2013 22:16
    madiz08
    Poziom 14  

    Pobrałem pełną listę rozkazów, już wiem jak umieścić parę rejestrów na stosie, a tu poniżej użyłem "instrukcji :)" wykonania skoku jak podpowiedział mi voytaschec
    MVI A 44h
    MVI B 06h
    ADD B
    LXI H 3000h
    MOV M A
    JC SKOK
    HLT
    SKOK: MVI A 00h
    ADC A
    INX H
    MOV M A
    INX H
    RC

    i na podstawie listy rozkazów na końcu podprogramu SKOK użyłem instrukcji RC, czy to znaczy że program skoczy linijkę niżej niż przed skokiem, czyli w tym przypadku się zakończy?

    Ostatnim zadaniem na ćwiczeniach było dodanie dwóch liczb trzy-bajtowych, spróbuję jutro sam to zrobić, jeżeli mi się nie uda, poprosiłbym o pomoc.
    Pozdrawiam

    0
  • #7 12 Lis 2013 22:20
    BlueDraco
    Specjalista - Mikrokontrolery

    Zwróć uwagę, że bez tego skoku kod działa poprawnie, a ze skokiem - niepoprawnie, bo w pamięci w drugim bajcie po dodawaniu zostaną śmieci. Voytaschec posadził Cię na minę - tak się NIE robi dodawania z przeniesieniem.

    Program nigdy się nie "kończy", chyba, że zrobisz HLT przy zablokowanych przerwaniach. Rc wróci dokądś, tylko zupełnie nie wiadomo, dokąd.

    0
  • #8 12 Lis 2013 22:50
    voytaschec
    Poziom 24  

    Nie do końca zrozumiałeś to co chciałem przedstawić.
    Zapisanie najstarszego bitu chciałem zrobić mniej więcej tak:
    "dodaj liczby a i b"
    "zapisz wynik pod adresem 3000"
    "wyzeruj komórkę pod adresem 3001"
    "jeśli nie było przeniesienia to skocz (JNC) do <skok>"
    "ustaw jedynkę pod adresem 3001"
    skok:
    koniec procedury

    Skoki "jump" nie zostawiają śladu, czyli po takim skoku nie można powrócić. Ślad (na stosie) zostawiają skoki "call".
    Oczywiście dużo bardziej elegancko wygląda procedura, którą napisałeś 4 posty wyżej. Jest ona już kompletna i nie trzeba dodawać do niej skoków (chyba, że powrót do głównego programu RET).

    Najszybsze zerowanie akumulatora to XRA A.

    0
  • #9 13 Lis 2013 09:44
    madiz08
    Poziom 14  

    8085 - Dodawanie z przeniesieniem na procesorze 8085
    Czy o takie coś chodziło? Poprzednio po zamianie liczb w rejestrach na takie gdzie ich suma mieściła sie w jednym bajcie, to i tak jedynka pod adresem 3001 zostawała jako "śmieć", teraz jak dodam np 3+5 to pod adresem 3001 mam czysto.
    Nie zadziałała komenda XRA A, dlatego wpisałem MVI a 00h

    0
  • #10 13 Lis 2013 10:14
    BlueDraco
    Specjalista - Mikrokontrolery

    A po co ten skok? Poprzednie rozwiązanie, które pokazałeó - to z dosumowaniem przeniesienia do zera i zapisaniem do pamięci wyniku tego sumowania było znacznie elegantsze i szybsze.

    0
  • Pomocny post
    #11 13 Lis 2013 11:11
    voytaschec
    Poziom 24  

    Ech, coś głupiego człowiek napisze dla przykładu, a młody umysł tak szybko to chłonie... :(
    Zostaw już to dodawanie, naprawdę bardzo fajnie zrobiłeś to z dodatkowym dodawaniem samego przeniesienia.
    Jeśli chcesz poćwiczyć skoki ze śladem i bez śladu to spróbuj napisać np. sortowanie bąbelkowe jakiegoś obszaru pamięci (trochę trudniejsze).

    0
  • #12 13 Lis 2013 12:06
    madiz08
    Poziom 14  

    Dobrze w takim razie skoki zostawiam do momentu aż będą na następnej laborce. Ostatnia moja prośba dotyczy sprawdzenia ostatniego zadania z ćwiczeń:
    napisz program dodający dwie liczby 24-bitowe 7C6AFD + FF3B7D zapisane w pamięci
    8085 - Dodawanie z przeniesieniem na procesorze 8085
    Już bez skoków, wynik się zgadza, ale czy program jest dobrze napisany? (chodzi mi najprościej i najkrócej jak się da)
    Poza tym z resztą jestem na bieżąco, jeżeli z następnych ćwiczeń miałbym problem pozwolę sobie zapytac w tym temacie, a na razie
    PODZIĘKOWAŁ ZA POMOC :)

    0
  • #13 13 Lis 2013 13:12
    BlueDraco
    Specjalista - Mikrokontrolery

    Program jest źle napisany, bo:
    - powinien używać dwóch albo trzech rejestrów adresowych do adresowania dwóch argumentów - po jednokrotnym załadowaniu wystarczy je potem inkrementować.
    - bezsensownie dodaje przeniesienie do zera, zamiast po prostu uwzględniać je przy sumowaniu drugiego i trzeciego bajtu.

    0
  • Pomocny post
    #14 13 Lis 2013 22:26
    kspro
    Poziom 27  

    Tak to powinno wyglądać:

    Code:

            LXI   H,NUM1  ;Adres pierwszej liczby i jednoczesnie wyniku
            LXI   D,NUM2  ;Adres drugiej liczby
            CALL  ADD3B
            ...

    ADD3B:  LDAX  D       ;Dodawanie liczb 3-bajtowych (HL) := (HL) + (DE)
            ADD   M
            MOV   M,A
            INX   H
            INX   D
            LDAX  D
            ADC   M
            MOV   M,A
            INX   H
            INX   D
            LDAX  D
            ADC   M
            MOV   M,A
            RET

    NUM1:   DB    0FDH, 6AH, 7CH
    NUM2:   DB    7DH, 3BH, 0FFH

    Mam nadzieję, że nie zrobiłem pomyłek w mnemonikach 8085, bo normalnie używałem rozkazów Z80 i nie jestem przyzwyczajony.

    0
  • #15 14 Lis 2013 09:03
    madiz08
    Poziom 14  

    Ja wczoraj posiedziałem przy tej liście rozkazów i najkrócej jak potrafiłem z celowym wykorzystaniem umieszczenia danych w odpowiednich komórkach adresów aby rejestr C się wyzerował, to wygląda to tak:
    LXI H 2FFAh
    LXI B 2FFDh
    LXI D 3000h

    TRZYBIT: LDAX B
    ADC M
    STAX D
    INX B
    INX D
    INX H
    DCR C
    INR C
    JNZ TRZYBIT

    0
  • #16 15 Lis 2013 04:03
    kspro
    Poziom 27  

    To jest zły pomysł, bo taka procedura czy pętla jest praktycznie nieprzydatna - można jej używać tylko wtedy gdy adres jednej zmiennej równa się 0XXFDH, co jest bez sensu. Przy takim założeniu równie dobrze można by rozkazy INX B oraz DCR C wyrzucić i zostawić tylko INR C - wyszłoby na to samo. Nie ma tu dobrego rozwiązania, po prostu w mikroprocesorze 8085 brakuje rejestrów żeby pociągnąć jednocześnie trzy adresy i jeszcze licznik bajtów bez przechowywania czegoś na stosie. Udałoby się za to zrobić pętlę używającą tylko dwóch adresów, tak jak ja to zrobiłem w swoim rozwiązaniu powyżej. I jeszcze jedno: skoro jest już pętla tylko z rozkazem ADC M, to przed jej początkiem (przed etykietą TRZYBIT) musi być jakiś rozkaz zerujący flagę C (Carry), np. OR A, tak żeby pierwsze dodawanie było z C=0.

    0