pomoc s tasm
pomoc s tasm
zdravim mam problem so zadanim ...vypisuje mi toto
//audiotrack: čítaj pravidla v časti programovanie. Obrázky sa dávajú do príloh, zdrojáky do code tagov
//audiotrack: čítaj pravidla v časti programovanie. Obrázky sa dávajú do príloh, zdrojáky do code tagov
no to tam mam...proste takto vyzera kod
a nefacha mi to...nechapem preco ne...
Kód: Vybrať všetko
MODEL SMALL
.STACK 100H
.DATA
retazec DB "Zadaj retazec : ",10,13,"$"
pocet_slov DB "Pocet vyhovujucich slov : $"
operatori DW 0
male_znaky DW 0
vyh_slovo DB 0
.CODE
START:
mov AX,@DATA
mov DS,AX
mov AH,09H
mov DX,OFFSET retazec
mov ah,0Ah
int 21H
mov bx, offset retazec
xor cx, cx
mov cl, byte ptr[bx+1]
mov si, bx
add si, 2
MAIN:
cmp [bx+si], 20h ; medzera = nove slovo
je KONTROLA
cmp [bx+si], 61h ; kontrola, ci sa jedna o male pismeno
jl OPERATOR
cmp [bx+si], 7Ah
jg OPERATOR
inc male_znaky
jmp DALSI_ZNAK
OPERATOR:
cmp [bx+si], 2Ah ; kontrola, ci sa jedna o operator
jl DALSI_ZNAK
cmp [bx+si], 2Fh
jg DALSI_ZNAK
inc operatori
jmp DALSI_ZNAK
KONTROLA:
call SKONTROLUJ
DALSI_ZNAK:
inc si
loop START
call SKONTROLUJ
KONIEC:
mov AH,09H
mov DX,OFFSET pocet_slov
int 21H
mov ax, 4C00h
int 21h
SKONTROLUJ PROC
mov ax, male_znaky
mov di, 2
mul di
cmp ax, operatori
jne DELETE
inc vyh_slovo
DELETE:
mov male_znaky, 0
mov operatori, 0
ret 0
ENDP SKONTROLUJ
END STARTpokial ja vidim tak ukoncujes len 0ah pridaj riadok ukoncenie aj hned za 09h 
//inak ako pozeram, tak mas nejake divne veci, napriklad loopujes na "BEGIN", cize si znovu vypytas retazec a znovu ho nacitas a loop sa vykonava kym neni cl=0, alety si vlastne nikde cl neurcujes, respektive, ked ho aj urcis, tak cele cx vyxorujes(znulujes)...
//inak ako pozeram, tak mas nejake divne veci, napriklad loopujes na "BEGIN", cize si znovu vypytas retazec a znovu ho nacitas a loop sa vykonava kym neni cl=0, alety si vlastne nikde cl neurcujes, respektive, ked ho aj urcis, tak cele cx vyxorujes(znulujes)...
taaak...myslim ze uz som skoro pri konci...mam toto
------------------------------------
-------------------
ale program nevypise ten pocet slov nevite preco??vyzera to takto
vid priloha
------------------------------------
Kód: Vybrať všetko
.MODEL small
.STACK 100h
.DATA
retazec DB 255, 0, 253 dup (24h)
male_znaky DB 0
operatory DB 0
vyhovujuce_slova DB 0
text DB 10,13,"Pocet slov : $"
.CODE
ByteToString PROC
push bp
mov bp, sp
push cx
mov ax, WORD PTR [bp+4] ; v prvom parametri je číslo, teda vyhovujuce_slova
mov bx, WORD PTR [bp+6] ; v druhom parametri je reťazec, do ktorého vypišeš
prevedené číslo
xor cx, cx
cmp ax, 99
jng desiatky
mov ax, -1 ; v prípade veľkého čísla vráť -1
jmp pr_koniec
desiatky:
mov cl, 10
div cl
cmp al, 0
je jednotky
add al, 30h
mov BYTE PTR [bx], al
inc bx
sub al, 30h
mov cl, 10
mul cl
mov cx, WORD PTR [bp+4]
sub cx, ax
mov WORD PTR [bp+4], cx
jednotky:
mov ax, WORD PTR [bp+4]
add al, 30h
mov BYTE PTR [bx], al
mov BYTE PTR [bx+1], 24h
pr_koniec:
pop cx
pop bp
ret 4
ByteToString ENDP
start:
mov ax, @data
mov ds, ax
lea dx, retazec ; nacitanie retazca
mov ah, 0Ah
int 21h
lea bx, retazec
xor cx, cx
mov cl, [bx+1]
mov si, bx
add si, 2
main_loop:
cmp WORD PTR [bx+si], 20h ; medzera = nove slovo
je kontrola
cmp WORD PTR [bx+si], 61h ; kontrola, ci sa jedna o male pismeno
jl operator
cmp WORD PTR [bx+si], 7Ah
jg operator
inc male_znaky
jmp dalsi_znak
operator:
cmp WORD PTR [bx+si], 2Ah ; kontrola, ci sa jedna o operator
jl dalsi_znak
cmp WORD PTR [bx+si], 2Fh
jg dalsi_znak
inc operatory
jmp dalsi_znak
kontrola: ; vyhovuje podmienka (operatory = 2 * male_znaky) ?
call skontroluj
dalsi_znak:
inc si
loop main_loop
call skontroluj
koniec:
mov ah,09h
mov dx,offset text
int 21h
mov ah,vyhovujuce_slova
call ByteToString
mov ax, 4C00h
int 21h
skontroluj PROC
mov al, male_znaky
mov ah, 2
mul ah
cmp al, operatory
jne zmaz
inc vyhovujuce_slova
zmaz:
mov male_znaky, 0
mov operatory, 0
ret 0
skontroluj ENDP
END startale program nevypise ten pocet slov nevite preco??vyzera to takto
vid priloha
no ttoo som nasiel v jednom programe na vypis dvojciferneho cisla ked ho mas ulozene v ah na zaciatku:
ale nechce sa mi moc prezerat ten tvoj program cely, ze ako to tam mas riesene...
Kód: Vybrať všetko
ByteToString PROC
mov CH, AH
mov CL, 0 ;zatial nula dasiatok
este: cmp CH, 10 ;porovnanie poradia s desiatkou
jg desat ;ak je vecsi ako 10 tak skoci na "desat"
jmp koniec2 ;pocet jednotiek je mensi ako 10
desat: add CL, 1 ;do desiatok prida o jednu viac
sub CH, 10 ;z jednotiek odoberie
jmp este ;dalsie porovnanie pokial pocet jednotiek nieje mensi ako 10
koniec2: add CL, 30H ;prevod cisla na znak
add CH, 30H ;prevod cisla na znak
mov DL, CL ;vypis poradoveho cisla-desiatky
mov AH, 02H
int 21H
mov DL, CH ;vypis poradoveho cisla-jednotky
mov AH, 02H
int 21H
ByteToString ENDP