Ahojte potrebujem pomôcť .
potrebuje aby vystup bol desiatkovo.
ak niekto vie pls pomôžte potrebujem surne
Kód:
org 1000
start: dcx sp ; inicializacia zasobnika (0FFFFh)
lxi h,text1 ; do HL adresa textu text1-uvodny
call print ; vypis text1
st1: lxi h,txt2 ; do HL adresa textu txt2-Vloz text...
call print ; vypis txt2
lxi d,text ; nacita adresu navestia text do DE - buffer
call getline ; nacita riadok z klavesnice na adresu DE
call tstline ; test vstupu, ci bol vobec zadany
mov a,b ; do A uloz B pocet znakov bez SPACE
cpi 0 ; Nula zadaych znakov?
jnz pokr ; nie, mozem pokracovat v programe
lxi h,chyba ; ano, zle zadany vstup
call print ; vypise CHYBU na obrazovku
jmp st1 ; opakuj nacitavanie
pokr: call osem ; volaj podprogram osem
lxi h,text4 ; do HL adresa textu4-Pocet osmickovych...
call print ; vypise text4 na obrazovku
call vypis ; volaj vypis / vstup je v reg.B-pocet
end: hlt ; zastavi CPU
tstline: lxi d,text ; do DE adresa buffra
mvi b,0 ; nuluj pocitadlo B
cykl2: ldax d ; do A uloz ASCII kod znaku
cpi 32 ; SPACE?
jz preskoc ; ano, preskoc
cpi 10 ; LF?
jz konci ; ano, koniec
cpi 13 ; CR?
jz konci ; ano, koniec
inr b ; zvys B+1, bol to znak
preskoc: inx d ; zvys DE+1, dalsi znak
jmp cykl2 ; opakuj testovanie, kym nie je LF+CR
konci: ret ; navrat
vypis: mov a,b
adi '0' ; hodnota a jej ASCII tvar ...
call putchar
call newline
hlt
osem: lxi d,text ; uloz do DE adresu nacitaneho textu
mvi b,0 ; vynuluj pocitadlo B, pocet osmickovych cisiel
mvi c,0 ; vynuluj pocitadlo pozicie znaku C
citam: ldax d ; do A uloz ASCII kod znaku z adresy v DE
inr c ; zvys pocitadlo pozicie znaku
cpi 10 ; LF?
jz koniec ; ano, koniec nacitaneho riadku
cpi 13 ; CR?
jz koniec ; ano, koniec nacitaneho riadku
cpi 38h ; >7 ?
jnc dalsi ; ano, dalsi znak
cpi 20h ; MEDZERA ?
jz space ; ano, skok na podmienky medzery
; ak nie, pokracuj navestim nula:
nula: cpi 30h ; porovnaj, ci je znakom nula
jnz dalsi ; ak nie je, skoc na dalsi znak
mov a,c ; ak je nula, porovnaj s poziciou
cpi 1 ; ci je na prvej
jnz dalsi ; ak nie j prva nula, skoc na dalsi znak
opakuj: inx d ; zvys DE+1 - dalsi znak
inr c ; zvys poziciu znaku
ldax d ; do A uloz ASCII kod znaku
cpi 38h ; >7 ? (v ASCII kode)
jnc dalsi ; ano, dalsi znak, ak nie, pokracuj testovanim
cpi 58h ; je dalsim znakom X? (hex cislo v ASCII vstupe)
jz dalsi ; ak je, skoc na nacitanie dalsieho znaku
cpi 'x' ; je dalsim znakom x? (hex cislo v ASCII vstupe)
jz dalsi ; ak je, skoc na nacitanie dalsieho znaku
cpi 10 ; LF?
jz pocet1 ; skok na pocet, B+1
cpi 13 ; CR ?
jz pocet1 ; skok na pocet, B+1
cpi 30h ; dalsia 0?
jz dalsi ; Ano, je to potom binary cislo, skoc na dalsi
cpi 20h ; SPACE ?
jz pocet ; ano, skok na pocet, B+1
jmp opakuj ; ak nie, cyklus opakuj kym nie je medzera
pocet: inr b ; predpoklad osmickoveho cisla, b+1
jmp space ; skok na nacitanie dalsieho znaku po SPACE
pocet1: inr b ; predpoklad osmickoveho cisla, b+1
jmp koniec ; skok na koniec
dalsi: inx d ; zvys DE
jmp citam ; skok na nacitanie znaku z HL
space: mvi c,0 ; ak bola znakom medzera, nuluj
jmp dalsi ; citaj dalsi znak
koniec: ret
print: mov a, m ; nacitanie znaku z pamate
inx h ; posunutie ukazovatela
cpi 0 ; je znak 0 ?
rz ; ak ano, navrat z podprogramu
out 11h ; inak vypis znaku
jmp print ; a opakovanie cinnosti
text1: db 'Pocet osmickovych cislic vo vstupe.',10,13,0
text: ds 255 ; tu sa ulozi nacitany text (buffer)
txt2: db 'Vloz text (max.255 znakov vratane medzier): ',10,13,0
text4: db 10,13,'Pocet osmickovych cisel je: ',0
text5: db 10,13,'Bolo zadanych prave 255 znakov! ',10,13,0 ; chybova hlaska1
chyba: db 10,13,'Bol zadany prazdny vstup alebo len medzery! ',10,13,0 ; chybova hlaska2
include 'examples\8080\include\getline.inc'
include 'examples\8080\include\putstr.inc'
include 'examples\8080\include\putchar.inc'
include 'examples\8080\include\getchar.inc'
include 'examples\8080\include\newline.inc'