Zdravim, mam problem s jednym programom, nevie niekto pomoct?
Zadanie: Načítajte z klávesnice reťazec znakov ukončený znakom konca riadku. Slová vo vstupe sú oddelené najmenej jedným znakom medzera. Uvažujte aj prvé, resp. posledné slovo vstupu. Určte počet slov, v ktorých je počet výskytov veľkých písmen dvojnásobkom počtu výskytov malých písmen. Počet vytlačte šestnástkovo.
Su v tom nejake chyby, na vystupe tam zapocivava aj veci ktore nema, napriklad medzery.
; ############################################################
; ##### ZADANIE c.XXX (c) --= Xxxxxxx Xxxxx =-- 2oo9 #####
; ############################################################
; --------------------------------------------------------------------------------------------
.model small
.stack 100h
; --------------------------------------------------------------------------------------------
; --------------------------------------------------------------------------------------------
; ### data ###
.data
str1 DB "Zadaj retazec: ",‘$‘
str2 DB "Pocet vyhovujucich slov je ",‘$‘
str3 DB "(c) --= Xxxxxxx Xxxxx =-- 2oo3",‘$‘
str4 DB "Zadanie c.XXX - Assembler",‘$‘
buffer DB 201 dup(200)
; --------------------------------------------------------------------------------------------
; --------------------------------------------------------------------------------------------
; ### code ###
.code
; --------------------------------------------------------------------------------------------
; ### procedury ###
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## getStr
; # - nacita retazec z klavesnice ukonceny znakom '\n' a ulozi ho do buffera
; -----------------
getStr proc near
mov ah,01h ; vstup z klavesnice
getLoop: int 21h
cmp al,0dh ; testujeme koncovy znak (\n)
je getEnd ; ak bol, tak koniec nacitavania
mov [bx],al ; inak ulozime znak do buffera
inc bx ; BX nastavime na dalsi znak
jmp getLoop ; nacitaj dalsi znak
getEnd: mov byte ptr [bx],‘$‘ ; CR skonvertujem na '$'
ret
getStr endp
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## putStr
; # - vypise retazec na ktory ukazuje BX a je ukonceny znakom '0'
; -----------------
putStr proc near
mov ah,2h ; zobraz znak
nextChar: cmp byte ptr [bx],‘$‘ ; testujeme koncovy znak
je foundEnd ; ak bol, tak koniec
mov dl,[bx] ; inak ho vypiseme
int 21h
inc bx ; BX nastavime na dalsi znak
jmp nextChar ; vypis dalsieho znaku
foundEnd: ret
putStr endp
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## newLine
; # - vypise znak CR a LF (odriadkuje)
; -----------------
newLine proc near
mov ah,02h ; zobraz znak
mov dl,0dh ; CR
int 21h
mov dl,0ah ; LF
int 21h
ret
newLine endp
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## testChar
; # - zisti ci je znak [bx] male/velke pismeno, obsluzi pocitadla znakov
; # CL = pocet malych pismen, CH = pocet velkych pismen
; -----------------
testChar proc near
; +++++++++ rozoznavanie malych/velkych pismen +++++++++
cmp byte ptr [bx],'A' ; kontrolujeme velke pismeno-dolna hranica
jl Tend ; <'A' (nebude to pismeno)
cmp byte ptr [bx],'Z' ; kontrolujeme velke pismeno-horna hranica
jle Tinc1 ; <='Z' (je to velke pismeno)
cmp byte ptr [bx],'a' ; kontrolujeme male pismeno- dolna hranica
jl Tend ; <'a' (nebude to male pismeno)
cmp byte ptr [bx],'z' ; kontrolujeme male pismeno- horna hranica
jle Tinc2 ; <='z' (je to male pismeno)
jmp tend ; >'Z' (nieje to male pismeno)
; +++++++++ pocitanie malych/velkych +++++++++
Tinc1: inc ch ; velke pismeno
jmp tend
Tinc2: inc cl ; male pismeno
jmp tend
Tend: ret
testChar endp
; --------------------------------------------------------------------------------------------
; --------------------------------------------------------------------------------------------
; ### source ###
start:
mov ax,@DATA
mov ds,ax
mov bx,offset str4 ; nazov programu
call putStr
call newLine
call newLine
; +++++++++ vstup od pouzivatela +++++++++
mov bx,offset str1 ; vyzva na zadanie retazca
call putStr
mov bx,offset buffer ; nacitame retazec do 'buffer'
call getStr
call newLine ; odriadkujem
; +++++++++ analyza zadanych udajov +++++++++
mov bx,offset buffer ; prvy znak
mov cx,0 ; znulujeme pocitadla znakov
mov dx,0
push dx ; odlozime DX (pocitadlo vyhovujucich slov)
nextCh: cmp byte ptr [bx],‘$‘ ; testujeme koncovy znak
je space ; ak bol, tak kontrola posledneho slova a koniec
cmp byte ptr [bx],' ' ; testujeme medzeru = zaciatok/koniec slova
je space
call testChar
inc bx ; dalsi znak
jmp nextCh
; +++++++++ zaciatok/koniec slova +++++++++
space: sub ch,cl ; (pocet velkych) - 2*(pocet malych)
sub ch,cl ; ak vyhovuje, vysledok je 0 (CX=0)
cmp ch,0 ; testujeme ci je spravny pocet malych/velkych
jne clWend ; ak nie, tak skok
pop dx ; obnovime pocitadlo spravnych slov
inc dx ; aktualne slovo vyhovovalo
push dx ; odlozime spat
clWend: cmp byte ptr [bx],'$' ; testujeme koncovy znak
je finish ; ak bol, tak konec analyzy slov
mov cx,0 ; znulujeme pocitadlo znakov
inc bx ; dalsi znak
jmp nextCh
; +++++++++ vypisanie vysledku v sestnastkovej sustave +++++++++
finish: mov bx,offset str2 ; vypis o vysledkoch
call putStr
pop dx ; obnovime DX (pocitadlo vyhovujucich slov)
mov dh,dl ; do DH odlozime pocitadlo (DL potrebujeme na vystup)
rol dl,2 ; najvyssi rad
and dl,00000011b
add dl,30h ; prevedieme na ASCII kod
int 21h
mov dl,dh ; stredny rad
ror dl,3
and dl,00000111b
add dl,30h ; prevedieme na ASCII kod
int 21h
mov dl,dh ; najnizsi rad
and dl,00000111b
add dl,30h ; prevedieme na ASCII kod
int 21h
; +++++++++ copyright a koniec programu +++++++++
call newLine
call newLine
mov bx,offset str3 ; vypis copyrightu
call putStr
mov ax,4c00h ; ukoncenie programu (0=koniec bez chyby)
int 21h
end start
; --------------------------------------------------------------------------------------------