Prosím skontrolujte niekto tento program ,výstup má byt v 2kovej ,ale píše v 10 tkovej sústave.Kde je chyba
org 1000
dcx sp ; inicializacia zasobnika (0FFFFh)
lxi h,text1 ; skopiruj text1 do h
call putstr ; vypis uvodny text
mvi b,0 ; pocitadlo vyhovujucich slov
mvi c,0 ; pocitadlo vyhovujucich znakov v slove
mvi d,0 ; pocitadlo vsetkych znakov v slove
char_loop:
call getchar ; nacita sa zadany znak do registra "a"
cpi 10 ; porovna sa register "a" s backspacom
jz char_end ; skoci sa na char_end, ak sa rovna
cpi 13 ; porovna sa register "a" s enterom
jz char_end ; skoci sa na char_end, ak sa rovna
cpi 32 ; porovna sa register "a" s medzerou
jz char_space ; skoci sa na char_space, ak sa rovna
cpi 43 ; nacitany znak sa porovna s '+'
jz char_add ; skoci sa na char_add, ak sa rovna
cpi 42 ; nacitany znak sa porovna s '*'
jz char_add ; skoci sa na char_add, ak sa rovna
cpi 47 ; nacitany znak sa porovna s '/'
jz char_add;skoci sa na char_add, ak sa rovna
cpi 45 ; nacitany znak sa porovna s '-'
jz char_add;skoci sa na char_add, ak sa rovna
inr d ; inkrementuje sa pocitadlo vsetkych znakov v slove
jmp char_loop ; nacita sa dalsi znak
char_add:
inr c ; inkrementuje sa pocitadlo vyhovujucich znakov v slove
inr d ; inkrementuje sa pocitadlo vsetkych znakov v slove
jmp char_loop ; nacita sa dalsi znak
char_space:
mov a,d ; pocitadlo vsetkych znakov v slove sa skopiruje do registra "a"
cpi 0 ; nebola prvy znak medzera?
jz char_loop ; ak ano, nacita sa dalsi znak
cmp c ; porovna sa, ci vsetky znaky boli vyhovujuce
mvi d,0 ; vynuluje sa pocitadlo vsetkych znakov v slove
mvi c,0 ; vynuluje sa pocitadlo vyhovujucich znakov v slove
jnz char_loop ; nacita sa dalsi znak
inr b ; inkrementuje sa pocitadlo vyhovujucich slov
jmp char_loop ; nacita sa dalsi znak
char_end:
mov a,d ; skopiruje sa pocitadlo vsetkych znakov v slove do registra "a"
cpi 1 ; ak nie su ziadne dalsie znaky,
jc print ; pokracuje sa vo vypise
cmp c ; inak sa kontroluje, ci posledne slovo bolo spravne
jnz print ; ak nie, pokracuje sa vo vypise
inr b ; ak ano, inkrementuje sa pocitadlo vyhovujucich slov
celociselny_zvisok_po_deleni:
sub b ; odcita b od a
cmp b ; porovna b s a
jnc celociselny_zvisok_po_deleni ; ak je a < b skonci
ret ; vrati sa spet
delenie_celeho_cisla:
mvi h,0;
_delenie:
sub b ; odcita b od a
inr h ; zvisi h
cmp b ; porovna b s a
jnc _delenie ; ak je a < b skonci
mov a, h
ret ; vrati sa spet
binarny_prevod:
mvi a,0 ; do registra a da 0
sta 20 ; zapise obsah registra a do pamete 20
sta 21 ; zapise obsah registra a do pamete 21
sta 22 ; zapise obsah registra a do pamete 22
sta 23 ; zapise obsah registra a do pamete 23
sta 24 ; zapise obsah registra a do pamete 24
sta 25 ; zapise obsah registra a do pamete 25
sta 26 ; zapise obsah registra a do pamete 26
sta 27 ; zapise obsah registra a do pamete 27
sta 28 ; zapise obsah registra a do pamete 28
sta 29 ; zapise obsah registra a do pamete 29
mov a, c ; do registra a da obsah registra c
sta 20 ; zapise obsah registra a do pamete 20
mvi b,2 ; do registra b da 2
call celociselny_zvisok_po_deleni ; zavola celociselny_zvisok_po_deleni
sta 22 ; zapise obsah registra a do pamete 22
lda 20 ; obsah pamete 20 da do registra a
call delenie_celeho_cisla ; zavola delenie_celeho_cisla
sta 21 ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni ; zavola celociselny_zvisok_po_deleni
sta 23 ; zapise obsah registra a do pamete 23
lda 21 ; obsah pamete 21 da do registra a
call delenie_celeho_cisla ; zavola delenie_celeho_cisla
sta 21 ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni ; zavola celociselny_zvisok_po_deleni
sta 24 ; zapise obsah registra a do pamete 24
lda 21 ; obsah pamete 21 da do registra a
call delenie_celeho_cisla ; zavola delenie_celeho_cisla
sta 21 ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni ; zavola celociselny_zvisok_po_deleni
sta 25 ; zapise obsah registra a do pamete 25
lda 21 ; obsah pamete 21 da do registra a
call delenie_celeho_cisla ; zavola delenie_celeho_cisla
sta 21 ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni ; zavola celociselny_zvisok_po_deleni
sta 26 ; zapise obsah registra a do pamete 26
lda 21 ; obsah pamete 21 da do registra a
call delenie_celeho_cisla ; zavola delenie_celeho_cisla
sta 21 ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni ; zavola celociselny_zvisok_po_deleni
sta 27 ; zapise obsah registra a do pamete 27
lda 21 ; obsah pamete 21 da do registra a
call delenie_celeho_cisla ; zavola delenie_celeho_cisla
sta 21 ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni ; zavola celociselny_zvisok_po_deleni
sta 28 ; zapise obsah registra a do pamete 28
lda 21 ; obsah pamete 21 da do registra a
call delenie_celeho_cisla ; zavola delenie_celeho_cisla
sta 21 ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni ; zavola celociselny_zvisok_po_deleni
sta 29 ; zapise obsah registra a do pamete 29
lda 29 ; obsah pamete 29 da do registra a
adi 48 ; k obsahu registra a pripocita 48
out 11h ; vypise obsah registra a na obrazovku
lda 28 ; obsah pamete 28 da do registra a
adi 48 ; k obsahu registra a pripocita 48
out 11h ; vypise obsah registra a na obrazovku
lda 27 ; obsah pamete 27 da do registra a
adi 48 ; k obsahu registra a pripocita 48
out 11h ; vypise obsah registra a na obrazovku
lda 26 ; obsah pamete 26 da do registra a
adi 48 ; k obsahu registra a pripocita 48
out 11h ; vypise obsah registra a na obrazovku
mvi a,' ' ; do registra a da ' '
out 11h ; vypise obsah registra a na obrazovku
lda 25 ; obsah pamete 25 da do registra a
adi 48 ; k obsahu registra a pripocita 48
out 11h ; vypise obsah registra a na obrazovku
lda 24 ; obsah pamete 24 da do registra a
adi 48 ; k obsahu registra a pripocita 48
out 11h ; vypise obsah registra a na obrazovku
lda 23 ; obsah pamete 23 da do registra a
adi 48 ; k obsahu registra a pripocita 48
out 11h ; vypise obsah registra a na obrazovku
lda 22 ; obsah pamete 22 da do registra a
adi 48 ; k obsahu registra a pripocita 48
out 11h ; vypise obsah registra a na obrazovku
ret ; vrati sa spet
print:
lxi h,text2 ; skopiruje sa text2 do h
call putstr ; vypise sa text2
mov a,b ; skopiruje sa pocitadlo vyhovujucich slov do registra "a"
adi '0' ; hodnota a jej ASCII tvar ...
call putchar ; vypise sa znak
call newline ; vypise sa novy riadok
hlt ; ukonci sa program
include 'examples\8080\include\getline.inc'
include 'examples\8080\include\putstr.inc'
include 'examples\8080\include\putchar.inc'
include 'examples\8080\include\getchar.inc'
include 'examples\8080\include\newline.inc'
text1: db 'Pocet slov neobsahujucich aritmeticke operatory ...',10,13,'Vloz text: ',0
text2: db 10,13,'Slov je: ',0
vlozeny: ds 30
Fórum › Assembler
Assembler 8080 pomoc
mov a,d ; skopiruje sa pocitadlo vsetkych znakov v slove do registra "a"
cpi 1 ; ak nie su ziadne dalsie znaky,
jc print ; pokracuje sa vo vypise
cmp c ; inak sa kontroluje, ci posledne slovo bolo spravne
jnz print ; ak nie, pokracuje sa vo vypise
inr b ; ak ano, inkrementuje sa pocitadlo vyhovujucich slov
TOHLE MI NEDAVA SMYSL, NIKAM TO NEVEDE - neboli vysvetli mi kde si to dokoncil
celociselny_zvisok_po_deleni:
sub b ; odcita b od a
cmp b ; porovna b s a
jnc celociselny_zvisok_po_deleni ; ak je a < b skonci
ret ; vrati sa spet
Dale > dělení se dá psát efektivněji než otrockým odčítáním, ale to bych ti asi komplkoval začátečnické práce.
Takže aspoň WTF je práce s HL a cyklem, to binarny_prevod snad nemyslis vazne?? Dalo se to 1 cyklem!! Nehlede ze se to do nej nemuze dostat.
Nemáš na to vůbec nějaký prostředí 8080?
A a a a a a r g h
org 1000
dcx sp ; inicializacia zasobnika (0FFFFh)
lxi h,text1 ; skopiruj text1 do h
call putstr ; vypis uvodny text
mvi b,0 ; pocitadlo slov neobsahujicich +-*/
mvi c,1 ; pomocna promenna boolean typ
lxi h,text1
chloop:
call getch
cpi 10 ; porovna sa register "a" s backspacom
jz chend ; skoci sa na char_end, ak sa rovna
cpi 13 ; porovna sa register "a" s enterom
jz chend ; skoci sa na char_end, ak sa rovna
cpi 32 ; porovna sa register "a" s medzerou
jz chspac ; skoci sa na char_space, ak sa rovna
cpi 43 ; nacitany znak sa porovna s '+'
jz chadd ; skoci sa na char_add, ak sa rovna
cpi 42 ; nacitany znak sa porovna s '*'
jz chadd ; skoci sa na char_add, ak sa rovna
cpi 47 ; nacitany znak sa porovna s '/'
jz chadd;skoci sa na char_add, ak sa rovna
cpi 45 ; nacitany znak sa porovna s '-'
jz chadd;skoci sa na char_add, ak sa rovna
jmp chloop ; nacita sa dalsi znak
chadd:
mvi c,0
jmp chloop ; nacita sa dalsi znak
chspac:
mov a,b
add c
mov b,a
mvi c,1
jmp chloop ; nacita sa dalsi znak
chend:
call print
hlt
del: ; deli a/b Vraci a, zbytek b
mvi h,0;
deleni:
cmp b ; porovna b s a
jc nedel ; ak je a < b skonci
sub b ; odcita b od a
inr h ; zvisi h
jmp deleni
nedel:
mov b,a
mov a, h
ret ; vrati sa spet
prevod:
cpi 0
jz konec
mvi b,10
call del
push psw
mov a,b
adi 48
mov M,a
dcx h
pop psw
jmp prevod
konec:
adi 48
mov M,a
ret
print:
mov a,b
lxi h,vloz+4
call prevod
lxi h,text2 ; skopiruje sa text2 do h
call putstr ; vypise sa text2
call newline ; vypise sa novy riadok
ret
getch:
mov a,M
inx h
ret
text1: db 'Pocet slov +neobsahujucich aritmeticke operatory ...',10,13,'Vloz text: ',0
text2: db 10,13,'Slov je: '
vloz: db ' ',0
hlt ; ukonci sa program
END
Asi nejk takto. Deleni sem nechal, gchar si udelal svoje protoze si sve nedodal a otestoval to tak z 70% v simulatoru, za 100% si snad priplat nebo zesedivim :-))
Je to udelane tak jak jsem z tveho stroheho popisu pochpil tozn. vypise v desitkove soustave pocet tech slov.
Mohl bys mi rict co je
misto: ds 30 - co si tim chtel udelat???? - RAD BYCH TE POCHOPIL
v čom si to pustal ? ja v EmuStudiu
diky moc aj keď mi hlási chybu putstr...
ds 30 nevymyslel som to ja,moje cvika z Assembleru 8080 a najnovšie 8086 nestoja za nič... možno budem o mesiac potrebovať pomoc so zadaním ...
keby ti trebalo dačo v Pascale tak ti to skúsim spraviť, bez toho ,aby som zošedivel...
No to jsou konečně ta správná slova, vezmu tě někdy za ně :-) , jako Pascalského testera ještě nikoho nemám, uvidim :-) stačilo by mi stejně jenom upozornění na chybku v hot. exe dělaných her.
a když nebudeš moc - se stále hnout tak vypiš problémy..
..Testoval jsem v cpu simulatoru 8085
totiz getchar a putchar ,podobne getline,newline ,putstr su hlavickove subory a su definovane takto :
getchar:
in 10h
ani 1
jz getchar
in 11h
out 11h
ret
putchar
out 11h
ret
putstr
mov a,m
inx h
cpi 0
rz
out 11h
jmp putstr
zatial nevypisuje v žiadnej sustave ,len nejake cudne znaky
niekedy sa neda nacitat
nie je chybne to END na konci
kde zohnam tvoj simulator
pocitas s tim, ze aby ti to vypsalo spravny znaky musis taky pricist nejakou konstantu? treba kdyz ti v binarce vychazeji cisla 0 a 1 tak aby si vypsal 0 nebo 1 v ascii tak musis pricist ascii hodnotu znaku '0'
ja jen takovy postreh...
To KIIV : To jsem mu samosebou Napsal
To bbeni : Pošli mi na mail prosimtě to tvé Emustudio, já ti můžu poslat něco od sebe ale nemám tam vtipně výstup na obrazovku je to jen CPU...
Jinak našel jsem u sebe chybajznu, v dělení manipuluju s registrem H a ten přitom je používanej pro práci s pamětí, nahraď to třebbba reg. D je volnej.
Nevidim kde máš blok !
U mne v simulátoru to celkem běží.
Ten tvůj chce Java5 a kvuli tomuto si instalovat 130MB 5ku nebudu, stáhl jsem sice verzi i pro 4.0 ale ta si nerozumí s i8080.
vstup/výstup nahraď:
getch -> getchar
použij poslední verzi co mám Nahoře a musíš dostat aspoň Nějaký výsledek tak krásně jako já.
Neřikám že se nemůžu dostat k PC s Javou 6.0, ale fakt myslim že to neni nutný :-)
Máš tam tohle
print:
mov a,b
lxi h,vloz+4
call prevod
lxi h,text2 ; skopiruje sa text2 do h
call putstr ; vypise sa text2
call newline ; vypise sa novy riadok
a tohle ?
push psw
mov a,b
adi 48
mov M,a
dcx h
pop psw
jako já nahoře?
Hoď sem svůj KOD [celej ! ] , kdyz uvidim ze je to ten ktery me funguje, opravdu prejdu ke Computeru numero Duo (s javou).
org 1000
dcx sp ; inicializacia zasobnika (0FFFFh)
lxi h,text1 ; skopiruj text1 do h
call putstr ; vypis uvodny text
mvi b,0 ; pocitadlo slov neobsahujicich +-*/
mvi c,1 ; pomocna promenna boolean typ
lxi h,text1
chloop:
call getchar
cpi 10 ; porovna sa register "a" s backspacom
jz chend ; skoci sa na char_end, ak sa rovna
cpi 13 ; porovna sa register "a" s enterom
jz chend ; skoci sa na char_end, ak sa rovna
cpi 32 ; porovna sa register "a" s medzerou
jz chspac ; skoci sa na char_space, ak sa rovna
cpi 43 ; nacitany znak sa porovna s '+'
jz chadd ; skoci sa na char_add, ak sa rovna
cpi 42 ; nacitany znak sa porovna s '*'
jz chadd ; skoci sa na char_add, ak sa rovna
cpi 47 ; nacitany znak sa porovna s '/'
jz chadd;skoci sa na char_add, ak sa rovna
cpi 45 ; nacitany znak sa porovna s '-'
jz chadd;skoci sa na char_add, ak sa rovna
jmp chloop ; nacita sa dalsi znak
chadd:
mvi c,0
jmp chloop ; nacita sa dalsi znak
chspac:
mov a,b
add c
mov b,a
mvi c,1
jmp chloop ; nacita sa dalsi znak
chend:
call print
hlt
del: ; deli a/b Vraci a, zbytek b
mvi h,0;
deleni:
cmp b ; porovna b s a
jc nedel ; ak je a < b skonci
sub b ; odcita b od a
inr h ; zvisi h
jmp deleni
nedel:
mov b,a
mov a, h
ret ; vrati sa spet
prevod:
cpi 0
jz konec
mvi b,10
call del
push psw
mov a,b
adi 48
mov M,a
dcx h
pop psw
jmp prevod
konec:
adi 48
mov M,a
ret
print:
mov a,b
lxi h,vloz+4
call prevod
lxi h,text2 ; skopiruje sa text2 do h
call putstr ; vypise sa text2
call newline ; vypise sa novy riadok
ret
text1: db 'Pocet slov +neobsahujucich aritmeticke operatory ...',10,13,'Vloz text: ',0
text2: db 10,13,'Slov je: '
vloz: ds 30
hlt ; ukonci sa program
hlt
include 'examples\8080\include\getline.inc'
include 'examples\8080\include\putstr.inc'
include 'examples\8080\include\putchar.inc'
include 'examples\8080\include\getchar.inc'
include 'examples\8080\include\newline.inc'
Budu vraždit to je ta NEJVĚTŠÍ NOČNÍ MŮRA která přede mne byla za poslední dobu předhozena.
1) nemám slov
2) nemám slov
PŘELOŽENO :
1) co dělá registr H v dělení když jsme se domluvili na D , => zabít
2) co ten konec ještě sem se tě na to ptal, speciálně proč tam máš vloz: DS 30 , odpověděls že nevíš, já TAM NAPSAL něco jiného, nevšiml sis náhodou, jen takovou abych se nemusel potutelně smát ....
1) všechny H na D !!!
2)
text1: db 'Pocet slov +neobsahujucich aritmeticke operatory ...',10,13,'Vloz text: ',0
text2: db 10,13,'Slov je: '
vloz: db ' ',0
ad2) nemam zkusenosti jak je ten prostor DS alokovan ale vsadim se ze skucivejma nulama
uffff
Poslyš máš nějaké trauma o kterém nevím a měl bych vědět? Jseš poznamenaný DSkem a s odporem k mezerám??
Nuly jsou špatně, pokud si si jist že tam opravdu alokuje ty, cokoliv mimo mezery je ZLE!
Nula ukončí řetězec předčasně, jiné věci dělají ten tvůj maglajz, už se mnou nepolemizuj, použij tu přílohu, a na příští experimenty se přesídli do cirkusu, jistě tě ocení. :-))
PS jsem horník fárám od nevidim do nevidim..
ake experimenty
inak na betón bude vlozeny ds 30
inak neviem co je ds a db
skusal som tvoj kód v mojom prostredí ...
nechaj tak ...
robil so to v MASM alebo EasyCode
dik za pomoc ,za trpezlivosť...pánboh zaplat
zišli by sa mi nejake príklady na 8086
možno ti ukazem správne riešenie pre moje prostredie(''robime'' v nom v skole)
dobru noc (dobre ráno)
já si to nechal překládat v zabudovaném hexa translátoru toho simulátoru.
Chutné poobědvání, večer ti nějaké stříbrné = ty lepší kousky pošlu na mail ... (př.8086 a výš)
s vama se vubec protrhl pytel, na forech se to jen hemzi tvejma 8080 kolegama :-)
este som netestoval hry ,ale prečo nie ,profesor mi na strednej hovoril ,ze sa dá na tom zarobiť ,posli niečo uvidím :smile2:
mimochodom čo je ds a db
mam to teraz tazke v skole: 2zadania z programovania v C , kadejake male písomky,zapoctovky,labaky z fyziky,diskrétna matika,elektrotechnika,umela inteligencia a nas assembler 8086
dá sa spustit NASM z prikazoveho riadku?
keď si si ty našiel čas ,ja si nájdem,keď chceš posli mi to
vhodny príklad predosla úloha v 8086
Pascal ovládam celkom dobre,hry v som v nom nerobil,keby ma to niekto naučil...,som dosť vytazeny... diky za programy,ten v cecku devc hlasi chyby pri kompilacii :smile2:
dobru noc (dobre ránko)
DS je alokace paměti podobně jako DB.
Na místě kde to napíšeš se buďto nechá vytvořit onen vypisovaný text, čísla, proměnné
nebo prostě jen volný prostor o velikosti v bytech dané číslem. U toho DS je nejasné
co v něm bude, na začátku nuly ale pokud je paměť nějakým způsobem
přesznovuvyužita už tam nebudou(program takové úseky nemá sám v sobě vyplněny a
jen návěští slouží pro identifikaci místa paměti narozdíl od DB '123', které můžeš v
přeloženém kódu vidět).
Ale u 8086 to bude kolidovat s klíčovým slovem pro DS segment, tam budeš muset
přes pole tozn. DUP (navíc to tasm ani nezná).
Nasm používám vyjímečně, mám tu Masm(Win), Tasm. A na kompilaci si stáhni něco ze zlatého
fondu: https://downloads.embarcadero.com/free/tc201
----
Na ten job, když budeš mít vysokou úroveň, tak tě samozřejmě zaplatim.
Pokud vývoj sám nezabalim, což je nadmíru ošemetné (pro oba), ale normální :].
Projektů k testování mám vlastně víc.
To red : V Assembleru?
Tu som posielal nejaké linky kde sa môžeš o ASM niečo priučiťhttp://programujte.com/?akce=diskuze&kam=vlakno&tema=15153-zaciname-v-assembleru. Nemalo by to byť ťažké - pozri si a ak budeš potrebovať pomôcť tak stačí napísať;-) A nepovedal si aký Assembler používaš. A ten vstupný text má byť len uložený v dátovom segmente, alebo ho čítaš zo vstupu, prípadne zo súboru?
když mi zaplatíš skrz PayPal pošlu ti to hotový pro Altair. Jinak nic na tom neni. Někam si šoupneš úvodní znak, někam poznamenáš že byl v průběhu neidentický, pokud skutečně nebyl, pak vypíšeš. Stačí určitě numerický výstup do 99 jedenkráte vydělením desítkou. Mám to tu, jestli máš z ASM kopřivku, nebudeš to nikdy v budoucnu potřebovat - pak svůj zájem projev na mém mailu, za nějaký rozumný obnos to k tobě doputuje. Vyšlo mě to na 78 řádek i mezerama. Fakt se to dá zvládnout - naučením pár základních instrukcí.
Caute, potreboval by som trochu pichnout s tym asm i8080 kedze s nim mam skusenost len defakto z troch hodin v skole
cize
moja uloha znie
"vypis pocet slov ktore obsahuju len velke pismena"
takze pre jednoduchost, pseudokod vyzera nejako takto
while koniec_vstupu != true {
while s[i] != medzera{
if s[i] = velke pismeno {
pocet_velkych++ //pocet velkych pismen v slove
}
pocet_pismen++ //pocet vsetkych pismen v slove
}
if p_v == p_p {
pocet_slov++ //pocet slov s len velkymi pismenami
}
}
cize celkom simple, len to neviem velmi hodit do asm, trochu mam problem nastavit tie jumpy
viem ako osetrit ci je to velke pismeno cize
CPI 'A'
JC navestie
CPI 'Z'+1
JNC navestie
INR pocet_velkych
dik
možná zbytečně složitý, stačí ti nahrát třeba přes mvi c,1 takhle hodnotu že nebylo velké písmeno, nikde neporovnávej počty a jen si ověř, že registr c je rovný 0, když neni tak počítadlo slov zůstane nezměněný. Na začátku nějaký lxi h,vlozene na konci přidat 48 pro vypsání znaku, příp. předtim vydělit deseti..
Nazdar, tak ako podarilo sa ti urobit to zadanie, lebo ja mam podobne, len mam to urobit pre male pismena, (len mi tam nejde pocitadlo a vypis)
vedel by si mi psolat to tvoje zadanie aby som si to pozrel?
DIKY
Nazdar, tak ako podarilo sa ti urobit to zadanie, lebo ja mam podobne, len mam to urobit pre male pismena, (len mi tam nejde pocitadlo a vypis)
vedel by si mi psolat to tvoje zadanie aby som si to pozrel?
DIKY
Nazdar, tak ako podarilo sa ti urobit to zadanie, lebo ja mam podobne, len mam to urobit pre male pismena, (len mi tam nejde pocitadlo a vypis)
vedel by si mi psolat to tvoje zadanie aby som si to pozrel?
DIKY
mozes mi to ursus poslat?
fakt by mi to pomohlo, ja skusim ten prevod poriesit s potom ti dam vediet
DIKY
cize si tovnaky ako deviant cpo no diky, myslel som ze pomozes
tu moj kapitalisticky kolega uz to povedal
Ta máš dajme tomu 24 vyhovujúcich slov, porovnáš s 10, je to väčšie, takže odčítaš 10, ale inkrementuješ nejaké počítadlo desiatok. Ciže máš 14 a v napr. d 1...zas odčítaš...máš 4 čo už je menšie ako 10 - to sú jednotky. A v tom d máš 2 - to sú desiatky.
mam problem s assemblerom.. vcera som na to pozeral asi 4 hodiny, ale neviem na to prijst.. tu je zdrojak..
org 1000
dcx sp ; inicializacia zasobnika (0FFFFh)
lxi h,text1
call putstr ; vypis text1
lxi d,vlozeny ; adresa pre vstup retazca
call getline ; nacitaj z klavesnice
lxi b,vlozeny
mvi d,0
mvi c,0 ; ?
char_loop:
ldax b
inx b
cpi 10 ; koniec vstupu?
jz char_end
cpi 13
jz char_end
cpi 'A'
jc male
cpi 'Z'+1
jnc male
jmp char_loop
char_end:
lxi h,text2 ; vypis kolko slov s velkymi pismenami
call putstr
hlt
include 'examples\8080\include\getchar.inc'
include 'examples\8080\include\getline.inc'
include 'examples\8080\include\putstr.inc'
include 'examples\8080\include\putchar.inc'
include 'examples\8080\include\newline.inc'
text1: db 10,13,'Vloz text: ',0
text2: db 10,13,'Koniec ',0
vlozeny: ds 30
male:
mvi c,2
jmp char_loop
hlt
pracujem v emuStudiu .. ide mi tam o to, ze chcem aby ked na vstupe zadam male pismeno tak aby mi to skocilo na navestie "male" .. viem ze to teraz nic neriesi, ale ako priklad.. Vsetko ide v poriadku, pokial nestlacim "Enter" .. ak ho stlacim tak by malo skocit na char_end, vypisat hlasku a program ukoncit.. ale nestane sa tak.. namiesto toho sa to zacykly a v jednom kuse skace na male.. neviem proste prijst na to, ze ako je to mozne.. nevie niekto ako na to?
To goro : pozor, obsah registru C nemen, je pouzivanej jako ukazatel propojene k B (adresy jsou 16bitove), vyuzij D,E. Nebo jako ukazatel vyuzij tradicnejsi H.
Ja uz tomu nechapem.. zmenil som vsetky registre c na h .. ale "male" si potrebujem trochu upravit.. potrebujem dat h do akumulatora, porovnat ci sa tam nenachadza 0 a ak hej tak do h vlozit 1 .. spravil som to takto:
male:
mov a,h
cpi 0
jz pripis_1
ret
pripis_1:
mvi h,1
ale akonahle dam aspon jedno male pismeno tak sa mi to zase zacykli..neviem si s tym rady ;/ .. skusal som vsetky registre a aj tak to robi ;/ .. vie niekto preco?
nazdar mam vypisat pocet slov v dekadickej sustave ktore obsahuju len male pismean , ale nejde to , vie mi niekto pomoct
org 1000
dcx sp ;inicializacia zasobnika (0FFFFh)
lxi h,text ;vypis text
call putstr
lxi d,vlozeny ;adresa pre vstup retazca
call getline
lxi b,vlozeny
mvi d,0 ;pocet vsetkych znakov v slove
mvi e,0 ;pocet malych pismen v slove
push psw ;vlozime si nulu do zasobnika, pocet vyhovujucich slov
jmp char_loop
char:
mvi e,0
mvi d,0 ;vynulovanie pocitadla
char_loop: ;citanie znakov a pocitanie pismen
ldax b ;nacitanie znaku z retazca
inr d
inx b ;posun v retazci doprava
cpi 10 ;porovnanie pre koniec nacitavania, enter
jz koniec_nacitania ;
cpi 32 ;porovnanie na koniec slova, space=medzera
jz pocet_slov
cpi 'a' ;vacsie alebo rovne ako a
jc char_loop
cpi 'z' + 1 ;mensie alebo rovne ako z
jnc char_loop
inr e ;zvysenie poctu pismen o 1
jmp char_loop
pocet_slov: ;pocitanie vyhovujucich slov
mov a,d ;presun hodnoty z registra D do akumulatora
cmp e ;porovnanie akumulatora a registra E
jc char ;ak je pismen malej abecedy menej skoc na char
pop psw ;vyber zo zasobnika do akumulatora
inr a ;zvysenie poctu vyhovujucich slov
push psw ;vlozenie z akumulatora do zasobnika
jmp char
koniec_nacitania: ;osetrenie ak sme spracovali posledne slovo
mov a,d
cmp e
jc vypis
pop psw
inr a ;zvysenie poctu vyhovujucich slov
push psw
jmp vypis
vypis:
lxi h, text2
call putstr
mov a, d
adi '0'
call putchar
call newline
hlt
include 'examples\8080\include\getline.inc'
include 'examples\8080\include\putstr.inc'
include 'examples\8080\include\putchar.inc'
include 'examples\8080\include\newline.inc'
text: db 'Program vypise pocet slov(v dekadickom tvare) , ktore obshuju pismena malej abecedy', 10,13,10, 'Zadaj retazec: ',0
text2: db 10,13,'Vysledny pocet: ',0
vlozeny: ds 30
myslim že na konci to špatně taháš z registru D a máš to na zásobníku, velmi pravděpodobně jsi slepil různé kódy a nemáš šajnu vo co go :D
Vie mi niekto poradit kde robim chybu program ma spocitat pocet slov obsahujucich viac cislic ako pismen malej abecedy
org 1000
dcx sp ; inicializacia zasobnika (0FFFFh)
lxi h,text1
call putstr ; vypis text1
call getline
lxi b,vlozeny
mvi d,0 ; pocitadlo cislic
mvi c,0 ; počítadlo malých písmen
mvi e,0 ; slov ktore obsahuju viac čísel ako písmen
; malej abecedy
zaciatok:
ldax b ; načíta sa zadaný znak do registra'a'
inx b ; posun znaku
cpi 13 ; porovná sa register 'a' s ENTER
jz vypis ; ak sa rovná skočí na výpis
cpi 32 ; porovná sa register 'a' s SPACE
jz test ; ak sa rovná skočí na TEST
cpi '0' ; väčšie alebo rovne 0
jc otestuj ; menej ako '0'?
cpi '9'+1
jnc otestuj ; menšie alebo rovne 9+1
inr d ; Ak je to číslo tak inkrementuje d o 1
jmp zaciatok
otestuj: ; Zistíme či je to malé písmeno
cpi 'a' ; Vacsie alebo rovne ako a
jc zaciatok
cpi 'z' + 1 ; Mensie alebo rovne ako z
jnc zaciatok
inr c ;Ak je to malé písmeno tak inkrementuje e o 1
jmp zaciatok
test:
mov a,d ; Presuň hodnotu z registra d do akumulátora
cmp c ; Porovnaj akumulátor s registrom d
inr e ; Ak je počet čísel menej ako počet malých písmen incrementuj e
jc zaciatok ;skoc na zaciatok
vypis:
lxi h, text2
call putstr
mov a,c
adi '0' ; hodnota a jej ASCII tvar ...
call putchar
call newline
hlt
include 'examples\8080\include\getline.inc'
include 'examples\8080\include\putstr.inc'
include 'examples\8080\include\putchar.inc'
include 'examples\8080\include\getchar.inc'
include 'examples\8080\include\newline.inc'
text1: db 'Pocet slov obsahujucich viac cislic ako písmen malej abecedy ...',10,13,'Vloz text: ',0
text2: db 10,13,'Pocet slov obsahujucich viac cislic ako pismen malej abecedy je: ',0
vlozeny: ds 30
jste všicí se svým kopírováním hotovek na jedno brdo a už to začíná být skoro otravné :/
ahojte :) poprosila by som vás len skontrolovať či mám program dobre, malo by to byť tak, ale človek nikdy nevie a v asm som iba začiatočníčka, ďakujem dopredu :)
Načítajte z klávesnice reťazec znakov ukončený znakom "nového riadku". Slová vo vstupe sú
oddelené najmenej jedným znakom "medzera". Uvažujte aj prvé, resp. posledné slovo vstupu.
Určte počet slov obsahujúcich len písmena veľkej abecedy.
počet (0-255) vytlačte šestnástkovo
org 1000
start:
dcx sp ; inicializacia zasobnika (0FFFFh)
lxi h,text1
call putstr ; vypis text1
lxi d,vlozeny ; adresa pre vstup retazca
call getline ; nacitaj z klavesnice
lxi b,vlozeny
mvi d,0 ; pocitadlo cislic
mvi h,1
char_loop:
ldax b
inx b
cpi 10
jz enter
cpi 13
jz enter
cpi 32
jz space
cpi 'A'
jc bad
cpi 'Z'+1
jc uc
jmp bad
enter:
mov a,h
cpi 2
jnz output
inr d
jmp output
space:
mov a,h
cpi 2
jz ok
mvi h,1
jmp char_loop
bad:
mvi h,0
jmp char_loop
uc:
mov a,h
cpi 0
jz char_loop
cpi 1
jnz char_loop
inr h
jmp char_loop
ok:
inr d
mvi h,1
jmp char_loop
output:
lxi h,text2 ; vypis text2
call putstr
mvi e,2
hexa_loop:
mov a,d
rlc
rlc
rlc
rlc
mov d,a
ani 15
cpi 10
jc num
adi 'A'-10
jmp next
num:
adi '0'
next:
call putchar
dcr e
jnz hexa_loop
call newline
jmp start
include 'examples/8080/include/getchar.inc'
include 'examples/8080/include/getline.inc'
include 'examples/8080/include/putstr.inc'
include 'examples/8080/include/putchar.inc'
include 'examples/8080/include/newline.inc'
text1: db '8b) Urcte pocet slov obsahujucich len pismena velkej abecedy.',10,13,'Vloz text: ',0
text2: db 10,13,'Pocet: 0x',0
vlozeny: ds 30
sorry ale dala som zlý zdroják.
org 1000
dcx sp
start:
lxi h,text1
call putstr
lxi d,vlozeny
call getline
lxi b,vlozeny
mvi d,0
mvi h,1
char_loop:
ldax b
inx b
cpi 10
jz enter
cpi 13
jz enter
cpi 32
jz space
cpi 'A'
jc bad
cpi 'Z'+1
jc uc
jmp bad
enter:
mov a,h
cpi 2
jnz output
inr d
jz overflow
jmp output
space:
mov a,h
cpi 2
jnz new_word
inr d
jz overflow
new_word:
mvi h,1
jmp char_loop
bad:
mvi h,0
jmp char_loop
uc:
mov a,h
cpi 0
jz char_loop
cpi 2
jz char_loop
inr h
jmp char_loop
overflow:
lxi h,text3
call putstr
hlt
output:
lxi h,text2
call putstr
mvi e,2
hexa_loop:
mov a,d
rlc
rlc
rlc
rlc
mov d,a
ani 15
cpi 10
jc num
adi 'A'-10
jmp next
num:
adi '0'
next:
call putchar
dcr e
jnz hexa_loop
call newline
jmp start ;hlt
include 'examples/8080/include/getline.inc'
include 'examples/8080/include/putstr.inc'
include 'examples/8080/include/putchar.inc'
include 'examples/8080/include/newline.inc'
text1: db '8b) Urcte pocet slov obsahujucich len pismena velkej abecedy.',10,13,'Vloz text: ',0
text2: db 10,13,'Pocet: 0x',0
text3: db 10,13,'Bol prekroceny pocet 255!',0
vlozeny: ds 30
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
POmoc s assembler 8080 pls — založil firinko
Assembler 8080 vypis do binarky — založil Richard
Assembler pomoc — založil pontiac
Pomoc- Assembler — založil Martin
Pomoc s assembler 86 — založil firin