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 32-bit do systemu dziesiętnego ASCIIZ

RomanWorkshop 14 Lip 2013 23:05 1506 0
REKLAMA
  • #1 12522960
    RomanWorkshop
    Poziom 13  
    Szukając w internecie znalazłem tylko procedury konwersji 32-bitów do systemu BCD (wynik trzeba zamienić na liczby ASCII). Miałem procedurę bezpośredniej konwersji na DEC-ASCIIZ, ale dla procesora 6502. Udało mi się ją przełożyć na asembler AVR:

    .include "m168def.inc"
    
    ;Pamięć FLASH
    .cseg
    .org     $0000
    
    ;Inicjalizacja procedury konwersji
             ldi     ZL, LOW(sbuf)
             ldi     ZH, HIGH(sbuf)
             adiw    ZL, 10          ;maksymalna liczba cyfr (DIGIT)
             ldi     R19, $FF
             ldi     R20, $FF
             ldi     R21, $FF
             ldi     R22, $FF
             rcall   Con32D
    Loop:    rjmp    Loop
    
    ;Konwersja 32-bitów do systemu dziesiętnego ASCIIZ: [R19:R20:R21:R22] => "DEC-ASCIIZ"
    Con32D:  clr     R16
             st      Z, R16
             ldi     R17, 10         ;maksymalna liczba cyfr (DIGIT)
    Con32D0: ldi     R18, 32         ;liczba bitów do konwersji (BIT)
             clr     R16
             clc
    Con32D1: rol     R16
             cpi     R16, $0A
             brcs    Con32D2
             subi    R16, $0A
             sec
             rjmp    Con32D3
    Con32D2: clc
    Con32D3: rol     R22             ;najmłodszy bajt do konwersji
             rol     R21
             rol     R20
             rol     R19             ;najstarszy bajt do konwersji
             dec     R18
             brpl    Con32D1
             subi    R16, $D0
             st      -Z, R16         ;wyjście danych
             dec     R17
             brne    Con32D0
             ret
    
    ;Pamięć SRAM
    .dseg
    .org     $0100
    sbuf:    .byte   11

    Powyższa procedura konwertuje 32-bity (lub więcej albo mniej) do systemu dziesiętnego ASCIIZ. Wynikiem jest 10-cyfrowa liczba ASCIIZ (zawiera nieznaczące zera), zapisana w pamięci SRAM mikrokontrolera. Zapis odbywa się "od tyłu", dlatego początkowy adres w rejestrze "Z" jest zwiększony o 10. Zarówno mały rozmiar, jak i szybkość działania tej procedury (maks. 4186 cykli przy konwersji $FFFFFFFF), są wystarczające do większości zastosowań.

    Jednak najlepsze jest to, że można dowolnie dostosować liczbę konwertowanych bitów (np. 48). Maksymalna ich liczba jest ograniczona tylko dostępnymi rejestrami (ale i to można ominąć). Poniżej znajduje się tabelka z wartościami, które należy zmienić w kodzie procedury, aby uzyskać konwersję dowolnej liczby bitów.

    BIT  DIGIT  REGS  MAX
     8     3     1    255
    16     5     2    65535
    24     8     3    16777215
    32    10     4    4294967295
    40    13     5    1099511627775
    48    15     6    281474976710655
    56    17     7    72057594037927935
    64    20     8    18446744073709551615
    
    Kalkulator Windows XP już tego nie liczy :)
    
    72    22     9    4722366482869645213695
    80    25    10    1208925819614629174706175
    88    27    11    309485009821345068724781055

    BIT - liczba bitów do konwersji
    DIGIT - maksymalna liczba cyfr
    REGS - liczba rejestrów potrzebnych na dane
    MAX - maksymalna wartość liczby wyjściowej
  • REKLAMA
REKLAMA