ahojte. mám problém so zadaním programu ktorý má z načítaných slov zistiť počet tých, ktorých súčet ascii kódov v slove je väčší ako 200 (slová sú oddelené medzerou).
budem rád každej pomoci, lebo doteraz som programoval iba vo vyšších jazykoch a mám trochu problém myslieť v assembleri, prípadne ma opravte ak som aj nesprávne "uvažoval" pri riešení problémov. prečítal som zopár manuálov o i8080 ale okrem vysvetlenia inštrukcií som sa z nich toho veľa nedozvedel.
slová som načítaval zo vstupu a ukladal si vstup po znakoch do akumulátora. program prejde na výpis výsledku pri konci vstupu.
fragment kódu :
Kód:
cyklus: pop PSW ;vyber znaku zo stacku
cpi 0 ;zistenie posledneho znaku
jz vystup ;ak bol zisteny posledny znak prejdeme na vystup
mov C,A ;odpamatanie znaku
sui ' ' ;odcinanie od hodnoty znaku v akumulatore hodnotu medzer
jnz je_znak ;ak vysledkom nie je nula tak znak nebol medzera a skocime
mvi C,0 ;nulujeme registre
mvi D,0
mvi H,0
jmp cyklus ;pokracujeme na dalsi znak
je_znak: mov A,C ;nacitanie znaku
add D ;pripocitame predchadzajuce hodnoty znakov v slove
mov D,A ;zapamatame si vysledok
sub E
jc cyklus ;ak je vysledok nulovy tak mame sucet prave 200
inr H ;inkrementovanim si nastavime priznak prekrocenia hodnoty 200
mov A,H ;prenesenie do akumulatora
cpi 1 ;
jnz cyklus ;ak uz bol raz nastaveny priznak v slove (>1) tak neinkrementujeme pocet slov
inr B ;inkrementacia poctu vyhovujucichslov
jmp cyklus ;pokracujeme na dalsi znak
chybou môjho programu, ktorú som nevedel ako vyriešiť je zistenie "vyhovujúceho" slova. v programe (konkrétne od návestia je_znak) som na to išiel tak, že som hodnotu aktuálneho znaku pripočítal k hodnote predchádzajúcich znakov v slove a potom od tej hodnoty som odčítal 200 (z registra E) za predpokladu ak bol výsledok záporný (nastal carry) tak ešte znaky v slove nemajú súčet viac ako 200. v opačnom prípade máme už vyhovujúce slovo.
no problém som mal v tom, ak pri sčítavaní hodnôt znakov som dostal hodnotu väčšiu ako 255. napríklad:
slovo "aaa" má hodnotu znakov >200 (291). a tak po pripočítaní 3. znaku som mal v akumulátore hodnotu 36, ktorú si program aj zapamätal a pokračoval v chybnom výpočte.
preto sa pýtam. je nejaký iný spôsob akým riešiť to overovanie znakov v slove? alebo ako vyriešiť sčítavanie hodnôt s výsledkom >255 ?
ešte raz budem veľmi vďačný za každú pomoc.