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

[asm AVR] Dzielenie na 56 bitach

Szycha082 03 Maj 2011 14:41 1747 6
REKLAMA
  • #1 9464977
    Szycha082
    Poziom 11  
    Witam, znalazłem w sieci taki oto program,
    Cytat:

    .def dv0 =r0
    .def dv1 =r1
    .def dv2 =r2
    .def dv3 =r3
    .def dv4 =r4
    .def dv5 =r5
    .def dv6 =r6

    .def dd0 =r7
    .def dd1 =r8
    .def dd2 =r9
    .def dd3 =r10
    .def dd4 =r11
    .def dd5 =r12
    .def dd6 =r13

    .def dr0 =r14
    .def dr1 =r15
    .def dr2 =r16
    .def dr3 =r17
    .def dr4 =r18
    .def dr5 =r19
    .def dr6 =r20

    .def counter =r24
    ;=============================================================
    ;56 bit divide routine
    ;=============================================================

    div56: clr dr1
    clr dr2
    clr dr3
    clr dr4
    clr dr5
    clr dr6

    ldi counter,57 ;init loop counter, # bits to be divided +1
    sub dr0,dr0 ;clears registers and carry bit

    d56_1: rol dd0 ;shift left dividend
    rol dd1
    rol dd2
    rol dd3
    rol dd4
    rol dd5
    rol dd6
    dec counter ;decrement counter
    brne d56_2 ;if done
    ret ;return

    d56_2: rol dr0 ;shift dividend into remainder
    rol dr1
    rol dr2
    rol dr3
    rol dr4
    rol dr5
    rol dr6

    sub dr0,dv0 ;remainder = remainder - divisor
    sbc dr1,dv1 ;
    sbc dr2,dv2
    sbc dr3,dv3
    sbc dr4,dv4
    sbc dr5,dv5
    sbc dr6,dv6

    brcc d56_3 ;if result negative
    add dr0,dv0 ;restore remainder
    adc dr1,dv1
    adc dr2,dv2
    adc dr3,dv3
    adc dr4,dv4
    adc dr5,dv5
    adc dr6,dv6

    clc ; clear carry to be shifted into result
    rjmp d56_1 ;else
    d56_3: sec ; set carry to be shifted into result
    rjmp d56_1


    nie umiem jednak z niego skorzystać.
    Prosił bym o wytłumaczenie mi w których rejestrach jest dzielna, dzielnik oraz jak odczytać wynik.
    Pozdrawiam.
  • REKLAMA
  • #2 9467851
    Szumlus
    Poziom 17  
    Witam,

    Według mnie kolejność operandów jest następująca:
    dv-dzielna, dd-dzielnik, dr-wynik.
    Polecam ponadto za symulować program w AVR Studio i poczytać o dzieleniu metodą kolejnych odejmowań - to na pewno pomoże koledze zrozumieć powyższy program.

    Pozdrawiam,
    Marcin
  • REKLAMA
  • #3 9468112
    Szycha082
    Poziom 11  
    Doszedłem już do tego,że:
    dd-dzielna, dv-dzielnik
    dd-wynik, dr-reszta z dzielenia.
    Było by już prawie ok gdybym wiedział jak odczytać tą reszte z dzielenia.
    Bo gdy normalnie dzieląc np. 21/2=10,5 tu wynik wynosi 10 reszty 1.
  • #4 9468773
    tmf
    VIP Zasłużony dla elektroda
    A czego się spodziewasz po dzieleniu liczb całkowitych? Algorytm działający na floatach jest dalece bardziej skomplikowany. Możesz się posiłkować mnożąc resztę z dzielenia przez stałą, np. 10, 100, 1000 itd i ponownie dzieląc, uzyskasz wtedy kolejne cyfry po przecinku. W ten sposób odkryjesz arytmetykę stałopozycyjną.
  • REKLAMA
  • REKLAMA
  • #6 9469527
    Szycha082
    Poziom 11  
    Chyba zacznę coś myśleć o C ale ten program już jak zacząłem w ASM to dociągnę go już do końca zwłaszcza, że zostało mi tylko odczytać wynik właśnie tego nieszczęsnego dzielenia a dokładność poprzecinkowa jest niezbędna. Dlatego jeśli macie jakieś materiały jak to zrobić to będę bardzo wdzięczny.
  • #7 9469857
    tmf
    VIP Zasłużony dla elektroda
    No już ci napisałem - arytmetyka stałopozycyjna. 21/2=10r1. 1*10/2=5 - masz pierwszą cyfrę po przecinku. Możesz zrobić r*100 albo 1000. Jak z tego wyjdzie reszta to mnożysz dalej i dzielisz otrzymując kolejne miejsca dziesiętne lub binarne.
REKLAMA