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

Assembler 86 – Assembler – Fórum – Programujte.comAssembler 86 – Assembler – Fórum – Programujte.com

 

12. 6. 2009   #1
-
0
-

Zdravim, mam problem s jednym programom, nevie niekto pomoct?

Zadanie: Načítajte z klávesnice reťazec znakov ukončený znakom konca riadku. Slová vo vstupe sú oddelené najmenej jedným znakom medzera. Uvažujte aj prvé, resp. posledné slovo vstupu. Určte počet slov, v ktorých je počet výskytov veľkých písmen dvojnásobkom počtu výskytov malých písmen. Počet vytlačte šestnástkovo.

Su v tom nejake chyby, na vystupe tam zapocivava aj veci ktore nema, napriklad medzery.





; ############################################################
; ##### ZADANIE c.XXX (c) --= Xxxxxxx Xxxxx =-- 2oo9 #####
; ############################################################
; --------------------------------------------------------------------------------------------

.model small
.stack 100h

; --------------------------------------------------------------------------------------------
; --------------------------------------------------------------------------------------------
; ### data ###

.data
str1 DB "Zadaj retazec: ",‘$‘
str2 DB "Pocet vyhovujucich slov je ",‘$‘
str3 DB "(c) --= Xxxxxxx Xxxxx =-- 2oo3",‘$‘
str4 DB "Zadanie c.XXX - Assembler",‘$‘
buffer DB 201 dup(200)

; --------------------------------------------------------------------------------------------
; --------------------------------------------------------------------------------------------
; ### code ###

.code

; --------------------------------------------------------------------------------------------
; ### procedury ###


; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## getStr
; # - nacita retazec z klavesnice ukonceny znakom '\n' a ulozi ho do buffera
; -----------------

getStr proc near
mov ah,01h ; vstup z klavesnice
getLoop: int 21h
cmp al,0dh ; testujeme koncovy znak (\n)
je getEnd ; ak bol, tak koniec nacitavania
mov [bx],al ; inak ulozime znak do buffera
inc bx ; BX nastavime na dalsi znak
jmp getLoop ; nacitaj dalsi znak
getEnd: mov byte ptr [bx],‘$‘ ; CR skonvertujem na '$'
ret
getStr endp

; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## putStr
; # - vypise retazec na ktory ukazuje BX a je ukonceny znakom '0'
; -----------------

putStr proc near
mov ah,2h ; zobraz znak
nextChar: cmp byte ptr [bx],‘$‘ ; testujeme koncovy znak
je foundEnd ; ak bol, tak koniec
mov dl,[bx] ; inak ho vypiseme
int 21h
inc bx ; BX nastavime na dalsi znak
jmp nextChar ; vypis dalsieho znaku
foundEnd: ret
putStr endp

; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## newLine
; # - vypise znak CR a LF (odriadkuje)
; -----------------

newLine proc near
mov ah,02h ; zobraz znak
mov dl,0dh ; CR
int 21h
mov dl,0ah ; LF
int 21h
ret
newLine endp

; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## testChar
; # - zisti ci je znak [bx] male/velke pismeno, obsluzi pocitadla znakov
; # CL = pocet malych pismen, CH = pocet velkych pismen
; -----------------

testChar proc near

; +++++++++ rozoznavanie malych/velkych pismen +++++++++

cmp byte ptr [bx],'A' ; kontrolujeme velke pismeno-dolna hranica
jl Tend ; <'A' (nebude to pismeno)
cmp byte ptr [bx],'Z' ; kontrolujeme velke pismeno-horna hranica
jle Tinc1 ; <='Z' (je to velke pismeno)

cmp byte ptr [bx],'a' ; kontrolujeme male pismeno- dolna hranica
jl Tend ; <'a' (nebude to male pismeno)
cmp byte ptr [bx],'z' ; kontrolujeme male pismeno- horna hranica
jle Tinc2 ; <='z' (je to male pismeno)

jmp tend ; >'Z' (nieje to male pismeno)

; +++++++++ pocitanie malych/velkych +++++++++

Tinc1: inc ch ; velke pismeno
jmp tend

Tinc2: inc cl ; male pismeno
jmp tend

Tend: ret
testChar endp


; --------------------------------------------------------------------------------------------
; --------------------------------------------------------------------------------------------
; ### source ###

start:
mov ax,@DATA
mov ds,ax

