caute, mam program v asm 86 ale nepracuje mi spravne, ma nacitat retazec znakov a urcit pocet slov s rovnakym poctom velkych pismen a cislic, nejako mi to blbne a zle pocita, mame uvazovat aj prve aj posledne slovo, dakujem
JUMPS ; toto je direktíva pre podporu dlhých skokov
.MODEL SMALL ; tu som nadefinoval dátový model
.STACK 100H ; tu zasa veľkosť zásobníka
.DATA ; táto oblasť sa nastaví ako dátový segment - obsahuje premenné programu
ZNAK DB 0 ; tu sa uklada nacitany znak
VELKE DW 0
CISLA DW 0
JESLOVO DB 0
POCET DW 0
OZNAM DB "Napiste text a potvrdte ho Enterom:",10,13,"$"
TEXTIK DB 10,13,"Pocet slov s rovnakym poctom cislis a velkych znakov je: $"
.CODE ; kódovy segment - obsahuje všetky inštrukcie
; vypíše v osmickovej sústave obsah registra AX
Vypis PROC
PUSH AX BX DX ; vloží obsahy registrov do zásobníka
MOV DX,AX ; DX <- AX
MOV BX,32768 ; BX <- 32768
SKOK:
MOV AX,DX ; AX <- DX
MOV DX,0 ; DX <- 0
DIV BX ; AX <- DX:AX / BX, DX <- DX:AX MOD BX
PUSH BX ; uloží obsah registra BX do zásobníka
MOV BX,AX ; BX <- AX
MOV AH,02H ; číslo funkcie pre výpis znaku
PUSH DX ; uloží slovo zo zásobníka do registra DX
MOV DL,'0' ; DL <- ASCII kód '0'
ADD DL,BL ; DL <- DL + BL
INT 21H ; vykonanie funkcie
POP DX ; uloží slovo zo zásobníka do registra DX
POP BX ; a BX
PUSH AX DX ; uloží obsahy registrov do zásobníka
MOV DX,0 ; DX <- 0
MOV AX,BX ; AX <- BX
MOV BX,8 ; BX <- 8
DIV BX ; AX <- DX:AX / BX, DX <- DX:AX MOD BX
MOV BX,AX ; BX <- AX
POP DX AX ; uloží slová zo zásobníka do registrov
CMP BX,0 ; porovná BX a 0
JNZ SKOK ; a ak sa nerovnajú skočí na SKOK
POP DX BX AX ; uloží slová zo zásobníka do registrov
RET ; návrat na miesto volania funkcie
ENDP Vypis
; testuje, ci dane slovo splna podmienku
Testuj PROC
PUSH AX
CMP JESLOVO,0
JZ TESTUJ2
MOV AX,CISLA
CMP AX,VELKE
JNZ TESTUJ2
INC POCET
TESTUJ2:
MOV JESLOVO,0
MOV VELKE,0
MOV CISLA,0
POP AX
RET
ENDP Testuj
START:
MOV AX,@DATA ; AX = segment oblasti DATA
MOV DS,AX ; ten som nasledne uložil do DS
MOV AH,09H ; AH = číslo funkcie pre výpis reťazca
MOV DX,OFFSET OZNAM ; DX = offset OZNAM
INT 21H ; vykonanie funkcie
CITANIE:
; nacitam znak z klavesnice do AL
MOV AH,00H
INT 16H
; a ulozim ho do premennej ZNAK
MOV ZNAK,AL
; porovná AL so znakmi konca slova (medzera, koniec riadku)
CMP ZNAK,32
JZ TESTIK
CMP ZNAK,10
JZ KONIEC
CMP ZNAK,13
JZ KONIEC
; ak bol nacitany nevyditelny znak tak sa neberie v uvahu
CMP ZNAK,32
JL CITANIE
MOV AH,02H ; chcem vypisat dany znak
MOV DL,ZNAK ; DL = ASCII hodnota tohto znaku
INT 21H ; vypis znaku
MOV JESLOVO,1
CMP ZNAK,48 ; ak je znak mensi ako znak 0
JL CITANIE ; skoci sa na navestie CITANIE
CMP ZNAK,90 ; ak je znak vacsi ako znak Z
JG CITANIE ; tak je to to iste
CMP ZNAK,58
JL PRIDCIS
CMP ZNAK,64
JG PRIDVEL
JMP CITANIE
PRIDCIS:
INC CISLA
JMP CITANIE
PRIDVEL:
INC VELKE
JMP CITANIE
TESTIK:
MOV AH,02H ; chcem vypisat dany znak
MOV DL,32 ; DL = ASCII hodnota medzery
INT 21H ; vypis znaku
CALL Testuj
JMP CITANIE
KONIEC:
CALL Testuj
MOV AH,09H ; AH = číslo funkcie pre výpis reťazca
MOV DX,OFFSET TEXTIK ; DX = offset TEXTIK
INT 21H ; vykonanie funkcie
MOV AX,POCET
CALL Vypis
MOV AX,4C00H ; AX = číslo funkcie pre ukončenie programu
INT 21H ; vykonanie funkcie
END START