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

[Asembler] Jak napisać sumator 16-bitowy w asemblerze 8051 z użyciem rejestrów i pamięci?

Miaojao 09 Mar 2010 10:18 3288 9
REKLAMA
  • #1 7804315
    Miaojao
    Poziom 9  
    Posty: 39
    Ocena: 3
    Witam.

    Czy ktoś ma pomysł jak napisać a assemblerze 8051 sumator 16 bitowy?

    Mam takie zadanie że muszę to zrobić przy użyciu rejestrów i drugi wariant przy użyciu pamięci.

    Tylko za bardzo nie wiem jak ponieważ wszystko co jest w tym mikroprocku ma po 8 bitów...
  • REKLAMA
  • #2 7804361
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 7804376
    Miaojao
    Poziom 9  
    Posty: 39
    Ocena: 3
    Prawda.
    Czyli co muszę dodawać po dwa bajty i jeżeli przy dodawaniu tych bajtów otrzymam przeniesienie to muszę to przeniesienie przenieść (dodać) do kolejnych dwóch bajtów które sumuje?
  • #4 7804380
    Konto nie istnieje
    Konto nie istnieje  
  • #5 7807101
    Miaojao
    Poziom 9  
    Posty: 39
    Ocena: 3
    Dobra, pisałem tego sumatora chyba z 2 godziny i muszę przyznać że jakoś dziwnie skomplikowany mi wyszedł.

    Kod prezentuje się tak:
    org 0
    mov a,#0

    start:

    mov r7,#0
    mov r6,#0
    mov r5,#0

    mov r0, #0ffh
    mov r1, #0ffh ; to jest pierwsza liczba r0r1


    mov r2, #0fdh
    mov r3, #0fdh ; a to druga liczba r2r3


    add a,r1
    add a,r3
    mov r7,a
    mov a,#000h

    ;przeniesienie?
    addc a,#000h
    mov r6,a

    ;dodawanie kolejnych bajtow
    mov a,#0
    add a,r0
    add a,r2
    jc przeniesienie

    add a,r6
    jc przeniesienie
    mov r6,a

    clr a
    przeniesienie:
    jz stop
    mov r5,#1
    add a,r6
    mov r6,a

    stop:
    ljmp stop

    end


    Końcowy wynik umieszczony jest w rejestrach r5r6r7, przy czym w r5 jest albo 00 albo 01 czyli bit z przeniesienia.
    Czy nie da się tego jakoś prościej zrobić? Wiem że w programowaniu najważniejsza jest prostota... a to jest bardzo zawiłe jak na głupie dodawanie dwóch liczb.
  • #6 7807778
    kemot55
    Poziom 31  
    Posty: 1306
    Pomógł: 184
    Ocena: 147
    Dodawanie to pewnie lepiej zrobić tak:
    założenie: R1,R3,R7 młodsze, 8-bitowe rejestry liczb 16-bitowych,

    
    mov a,R1
    add  a,R3
    mov R7,a
    mov a,R0
    addc a,R2
    mov a,R6
    


    Wynikowe przeniesienie jest zawarte w znaczniku C. Jeżeli bardzo chcesz to przenosić do rejestrów to możesz, ale po co?
    I na koniec głupie pytanie: nie używasz jakiegoś symulatora? Chyba było by Ci łatwiej zrozumieć pewne operacje.
    Teraz napisz to samo "z użyciem" pamięci.
  • REKLAMA
  • #7 7807963
    Miaojao
    Poziom 9  
    Posty: 39
    Ocena: 3
    Tak oczywiście że używam symulatora.

    A co do twojego kodu... w r7 jest suma dwóch młodszych bajtów ale w przypadku przeniesienia do r6 powinna zostać wstawiona jedynka a tutaj tego niema. Podobnie przy dodawaniu starszych bajtów.

    Przecież przeniesienie trzeba uwzględnić i wstawić do rejestru bo jak nie to przy następnej operacji dodawania bit carry się wyzeruje i stracimy informację... czy może się mylę?
  • REKLAMA
  • #8 7807980
    Konto nie istnieje
    Poziom 1  
  • #9 7808052
    Miaojao
    Poziom 9  
    Posty: 39
    Ocena: 3
    Nie no kod genialny a ja dźgałem tyle linijek i głowiłem się przez 2 godziny. dzięki.
  • #10 7808174
    kemot55
    Poziom 31  
    Posty: 1306
    Pomógł: 184
    Ocena: 147
    Jeszcze tylko jedna uwaga co do
    Cytat:
    Przecież przeniesienie trzeba uwzględnić i wstawić do rejestru bo jak nie to przy następnej operacji dodawania bit carry się wyzeruje i stracimy informację... czy może się mylę?

    Masz rację. Przeniesienie trzeba pamiętać o ile gdzieś dalej (daleko dalej :-)) będziemy robić operacje na wyniku, ale rezerwowanie do tego celu rejestru nie jest dobrym rozwiązaniem. W ogóle to lepiej użyć do tego celu np. pamięci adresowanej bitowo a wyniki przechowywać w RAM'ie poza obszarem rejestrów.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono temat implementacji 16-bitowego sumatora w asemblerze dla mikroprocesora 8051, z wykorzystaniem rejestrów oraz pamięci. Użytkownik zadał pytanie dotyczące sposobu dodawania dwóch 8-bitowych liczb, co w efekcie daje jedną 16-bitową sumę. Odpowiedzi wskazują, że należy dodawać bajty po dwa, uwzględniając przeniesienie (carry) do kolejnych bajtów. Użytkownicy dzielili się kodem, który realizuje tę funkcjonalność, oraz omawiali kwestie związane z przechowywaniem przeniesienia w rejestrach lub pamięci. Zwrócono uwagę na to, że przeniesienie powinno być uwzględnione w dalszych operacjach, a lepszym rozwiązaniem może być użycie pamięci adresowanej bitowo do przechowywania wyników.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA