Len tak mimochodom je pekne že assembler ale myslým si že by mohol byt rozdiel kde ten assembler je či to na nejakom 80XX mikroprocesore či v C-čku či v Pascale ? či kde ? medzi tými číslami vidím rozdiel v Bitoch nemôže to byt tým ? skus cislo 256 ci ti pojde a cislo 258
konkretne je to v MASM na procesory 80586.
cislo 256 aj 258 funguju. funguje to aj ked chcem vydelit cislo 500 ale cislo 600 uz nemozem. aj vdebbugery mi to zastane na riadku DIV.
AX mam 16 bitovy. vysledok by sa mal ulozit do AL a zbytok po deleni do AH.
ano mas pravdu. ked cislo 600 videlim 3 tak to ide lebo je vysledok v 8 bitoch. tak ako mam potom napisat program 600/2? myslel som si ze ak sa to nezmesti do 8 bitov tak to automaticky prevedie do 32 bitoveho registra EAX. alebo dvojice registrov AX:DX
hmm neviem moc podrobnosti ako to funguje mal som to už dávnejšie a len tak okrajovo ale čo tak to vydelit 4mi a potom vynasobit 2voma ? nasobenie ti bere celý AX register ?
ano je to riesenie. pri nasobeni ak sa utvori vatsie cislo ako je tak to automaticky prevedie do vatsieho registru to znamena ze ak vysledok by bol vatsi ako FFFF tak ho hodi do EAX alebo pri 16bitovom pocitaci do DX:AX. ja by som vsak rad vedel ci to nejde inak ako najprv videlit a potom nasobit.
//autoeditácia príspevku ( 04 Dec 2009, 14:23 )
uz som na to dosiel. ak ma byt vysledok 16bitovy musim mat vynulovany DX register a delenec musi byt tiez 16 bitovym registrom. vysledok sa ulozi do registra AX a zvysok po deleni do DX.takze takto mi to ide:
marti12 napísal:ano je to riesenie. pri nasobeni ak sa utvori vatsie cislo ako je tak to automaticky prevedie do vatsieho registru to znamena ze ak vysledok by bol vatsi ako FFFF tak ho hodi do EAX alebo pri 16bitovom pocitaci do DX:AX. ja by som vsak rad vedel ci to nejde inak ako najprv videlit a potom nasobit.
//autoeditácia príspevku ( 04 Dec 2009, 14:23 )
uz som na to dosiel. ak ma byt vysledok 16bitovy musim mat vynulovany DX register a delenec musi byt tiez 16 bitovym registrom. vysledok sa ulozi do registra AX a zvysok po deleni do DX.takze takto mi to ide:
Musí. Ak delíš wordom (16 bitovým číslom), tak sa v 16 bitovom móde použije dx:ax (takže ak by si nevynuloval dx, dostal by si viac-menej náhodný výsledok).
chrono napísal:Musí. Ak delíš wordom (16 bitovým číslom), tak sa v 16 bitovom móde použije dx:ax (takže ak by si nevynuloval dx, dostal by si viac-menej náhodný výsledok).
Preco teda "viac-menej", ked si tak skalopevne prsvedceny?
Nic v zlom, ja som to vzal trosku plytko a riesil som len vyhradne odstanenie chyby. Ved ten register moze mat cisty pred pouzitim, vtedy netreba mazat nic. Zalezi od situacie. Asm je na usetrenie kazdeho bajtu kodu. V tom je jeho sila
Preto, lebo tá náhodnosť závisí od obsahu registra dx (a v ňom kľudne môže byť stále to isté číslo, prípadne sa dá jednoducho predpovedať, takže ten výsledok nemusí byť úplne náhodné číslo).
Ušetriť jeden bajt (alebo koľko zaberá inštrukcia xor dx, dx) nemusí byť najvhodnejšie riešenie, hlavne ak potrebuješ správny výsledok.
no ja som to skusal a aby mi to slo tak register DX musim vynulovat. ak mam v registri DX napriklad cislo 2 a spustim program tak mi to vypise uz vysie spominane chybove hlasenie. nechapem tomu preco sak by to mal prepisat ak tam nieco je ale aj tak som aspon tatkto spokojny ze je problem vyrieseny.
Ak máš v dx 2 a delíš to dvomi, tak to tiež pretečie (tentoraz nie 8 bitov, ale 16 bitov).
Inak ak delíš dvomi, tak je lepšie používať posun bitov (je to rýchlejšie) a teda niečo ako shr ax, 1. Ak ale potrebuješ deliť číslom, čo nie je mocninou dvoch (a to číslo je známe už pri kompilovaní) rýchlejšie je použitie násobenia (ale má to zmysel hlavne ak násobíš veľa krát).