Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Autor | Správa |
---|
Registrovaný: 20.10.07 Prihlásený: 27.03.10 Príspevky: 16 Témy: 4 | 4 |
zdravim...mam problem naprogramovat program ktory zisti pocet slov v ktorych je dvakrat vacsi pocet malych pismen ako operatorov +,-,=,/...
---------------------------
chcem vas poprosit ci by ste mi tu mohli dat linky na nejake zrozumitelne tutorialy ktore mi k tomu pomozu...alebo mi tu napisali hocico co mi moze pomoct...popripade nejaky kratky zdrojovy kod na nieco podobne a tak...
vopred dakujem za kazdu radu
|
|
Registrovaný: 11.01.09 Prihlásený: 28.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Pozri si ASCII tabuľku. V nej máš hodnoty znakov (malé písmená a operátory).
Potom keď načítavaš slová, tak každý hodnotu znaku porovnaj, či patrí k malým písmenám, alebo k operátorom. Ak nikde, program nech pokračuje ďalej. Ak patrí k malým písmenám, zvýš hodnotu premennej, ktorá počíta výskyt malých znakov a ak patrí k operátorom, tak zvýš hodnotu premennej počítajúcu operátory. Po skončení slova zistíš, či:
Kód: 2 * male_pismena = operatoy
ak áno, zvýšiš počítadlo slov, ktoré splňujú túto podmienku.
Už to zvládneš alebo chceš aj malý výpis kódu?
|
|
Registrovaný: 20.10.07 Prihlásený: 27.03.10 Príspevky: 16 Témy: 4 | 4 |
no jj mna hlavne ten kod zajima...viem princip ako to naprogramovat napisal by som to napr v pascale alebo c len ten assembler...tomu nejako neviem prist na kloub:D
|
|
Registrovaný: 11.01.09 Prihlásený: 28.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Kód: .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 mov dx, offset retazec ; nacitanie retazca mov ah, 0Ah int 21h
mov bx, offset retazec xor cx, cx mov cl, [bx+1] mov si, bx add si, 2 main_loop:
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 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
PROC skontroluj 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 ENDP skontroluj
END start
|
|
Registrovaný: 20.10.07 Prihlásený: 27.03.10 Príspevky: 16 Témy: 4 | 4 |
ou diky moc...len mi este pri kompilovani cez cmd a nasm vypisuje tieto chyby
-----------
http://i42.tinypic.com/s4nj84.jpg
-----------
mozes mi pls poradit ako ich odstranit?
|
|
Registrovaný: 20.10.07 Prihlásený: 27.03.10 Príspevky: 16 Témy: 4 | 4 |
tak zatial mam toto...ale nevypisuje mi to vobec tie psravy a tak...mozes mi s tym pomoct plls?
Kód: .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
|
|
Registrovaný: 11.01.09 Prihlásený: 28.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Ale veď to nemáš správne. Veď sa pozri na svoju slučku:
Kód: loop START Všetko sa odznova opakuje (vrátane inicializácie dátového segmentu, načítavanie reťazca, atď). Prečo iba neupravíš môj kód? Takto to bude fungovať v MASM (myslím, že zmeny medzi NASM a MASM nie sú veľké, tak to už snáď upravíš sám): Kód: .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
Počet vyhovujúcich slov je uložený v premennej vyhovujuce_slova, ale nevypisuje sa. Funkciu na vypísanie si vieš napísať, či nie?
|
|
Registrovaný: 20.10.07 Prihlásený: 27.03.10 Príspevky: 16 Témy: 4 | 4 |
pri prikaze tasm subor.asm je setko ok
ale pri tlink subor.obj mi vypise chybu ze "Fatal: 32bit record encountered in modul subor.asm"
--------------------
no to s tym ze to na zaciatku vypise "Zadajte retazec : " a potom "Pocet slov : " a vypise ten pocet tak to neviem vobec...tak ked budes taky ochotny...
|
|
Registrovaný: 11.01.09 Prihlásený: 28.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Ohľadom toho linkovania - skús dať preč direktívu .486
Procedúra na prevedenie čísla na reťazec (procedúra je stavananá na maximálne číslo 99 - myslím, že takýto rozsah na tvoj príklad stači až až):
Kód: ByteToStr PROC
push bp mov bp, sp push bx push cx
mov ax, WORD PTR [bp+4] ; v prvom parametri je číslo, teda vyhovujuce_slova (vlož ho cez 16-bitový register) mov bx, WORD PTR [bp+6] ; v druhom parametri je adresa reťazca, 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 bx pop bp ret 4
ByteToStr ENDP
Možno existuje ľahší spôsob prevedenia čísla, ale ja o inom neviem.
|
|
Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Assembler, C, C++, Pascal, Java | 7 | 1461 | 25.03.2011 10:07 dury26 | | v Assembler, C, C++, Pascal, Java | 0 | 505 | 03.05.2010 20:47 Balzer1 | | v Assembler, C, C++, Pascal, Java | 0 | 435 | 25.02.2017 14:50 kemperik | | v Assembler, C, C++, Pascal, Java | 1 | 640 | 04.05.2008 11:47 snapshot | | v Assembler, C, C++, Pascal, Java | 4 | 557 | 10.04.2010 14:24 chrono | | v Kúpim | 0 | 330 | 17.08.2017 15:45 RRHRY10 | | v Assembler, C, C++, Pascal, Java | 1 | 588 | 14.05.2009 8:37 Fico | | v Assembler, C, C++, Pascal, Java | 1 | 480 | 16.04.2011 10:33 Fico | | v Assembler, C, C++, Pascal, Java | 1 | 840 | 18.03.2010 20:28 Fico | | v Assembler, C, C++, Pascal, Java | 2 | 646 | 23.03.2010 15:55 crazy | | v Assembler, C, C++, Pascal, Java | 2 | 394 | 06.03.2017 17:48 Miso122 | | v Assembler, C, C++, Pascal, Java | 26 | 4043 | 15.03.2011 13:47 katiMIR |
|