mov bx,offset str4 ; nazov programu
call putStr
call newLine
call newLine


; +++++++++ vstup od pouzivatela +++++++++

mov bx,offset str1 ; vyzva na zadanie retazca
call putStr
mov bx,offset buffer ; nacitame retazec do 'buffer'
call getStr
call newLine ; odriadkujem


; +++++++++ analyza zadanych udajov +++++++++

mov bx,offset buffer ; prvy znak
mov cx,0 ; znulujeme pocitadla znakov
mov dx,0
push dx ; odlozime DX (pocitadlo vyhovujucich slov)

nextCh: cmp byte ptr [bx],‘$‘ ; testujeme koncovy znak
je space ; ak bol, tak kontrola posledneho slova a koniec
cmp byte ptr [bx],' ' ; testujeme medzeru = zaciatok/koniec slova
je space

call testChar

inc bx ; dalsi znak
jmp nextCh


; +++++++++ zaciatok/koniec slova +++++++++

space: sub ch,cl ; (pocet velkych) - 2*(pocet malych)
sub ch,cl ; ak vyhovuje, vysledok je 0 (CX=0)

cmp ch,0 ; testujeme ci je spravny pocet malych/velkych
jne clWend ; ak nie, tak skok

pop dx ; obnovime pocitadlo spravnych slov
inc dx ; aktualne slovo vyhovovalo
push dx ; odlozime spat

clWend: cmp byte ptr [bx],'$' ; testujeme koncovy znak
je finish ; ak bol, tak konec analyzy slov

mov cx,0 ; znulujeme pocitadlo znakov
inc bx ; dalsi znak
jmp nextCh

; +++++++++ vypisanie vysledku v sestnastkovej sustave +++++++++

finish: mov bx,offset str2 ; vypis o vysledkoch
call putStr

pop dx ; obnovime DX (pocitadlo vyhovujucich slov)
mov dh,dl ; do DH odlozime pocitadlo (DL potrebujeme na vystup)

rol dl,2 ; najvyssi rad
and dl,00000011b
add dl,30h ; prevedieme na ASCII kod
int 21h

mov dl,dh ; stredny rad
ror dl,3
and dl,00000111b
add dl,30h ; prevedieme na ASCII kod
int 21h

mov dl,dh ; najnizsi rad
and dl,00000111b
add dl,30h ; prevedieme na ASCII kod
int 21h


; +++++++++ copyright a koniec programu +++++++++

call newLine
call newLine
mov bx,offset str3 ; vypis copyrightu
call putStr

mov ax,4c00h ; ukoncenie programu (0=koniec bez chyby)
int 21h

end start

; --------------------------------------------------------------------------------------------

Nahlásit jako SPAM
IP: 195.168.209.–
17. 6. 2009   #2
-
0
-

...mozme sa dohodnut na nejakej financnej odmene, ak niekto pomoze.

Nahlásit jako SPAM
IP: 195.168.209.–
o-lox0
Super člen
18. 6. 2009   #3
-
0
-

Máš to vypracované takřka na jedničku, jen zauvažuj nad případem kdy se porovnává
a=b*2
To vychází nejen pro 4,2 ale i 0,0 takže před toto poměřování vlož ještě podmínku, že délka je alespoň jeden znak, neboli různá od nuly
cmp ch,0 ; cmp cl,0 ; na tom nesejde

Nahlásit jako SPAM
IP: 85.71.152.–
18. 6. 2009   #4
-
0
-

To o-lox : tak dakujem, ale ako to myslis? presne tak som nad tym rozmyslal aj ja, ale stale tam boli nejake chyby :-(( uz neviem fakt ako dalej, normalne mam z toto nervy : -))

Nahlásit jako SPAM
IP: 195.168.209.–
o-lox0
Super člen
18. 6. 2009   #5
-
0
-

Jako přísedící jsem notně nervózní co ti neni jasné, otevřel jsem rozpravu nad přidánim instrukce jcxz skokjakopriVelkeSeNerovnaNasobkuMalych, možná aby bylo jasno na čem jsme, rozeber mi tento odstavec *, neboť mám dojmů že jsem už jediný v široširém světě kdo asm rozumí :D

*
nextCh: cmp byte ptr [bx],‘$‘ ; testujeme koncovy znak
je space ; ak bol, tak kontrola posledneho slova a koniec
cmp byte ptr [bx],' ' ; testujeme medzeru = zaciatok/koniec slova
je space

