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.