{"id":56,"date":"2003-12-04T21:34:04","date_gmt":"2003-12-04T21:34:04","guid":{"rendered":"https:\/\/143-42-55-146.ip.linodeusercontent.com\/?p=56"},"modified":"2003-12-04T21:34:04","modified_gmt":"2003-12-04T21:34:04","slug":"optimalizace-v-assembleru","status":"publish","type":"post","link":"https:\/\/nax.cz\/?p=56","title":{"rendered":"OPTIMALIZACE V ASSEMBLERU"},"content":{"rendered":"<p>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:<br \/>\nshl       al,1<br \/>\nmov       ah,1fh<br \/>\njnc       print<br \/>\nmov       ah,31h<br \/>\nInicializuji 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.<\/p>\n<p>No a pak jsem si pri prednasce zrovna ze SOJ listoval instrukcnim souborem a narazil jsem na sqelou instrukci cbw realizujici znamenkove rozsireni AL &#8211; jinak receno podle nejvyssiho bitu AL budou vsechny bity v AH nula nebo jedna.<\/p>\n<p>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.<\/p>\n<p>cbw<br \/>\nand       ah,00101110b<br \/>\nxor       ah,00011111b<\/p>\n<p>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 \ud83d\ude41 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.<\/p>\n<p>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 &#8211; pravda je to naprosto totalne jinej procesor, takze jinej instrukcni soubor &#8212; jenze kdyz tam skutecne de o kazdej byte, kdyz tam se skutecne projevi kazda optimalizace&#8230;.<\/p>\n<p>BTW ta dnesni pisemka z NLP na kterou jsem se pro same optimalizace moc nestihl ucit asi nakonec dopadne docela dobre.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-56","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts\/56","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=56"}],"version-history":[{"count":0,"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts\/56\/revisions"}],"wp:attachment":[{"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}