delenie v ASSEMBLERI

Programovacie jazyky, rady, poradňa...
marti12
Amateur
Amateur
Príspevky: 12
Registrovaný: 02 dec 2009, 20:56

delenie v ASSEMBLERI

Príspevok od používateľa marti12 »

vie mi niekdo poradiť, vysvetliť?
chcem vydeliť číslo napríklad 612 dvoma. keď spustím tento kód vypíše sa mi chybové hlásenie:
V aplikaci MyFirstProg.exe došlo k problému a je třeba ji zavřít. Omlouváme se za vzniklé potíže.
kde je problém?

Kód: Vybrať všetko

mov cl,2  
mov ax,612
div cl
ale podobny program z inymi cislami funguje.

Kód: Vybrať všetko

mov cl,2  
mov ax,50
div cl
[/code]
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Príspevok od používateľa c-ice »

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

že ten akumulator AX máš kolko bitový ?
marti12
Amateur
Amateur
Príspevky: 12
Registrovaný: 02 dec 2009, 20:56

Príspevok od používateľa marti12 »

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.
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Príspevok od používateľa c-ice »

odpoved si si prave napísal ;) ked vydeliš 512 => 256 8bitov vydeliš niečo viac 9 Bitov ako chceš zmestit 9bitov do 8bitoveho "registra" AL ?
marti12
Amateur
Amateur
Príspevky: 12
Registrovaný: 02 dec 2009, 20:56

Príspevok od používateľa marti12 »

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
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Príspevok od používateľa c-ice »

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 ?
marti12
Amateur
Amateur
Príspevky: 12
Registrovaný: 02 dec 2009, 20:56

Príspevok od používateľa marti12 »

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:

Kód: Vybrať všetko

mov dx,0
mov cx,2
mov ax,600
div cx
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Príspevok od používateľa Gregi »

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:

Kód: Vybrať všetko

mov dx,0
mov cx,2

mov ax,600
div cx
Podla mna dx vynulovany nemusi byt. No tych 16b musis mat vsetky reg. ak s nimi chces pracovat. Taze si to odhalil v podstate spravne
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

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).
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Príspevok od používateľa Gregi »

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 :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

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. :)
marti12
Amateur
Amateur
Príspevky: 12
Registrovaný: 02 dec 2009, 20:56

Príspevok od používateľa marti12 »

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.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

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).
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Re: delenie v ASSEMBLERI

Príspevok od používateľa beluský »

potrebujem v assemblery spravit 3 jednoduche zadania... samozrejme nie zadarmo... podujme sa niekto?
o-lox
Novice
Novice
Príspevky: 4
Registrovaný: 19 máj 2009, 8:06

Re: delenie v ASSEMBLERI

Príspevok od používateľa o-lox »

jak to spěchá? jestlis to ještě nikomu nenandal na záda, tak mi pošli ty zadání přes SS nebo je napiš tu.
Napísať odpoveď