Assembler, převod hexa čísla do dekadického

zdravím, sem tu nový tak se omlouvám jestli to tu už někde je nebo to mám špatně umístěné,

Chci se zeptat jestli už někdo řešil převod čísel z hexa do decimálu, já se o to pokouším ale furt na to nemohu přijít, moje představa je že třeba v R20 mam číslo 0xFF a to převedu takže v registru R21 bude 0x02 a v R22 0x55, takto převedené číslo už jde jednoduše zobrazit na LCD nebo 7segmentovce, nebo se to řeší jinak ?? tak jestli tento problém někdo řešil v asembleru ať prosím poradí, v Cčku by to bylo jednoduší ale umím C++ a to jenom programy pro PC. Děkuji za rady

Cisla v tvare 0x02 a 0x55 sa v ziadnom pripade nezobrazia na display o nic jednoduchsie, ako 0xFF. Cislo sa normalne pomocou delenia rozlozi na stovky, desiatky a jednotky. Teda do troch samostatnych bajtov.

stovky = cislo/100;
cislo = cislo - (100 * stovky);
desiatky = cislo /10;
jednotky = cislo - (10 * jednotky);

Mozno su na to aj nejake asemblerovske instrukcie, ale islo mi o nazorne predvedenie vypoctu.

Potom sa na kazdy bajt postvu prislusne transformacie (napriklad prevod cisla na ASCII, alebo cez transformacnu tabulku pre rozsvietenie jednotlivych segmentov sedemsegmentovky z zavislosti od navrhu plosneo spoja). A tak mozu vzniknut ine tri bajty a az tie sa potom poslu do displaya.

to cos napsal je v céčku, a já umím jenom assembler, kdyby assembler uměl dělit a násobit tak to vůbec neřeším, proto potřebuju nějakej nápad jak to jde udělat jenom základníma operacema jako + - apod. zatím sem to vyřešil tak že prostě tu hodnotu postupně porovnávám s konstantou a podle toho to přeskočí a nastaví do registru, to se mi ale nelíbí protože je to dlouhý a tudíž trvá to delší dobu ten převod

;************************************************************************** ; Prevod Hex 8bit na DEC T3,T2,T1 ;************************************************************************** HexDec banksel TMP0 movwf TMP0 clrf TMP1 banksel T1 CLRF T1 CLRF T2 Rad100 MOVLW .100 SUBWF TMP0,W ;TMP0-100 MOVWF TMP2 BTFSC STATUS,C ;zaporne? GOTO Uloz ;NE MOVLW .1 SUBWF TMP1,W ;TMP1-1 BTFSS STATUS,C ;kladne? GOTO Rad10 ;NE MOVWF TMP1 MOVF TMP2,W Uloz MOVWF TMP0 INCF T2,F ;+1 GOTO Rad100 Rad10 MOVLW .10 SUBWF TMP0,W ;TMP0-10 BTFSS STATUS,C ;kladne? GOTO End10 ;NE MOVWF TMP0 INCF T1,F ;+1 GOTO Rad10 End10 MOVF TMP0,W MOVWF T0 ;T0,1,2=vysledna hodnota return ;******************************************************

AVR asembler urcite vie nasobit minimalne dve bezznamienkove 8b cisla. Ma predsa v sebe HW nasobicku, tak nemut vodu :slight_smile:

Na delenie v asm je vnodne pozriet AVR200.pdf

atmel.com/Images/doc0936.pdf

V dokumente je aj odkaz na prislusne asm. Ich nazvy daj do googla.

[code].def fbin =r19 ;8-bit binary value
.def BCDh =r17 ;BCD result hundreds
.def BCDt =r18 ;BCD result tens
.def BCDu =r19 ;BCD result units

bin_bcd8:
clr BCDt
bBCD8_1:
subi fbin,10
brcs bBCD8_2
inc BCDt
rjmp bBCD8_1
bBCD8_2:
subi fbin,-10
clr BCDh
bBCD8_3:
subi BCDt,10
brcs bBCD8_4
inc BCDh
rjmp bBCD8_3
bBCD8_4:
subi BCDt,-10

ret
[/code]

Přeloženo, vyzkoušeno v AVR Studiu.

.dseg
Stovky: .byte 1			; V RAM definovat 1 byte pro stovky
Desitky: .byte 1		; V RAM definovat 1 byte pro desitky
Jednotky: .byte 1		; V RAM definovat 1 byte pro jednotky

.cseg
.def Temp=R16   		; Pomocná registrová proměnná
.def Cislo=R17			; Převáděné číslo

    ldi Cislo, 0xFE		; Pro příklad převedeme 0xFE na 254

Prevod:
    ldi Temp, 0			; Vynulovat počítadlo
Hledame_100:
    cpi Cislo, 100		; Je převáděná proměnná menší, než 100 ?
    brlo Mame_100		; Ano = spočítali jsme stovky
    subi Cislo, 100		; Ne = Odečíst 100
    inc Temp			; Zvětšit počítadlo
    rjmp Hledame_100	; A znova
Mame_100:
    sts Stovky, Temp	; Uložit počítadlo do RAM na pozici Stovky
    ldi Temp, 0			; Vynulovat počítadlo
Hledame_10:
    cpi Cislo, 10		; Je převáděná proměnná menší, než 10 ?
    brlo Mame_10		; Ano = spočítali jsme desítky
    subi Cislo, 10		; Ne = Odečíst 10
    inc Temp			; Zvětšit počítadlo
    rjmp Hledame_10		; A znova
Mame_10:
	sts Desitky, Temp	; Uložit počítadlo do RAM na pozici Desítky
	sts Jednotky, Cislo	; Uložit zbytek do RAM na pozici Jednotky
	ret					; Hotovo - návrat

díkes přesně tohle sem potřeboval, takhle sem to dělal ale jaksi mi to nechodilo a už vím proč :smiley:

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.