call testChar

inc bx ; dalsi znak
jmp nextCh


; +++++++++ zaciatok/koniec slova +++++++++

space: sub ch,cl ; (pocet velkych) - 2*(pocet malych)
sub ch,cl ; ak vyhovuje, vysledok je 0 (CX=0)

cmp ch,0 ; testujeme ci je spravny pocet malych/velkych
jne clWend ; ak nie, tak skok

pop dx ; obnovime pocitadlo spravnych slov
inc dx ; aktualne slovo vyhovovalo
push dx ; odlozime spat

clWend: cmp byte ptr [bx],'$' ; testujeme koncovy znak
je finish ; ak bol, tak konec analyzy slov

mov cx,0 ; znulujeme pocitadlo znakov
inc bx ; dalsi znak
jmp nextCh

konkrétně část space nám dělá asi tu potíž s mezerama

Nahlásit jako SPAM
IP: 85.71.152.–
KIIV
~ Moderátor
+43
God of flame
18. 6. 2009   #6
-
0
-

To o-lox : tak kdyz lidi zacinaj treba Javou, tak se nediv ze mas ten pocit.. posadis je pred asm a oni zacnou hledat balicky co resi problem, ktery maji zadanej :D (jak se da resit ten problem "uvnitr" samozrejme vubec neresi)
ja osobne se venuju prevazne assembleru pro x51, nebo pic.. takze proto radeji x86 nechavam na odbornicich :D

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
o-lox0
Super člen
18. 6. 2009   #7
-
0
-

to KIIV:
ále, ta doba :D, utírám slzy co padaj do potoka, su smutný jak ta sehnutá opadaná vrba, že tu nejsó také dotazy, co lóni, ňáká slečna se ptala jak napsat a importovat Céčkovskou variantu printf skrz asm, vypadala že to zvládla po chvilce sama, tam by byla bývala radost se zapojit do diskuze :-) (sem to vlákno až nedávno čet), ale tady umělci, jak pravíš, neví už povětšinou ani co děla MOV. Assembler, DOS je mrtvej já chci hergot post-scifi společnost která sere na komerčnost využití. Má všechno a proto se věnuje plně umění .....nebo aspoň zpátky ty komunisty :D

Nahlásit jako SPAM
IP: 85.71.152.–
KIIV
~ Moderátor
+43
God of flame
18. 6. 2009   #8
-
0
-

To o-lox : jasny chapu jak to myslis...
tady akorat moc dobrejch otazek nebyva...

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
o-lox0
Super člen
18. 6. 2009   #9
-
0
-

To KIIV :
zapojuji se i na jinejch fórech - ale lidi i tam sou už málo na tý nízkoúrovňový hladině, v jádru to nováčky evidentně nebaví, cítí asi mrtvolno (builder,..)

Nahlásit jako SPAM
IP: 85.71.152.–
18. 6. 2009   #10
-
0
-

asi naozaj budes fakt jeden z mala ludi co asm rozumie :-) lebo ja stale, ked si uz myslim ze to mam, tak stale najdem nieco nove, co by tam nemalo byt. presne ako teraz, nech robim co robim, furt sa mi zda, ze to tam pocita aj veci co nema, tak uz fakt neviem. uz mam z toho hlavu ako slon a niekedy rozmyslam nad tym, ci nehodim notebook o zem :-)) ale to by asi tomu moc nepomohlo, vsak? :-))))))))))))

Nahlásit jako SPAM
IP: 195.168.209.–
o-lox0
Super člen
18. 6. 2009   #11
-
0
-

To dDesmondD :
V situaci kdy tápeš že nevíš který ťápoty jsou tvoje, atd. je léty ověřeným trikem-lékem podplatit porotce ;-) , peníze nejsou jediná možnost, ale když pošleš částku přes PayPal jsem tvým služebníčkem :-)) nebo beru také "unikátní" nevídané, vzácné zboží zaslané na mail. Vyber si jestli ti služby za to stojí, rozebrání odstavce asm to zřejmě (v zájmu z tvé strany) bez anestetik jen tak nebude :D


k editu: po vyčerpání všech ostatních možností se i dDesmondD chová rozumně.

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, 84 hostů

Podobná vlákna

Assembler — založil Michal21

C++ vs Assembler — založil Dodo

ASSEMBLER — založil JONNY

Assembler - uloha — založil wolfito

Assembler newbie — založil Plui

 

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