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] Konwersja U2 -> IEEE 754

rodzio 09 Cze 2010 20:21 2454 2
REKLAMA
  • #1 8173440
    rodzio
    Poziom 12  
    Treść:
    Cytat:
    Przedstaw kod konwertujący liczbę stałoprzecinkową zapisaną na dwóch rejestrach na liczbę zmiennoprzecinkową zapisaną w kodzie cecha-mantysa. Wykorzystaj assembler procesora AVR AT90USB1287


    Cytat:
    ; R16 - Z|X|X|X|X|X|X|X z - znak X - calośći
    ; R17 - x|x|x|x|x|x|x|x x - po przecinku

    ; R20 - Z|C|C|C|C|C|M|M Z - znak C - cecha M - mantysa
    ; R21 - M|M|M|M|M|M|M|M


    Nie zależy mi na kodzie, bo to sam sobie zrobię, tylko gdyby mógł ktoś przedstawić algorytm działania:)
  • REKLAMA
  • Pomocny post
    #2 8174254
    Dr.Vee
    VIP Zasłużony dla elektroda
    Kod który opisujesz nie jest kodem U2, tylko kodem SM (znak-moduł).

    Jeśli chodzi o konwersję to jest prosta, ale jest kilka szczegółów:
    1) w jakim kodzie jest cecha liczby zmiennoprzecinkowej? W 754 jest to kod z obciążeniem, czyli 0 binarnie = maksymalna wartość ujemna.
    2) Czy masz opuszczać wiodącą 1 w mantysie?

    Konwersja przebiega tak: normalizujesz liczbę do postaci 1.xxxxxxxx * 2^yyy (przesuwasz w prawo lub lewo), odrzucasz 1 (lub nie - patrz wyżej) i używasz xxxxxx jako mantysy. yyy w odpowiednim kodzie to cecha.

    Pozdrawiam,
    Dr.Vee
  • #3 8174358
    rodzio
    Poziom 12  
    Dziękuje zaraz spróbuje coś wyskrobać.

    Co do U2 to x są kolejna 2^-1 2^-2 itd...

    Napisałem, może nie optymalnie ale wydaje się że działa poprawnie, więc zamieszczam:)

    AVR ASM

    Cytat:
    .include "usb1287def.inc"

    ; R16 - Z|X|X|X|X|X|X|X z - znak X - calośći
    ; R17 - x|x|x|x|x|x|x|x x - po przecinku

    ; R20 - Z|C|C|C|C|C|M|M Z - znak C - cecha M - mantysa
    ; R21 - M|M|M|M|M|M|M|M

    ; R1 - pomocniczy, zlicza potege
    ; R18 - pomocniczy by nie tracic koncowki mantysy

    ; wpisanie 00010011 01110101
    LDI R16,$13
    LDI R17,$75

    CLR R1 ; wyzerowanie R1

    SBRS R16,7 ;sprawdzamy znak
    RJMP dalej ;jesli dodatnie to skok
    SBR R20,$80 ;jesli ujemne to ustawiamy bit
    CBR R16,$80

    dalej:
    CPI R16,1 ;sprawdzamy czy jeden
    BREQ koniecl ;jesli Z=1 to koniec

    TST R16 ;sprawdzamy czy zero
    BREQ lewo ;jesli zero to krecimy w lewo

    prawo:
    LSR R18 ;przesuwamy w prawo
    LSR R17 ;przesuwamy w prawo
    BRCC niep ;skok jesli C=0
    SBR R18,$80
    niep:
    LSR R16 ;przesuwamy w prawo
    BRCC next ;skok jesli C=0
    SBR R17,$80
    next:
    INC R1 ;inkr cechy
    CPI R16,1 ;sprawdzamy czy jeden
    BREQ koniecp;skok jesli Z=1
    rjmp prawo ;przesuwamy dalej

    lewo:
    INC R1 ;inkr cechy
    LSL R17 ;przesuwamy w lewo
    BRCS koniecl;skok jesli C=1
    rjmp lewo ;przesuwamy dalej

    koniecp:
    CLR R16 ;zeruj R16
    LSL R18 ;
    ROL R17 ;Przesuwamy wynik, tak by
    ROL R16 ;otrzymac go w formie
    LSL R18 ;przez nas oczekiwanej
    ROL R17 ;
    ROL R16 ;

    RJMP koniec

    koniecl:
    CLR R16 ;zeruj R16
    LSL R17 ;
    ROL R16 ;Odpowiednie przesuwanie
    LSL R17 ;
    ROL R16 ;

    koniec:
    MOV R21,R17 ;wpisanie czesci mantysy do R21
    ADD R20,R16 ;wpisanie z uwzlednieniem znaku
    LSL R1 ;przesuwamy R1 2krotnie
    LSL R1 ;
    ADD R20,R1 ;dodajemy do calosci

    end: RJMP end ;koniec:-)
REKLAMA