4.12.2003

OPTIMALIZACE V ASSEMBLERU

Filed under: Uncategorized — nax @ 21:34

Supr, vcera se mi konecne podarilo najit zkraceni o jeden byte v uloze 3. Probeh hledani byl vazne drsny. Jak jsem psal uz minule, tak jsem se ruznym zkousenim zabyval skoro cely vikend, ale bezvisledne. Az v utery se mne napadlo zkouset ruzny alternativni postupy na kousek tohohle kodu:
shl al,1
mov ah,1fh
jnc print
mov ah,31h
Inicializuji se tu barvy podle toho, jestli je klavesa stiskla nebo ne (nejvisi bit AL po out 60h). Ty cisla jsou ale tak desne zvolena, ze zadny trik s pricitanim ani odcitanim nefunguje. Ale dohromady to ma 8B, to by v tom byl cert, aby to neslo zkratit! Pak jsem zkousel rozsirit ten horni bit na cele CH rotacema, ale vzdy to pak vyslo dost bitu, a musel bych udelat max na 2B z toho to cislo.

No a pak jsem si pri prednasce zrovna ze SOJ listoval instrukcnim souborem a narazil jsem na sqelou instrukci cbw realizujici znamenkove rozsireni AL – jinak receno podle nejvyssiho bitu AL budou vsechny bity v AH nula nebo jedna.

Na 1B jsem tak udelal to co sem predtim delal na nekolik B. Jeste pri prednasce jsem si vymyslel posloupnost OR, XOR, AND a bezel jsem to zkusit do pocitacove ucebny. Jenze skramani se dostavilo a misto ocekavanych 7B to melo 10B. Kazda z tech bitovych operaci totiz s primim 1B operandem zabrala celkem 3B. No a ve stredu rano jsem se probudil a jeste v polospanku jsem si najednou uvedomil, ze by stacila kombinace AND a XOR! Ne ze bych rovnou vedel reseni, ale proste jsem si najednou bil jist, ze existuje takova kombinace, kde to jde jen s pouzitim tehlech 2 instrukci.

cbw
and ah,00101110b
xor ah,00011111b

Jenze dalsi zklamani bylo, kdyz jsem si uvedomil ze do te 99B dlouhe verze to nenapasuju kuli tomu, ze dal pri prevodu na ascii se pocita s tim predchozim posuvem, ktery mi tam chybi 🙁 Smula. Uz jsem v pul dvanacte dopolende vypinal pocitac a jen zhasla obrazovka uvedomil sem si, ze v te 104B verzi, ale ten posuv neni. Zapnul jsem znovu komp, pockal jsem az nabehl pocitac a poslal jsem to. No a ted uz vim jiste ze zapocet dostanu, protoze za kazdy 1B ktery tam najdu je o jeden stupen lepsi znamka nez vychazi.

No a musim uznat ze jsem za tech nekolik dni pronikl do assembleru daleko vic nez pri programovani vsech tech 5ti uloh dohromady. A libi se mi to cim dal vic. Dokonce jsem stratil uplne zajem o tu svoji uzasnou semestralku (tcp sniffer) i kdyz pokud tam ty 2B nenajdu tak ji asi urcite pres vanoce napisu. Ale cim dal vic me laka dozvedet se neco o assembleru na palma – pravda je to naprosto totalne jinej procesor, takze jinej instrukcni soubor — jenze kdyz tam skutecne de o kazdej byte, kdyz tam se skutecne projevi kazda optimalizace….

BTW ta dnesni pisemka z NLP na kterou jsem se pro same optimalizace moc nestihl ucit asi nakonec dopadne docela dobre.

Comments are closed.

Powered by WordPress