• Welcome to TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach.
 

Tasm zadanie

Started by dEVIANT, 11.05.2009, 05:28:17

« predchdzajce - alie »

dEVIANT

zdravim mam problem so zadanim ...vypisuje mi toto

http://i43.tinypic.com/or8nzs.png
-------------------------
a tu je zdrojak...ma vypisat slova v ktorych je 2krat viac oepratorov ako malych znakov...tie chyby su kokretne v tychto raidkoch


mov al, male_znaky
     mov ah, 2
     mul ah
     cmp al, operatori

----------------
a tu je cely zdrojak...prosim pomozte v stvrtok to mam odovzdat nevem cim to jeeee...diks



.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 START
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

Raleon

mov cl, [bx+1]
ma byt
mov cl,byte ptr[bx+1]
treba mu povedat ze pointer na pamat treba brat ako pointer na bajt (aj ked je to jednoznacne lebo pouzivas cl)
a podobne pre ostatne operacie s pamatou.
Warningy odstranene...

mov al, male_znaky
al je 8bitove, maleznaky si dal ako DW.
skus
mov ax,male_znaky
(daj pozor, ze ked aktualne ah potrebujes inde, treba ulozit, napr. do stacku)


There is no such bad temper that can not be fixed with some good wine.

dEVIANT

ok dik...a este mi mozete niekto vysvetlit preco mi to nic nevypisuje?...co tam je zle?a ako mam doprogramovat ten konecny vypis?? ten "pocet_slov"
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

tino8

Ja by som pripojil, malu s velkou pravdepodobnostou blbu otazku....Aky je rozdiel medzi NASM a TASM? :) akoze viem ze su to 2 prekladace, ale ak mi nieco ide v jednom, tak v druhom nepojde? alebo ako to je?


karamel je cukr co se uz neuzdravi!

dEVIANT

jj...neviem poriadne preco ale proste vacsinou to v nasm vypise chyby...radsej pouzivam ten tasm...tri prikazy a uz to ide...a to co sme brali na cvikach tie prvy.asm a nevem co tak to som nechapal nic...pre vsetkych stranka kde su dobre veci aj vysvetlene aj setko

http://silent.host.sk/assembler/obsah.html
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

Blackwing

no nejak sa tej stránke nechce...

tino8

dikes za ten link, vyzera to tam schopne :)


karamel je cukr co se uz neuzdravi!

dEVIANT

#7
taaak...myslim ze uz som skoro pri konci...mam toto

------------------------------------


.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 start
-------------------
ale program nevypise ten pocet slov nevite preco??vyzera to takto

http://i41.tinypic.com/27ywsqo.png
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.