pomoc s tasm

Programovacie jazyky, rady, poradňa...
dEVIANT
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 47
Registrovaný: 02 apr 2009, 20:18

pomoc s tasm

Príspevok od používateľa dEVIANT »

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
picuge
Expert
Expert
Príspevky: 167
Registrovaný: 17 dec 2005, 20:38
Bydlisko: Bratislava/Martin

Príspevok od používateľa picuge »

skus si opravit v tychto dvoch riadkoch DW na DB:
operatori DW 0
male_znaky DW 0
Lebo pokial sa spravne pamatam, tak DW ma 2 bajty a presuvas to do registra o velkosti 1 bajtu..(aj ked to si uz isty nie som ;) )
dEVIANT
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 47
Registrovaný: 02 apr 2009, 20:18

Príspevok od používateľa dEVIANT »

jj to som uz poriesil...diky moc...ale proste mne to vobec nevypise ze "Zadaj retazec : " a potom ani ten "Pocet slov : "...robi len toto

//obrázky do príloh
picuge
Expert
Expert
Príspevky: 167
Registrovaný: 17 dec 2005, 20:38
Bydlisko: Bratislava/Martin

Príspevok od používateľa picuge »

no myslim ze 09h musis ukoncit int 21h ;)
dEVIANT
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 47
Registrovaný: 02 apr 2009, 20:18

Príspevok od používateľa dEVIANT »

no to tam mam...proste takto vyzera kod

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 START
a nefacha mi to...nechapem preco ne...
picuge
Expert
Expert
Príspevky: 167
Registrovaný: 17 dec 2005, 20:38
Bydlisko: Bratislava/Martin

Príspevok od používateľa picuge »

pokial 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)...
dEVIANT
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 47
Registrovaný: 02 apr 2009, 20:18

Príspevok od používateľa dEVIANT »

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

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

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 start
-------------------
ale program nevypise ten pocet slov nevite preco??vyzera to takto
vid priloha
Prílohy
Bez názvu.PNG
picuge
Expert
Expert
Príspevky: 167
Registrovaný: 17 dec 2005, 20:38
Bydlisko: Bratislava/Martin

Príspevok od používateľa picuge »

no mozno to je tym, ze to nikde nevypisujes :D ..aspon co ja vidim ak ty vypises text ze "Pocet slov:", potom pustis tu proceduru ByteToString ale nikde nevidim samotny vypis toho co ta procedura vrati, alebo nejaky vypis v nej (ak som prehliadol tak sorry)
dEVIANT
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 47
Registrovaný: 02 apr 2009, 20:18

Príspevok od používateľa dEVIANT »

no tak mi porad ako to tam zapisat pls...kde co ako:D
picuge
Expert
Expert
Príspevky: 167
Registrovaný: 17 dec 2005, 20:38
Bydlisko: Bratislava/Martin

Príspevok od používateľa picuge »

no ttoo som nasiel v jednom programe na vypis dvojciferneho cisla ked ho mas ulozene v ah na zaciatku:

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
ale nechce sa mi moc prezerat ten tvoj program cely, ze ako to tam mas riesene...
Napísať odpoveď