ASM kódoptimalizációs verseny - Eredményhirdetés

Meg kell mondanom, nagyon szomorú vagyok... A jelentekezok száma nagyon kicsi volt... pontosabban csak egy vállalkozó szellemű egyén volt. Szabby a Stony Cracker Team-ből. Nem tudom mi van a mai fiatalokkal, miért nem becsülik az assemblert. Pedig nem szabad elfelejteni, ez az alapja mindennek! Es már csak pusztán tiszteletbol illik tudni... Visszatértve a versenyhez... Az eredeti feladat így hangzott: A cél, egy elore megadott program minnél kisebb, futattható változatát létrehozni. Egy egyszeru kis programról van szó, amely megnézi, hogy a DosNavigator rezidens-e vagy sem, és ezt tudatja a felhasználóval. A vereny kikötése még az volt, hogy egy külso szemlélo ha elindítja a programot, ugyan azt lássa mint amit ez a progy csinál, tehat vizuálissan egyezniük kellet, magyarul ugyan azt kellet hogy kiíra a képernyore, mint az eredeti progi. Az alap progi forrása itt látható (orginal.asm), melyben megtalálsz minden további lényeges információt amire szükséged lehet. (ez a program lefordítva egy 108 bytes COM-ot ad) ;DosNavigator checker. code segment assume cs:code,ds:code org 100h start: mov ah,99h ; This part checks, that mov al,00h ; DosNavigator is loaded int 02fh ; Into memory or not. cmp bx,0444eh ; If bx="DN" then it is installed je @2 xor ax,ax ; If DN not found mov ah,09h lea dx,msg2 int 021h jmp @1 @2: xor ax,ax ; If we found DN... mov ah,09h lea dx,msg1 int 021h @1: mov ax,4c00h ; Exit to dos int 21h msg1 db "Dos Navigator founded in memory!$" msg2 db "Dos Navigator not founded in memory!$" code ends end start Szabby-nak 72-ra sikerült összenyomnia a programot, az ő változatát itt talalod. Ő is rájött egy két dologra, de azért még maradt egy pár dolog, ami figyelmét elkerülte. (de azért minden dicséretet megérdemel, mert ő legalább megpróbálkozott vele) A legkisebb, mindössze 60 byteos programot egyik jóbarátommal és mentorommal írtuk meg, MiB-el. Akkor lássuk az optimalizált programot (winner.asm), majd aztán a magyarázatra is sor kerül. code segment assume cs:code,ds:code org 100h start: mov ah,99h int 2Fh mov ah,09h ; Print message function lea dx,msg1 int 21h or bx,bx ; Does bx==0? mov dl,offset msg2-100h ; Because dh alredy setted jnz @2 ; If it isn't then probaly it is "DN" mov dl,offset msg3-100h ; Because dh alredy setted @2: int 21h ret msg3 db "not " msg2 db "founded in memory!$" msg1 db "Dos Navigator $" code ends end start Ez a program 60 byteos (106-60=46!). Nézzük, hogyan optimalizáltuk, miket vettünk figyelembe, milyen módszereket alkalmaztunk: - A regiszterek a program indulásakor 0-t tartalmazznak, tehát a nullázással nem kell törődnünk. - A kiírandó két szöveg csak a "not" szócskában tér el, tehát megfelelően feldarabolva "sűríteni" lehet - A szövegek offsetje mindig 100h felett van, de ha ezt a legelején beállítjuk, akkor a maradék belefér a dl-be, tehát ezen is egy byteot nyertünk - A COM progamokat ret-el visszaadják a vezérlést a DOS-nak (feltéve hogy semmi se maradt a verembe) Végül is ennyi volt az egész... igaz egy másfélhetet elszórakoztunk vele... a végén byte-ról byte-ra faragtuk le a progi nagyságát... Szerintünk rövidebre NEM lehet megírni..... ha mégis sikerülne valakinek, akkor annak egy este én állom az ital számláját.... Formater [FCF]

©2000. Fearless Criminal Force.