TASM problem – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

TASM problem – Assembler – Fórum – Programujte.comTASM problem – Assembler – Fórum – Programujte.com

 

dEVIANT
~ Anonymní uživatel
6 příspěvků
11. 5. 2009   #1
-
0
-

zdravim...mam program co porovna ci je pocet operatorov v retazci dvojnasovny ako pocet malych pismen

mam toto

.486

.MODEL small
.STACK 100h

.DATA

retazec DB 255, 0, 253 dup (24h)
male_znaky DB 0
operatory DB 0
vyhovujuce_slova DB 0

.CODE

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 DWORD PTR [bx+si], 20h ; medzera = nove slovo
je kontrola

cmp DWORD PTR [bx+si], 61h ; kontrola, ci sa jedna o male pismeno
jl operator
cmp DWORD PTR [bx+si], 7Ah
jg operator

inc male_znaky
jmp dalsi_znak

operator:

cmp DWORD PTR [bx+si], 2Ah ; kontrola, ci sa jedna o operator
jl dalsi_znak
cmp DWORD 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 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


len teraz neviem ako doprogramovat aby to na zaciatku vypisalo "Zadajte retazec : " a potom "Pocet slov : " a vypisalo vyhovujuce slova...

a este pri prikaze tlink subor.obj mi vypiste chybu ze "Fatal: 32bit record encountered in modul subor.asm"

mozte prosim pomoct vyriesit tie dva problemy ?diks :)

Nahlásit jako SPAM
IP: 147.232.182.–
dEVIANT
~ Anonymní uživatel
6 příspěvků
11. 5. 2009   #2
-
0
-

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

[url=http://i41.tinypic.com/27ywsqo.png]http://i41.tinypic.com/27ywsqo.png[/url]

Nahlásit jako SPAM
IP: 147.232.182.–
dEVIANT
~ Anonymní uživatel
6 příspěvků
11. 5. 2009   #3
-
0
-

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

[url=http://i41.tinypic.com/27ywsqo.png]http://i41.tinypic.com/27ywsqo.png[/url]

Nahlásit jako SPAM
IP: 147.232.182.–
o-lox0
Super člen
12. 5. 2009   #4
-
0
-

Připadne mi to jako bys napřed nakreslil křivku a pak vynášel hodnoty :-)
Valnou většinu svého programu máš nesprávně střílením na terč soupeře...
ByteToString PROC- přijímá parametry ze zásobníku, které se neobtěžuješ předávat
je špatně i funkčně
pokud se v tom motáš udělej raději (hodnota v AL, nemusí se Pushovat):
mov bx,100
@1:
xor ah,ah
div bl
push ax
mov ah,2
mov dl,al
add dl,30h
int 21h
mov ax,bx
mov bl,10
div bl
mov bl,al
pop ax
mov al,ah
cmp bl,1
jae @1

Dál jádro programu porovnává Wordy místo Bytů. To že ti to porovnává na správném místě je zázrak toho typu, že terč protivníka se také po dostřelech sčítá. Tím jsem chtěl říci trefuj se k sobě odstraň BX z adresování SI+BX a nespoléhej na 0 offset (samozřejmě BYTE PTR)

Nahlásit jako SPAM
IP: 85.71.152.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 225 hostů

Podobná vlákna

TASM — založil bbeni

Ide TASM — založil bbeni

[tasm] kde sa ho naucit? — založil Guiseppe

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý