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:
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 - liczba bitów do konwersji
DIGIT - maksymalna liczba cyfr
REGS - liczba rejestrów potrzebnych na dane
MAX - maksymalna wartość liczby wyjściowej
.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 11Powyż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 309485009821345068724781055BIT - liczba bitów do konwersji
DIGIT - maksymalna liczba cyfr
REGS - liczba rejestrów potrzebnych na dane
MAX - maksymalna wartość liczby wyjściowej