Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

DOS not compute!

Wyobraźcie sobie, że oglądacie kiepski film sci-fi, w którym robot przechodzi poważne spięcie. Dostał sprzeczne instrukcje, spotkał niecodzienny problem, został fizycznie uszkodzony. Co wykrzykuje taki robot?

Przypominam, to kiepski film a nie Odyseja Kosmiczna 2001. To nie HAL 9000 (I'm sorry, Dave. I'm afraid I can't do that.), nie wysublimowana maszyna, która stara się pogodzić etykę robotów ukutą przez Asimova z zaprogramowanymi procedurami, a nieskomplikowany obiekt z aluminiowych rur i z żarówkami zamiast oczu. Gapimy się w ekran telewizora i nie mamy wątpliwości, że w środku tej puszki siedzi człowiek. Biedny aktor, który nie dostał roli dzięki urodzie Brada Pitta, a dlatego, że jako jedyny mieścił się w kostiumie.

Trochę odbiegłem chyba od tematu. :-) Co powtarza taki robot? Does. Not. Compute. Jest to także reakcja jakiej oczekiwałbym od większości użytkowników vortalu, jeśli dostaną kod w assemblerze x86 do rąk. Dlatego zachowując odrobinę zdrowego rozsądku, postanowiłem oprzeć nowe zadanie o coś, co zapewne każdy użytkownik vortalu potrafi: uruchamianie programów. Prześledźmy zatem jak dzisiejsze wyzwanie powstawało.

r   e   k   l   a   m   a

Przygotowanie zadania opartego o ASM dla użytkowników różnych systemów jest stosunkowo problematyczne. W końcu nie bez powodu dobreprogramy oferują osobne pliki dla Linuksa i Mac OS X. Gdyby program odpalał się na czymkolwiek, nie mielibyśmy odpowiednich działów na stronie. Co zatem zrobić, żeby na każdej platformie dało się uruchomić aplikację? Oprzeć o DOS, platformę, której nie ma nikt!

A nie, przepraszam, nie chcę się wystawić na krytykę z cyklu "czyli nikt nie był w stanie tego zadania zrobić!". Rzecz w tym, że aplikacje pod DOS można uruchamiać w takim świetnym emulatorze jakim jest DOSBox. Wolne oprogramowanie, popularne, szalenie użyteczne. Mam je nawet od dawna w ulubionych. :-)

Pozostaje tylko znalezienie kompilatora, po który może sięgnąć każdy (dostępnego w sieci za darmo) i który pod DOSem działa. Dobrze, gdyby istniała też wersja na inne systemy. Pierwotnie kod był pisany dla Turbo Assemblera, ale komercyjny status tej aplikacji powodowałby, że zadanie byłoby wyłącznie "dla wybranych". A nie o to przecież chodzi. Wybór padł na flat assembler (znany także jako FASM), którego autorem jest Tomasz Grysztar. FASM dostępny jest zarówno pod DOS, Linuksa jak i Windows. Jest to stosunkowo istotne, bo daje większy wybór użytkownikom.

Czas na drobną uwagę. Dróg dojścia do wynikowego programu jak i sposobów uruchomienia go jest kilka. Jeśli mamy szczęście i pracujemy na 32-bitowym Windowsie, zarówno FASM pod Windows jak i FASM pod DOS powinny bez problemu skompilować kod, a wynikowa aplikacja uruchomi się w gołym systemie. Powinna być poprzedzona błędem, ale będzie działała. Jeśli użyjemy DOSBoksa, możemy w nim uruchomić kompilator i program wynikowy albo sam program wynikowy. Bez względu na system operacyjny!

Istnienie obu możliwości jest dosyć ważne, bo start FASM na "czystym" DOSBoksie może wymagać dodatkowego kroku - uruchomienia extendera takiego jak CWSDPMI. Nie jest to wiedza dzisiaj specjalnie powszechna, zdaję sobie z tego sprawę. Ale podkreślam, że nie jest to jedyna droga do rozwiązania. Ta elastyczność jednak, jak dowodzą komentarze, okazała się być dosyć osobliwym utrudnieniem dla części z grających.

Warto także dodać, że istnieje szereg innych opcji, których nie będę szerzej opisywał, jak np. wirtualizacja innego systemu, XP Mode w Windows 7 czy rzeczy, o których nie mam pojęcia, że są możliwe, ale na które wpadli zapobiegliwi użytkownicy vortalu. :-] Kawał dobrej roboty!

Bo widzicie, do tego zadania potrzeba kilku zdolności. Część z nich wydaje mi się typowa dla odwiedzających vortal: umiejętność instalowania aplikacji i podstawy obsługi Notatnika. No i są jeszcze te dwie szalenie ważne, bez których zadania nie da się rozwiązać: pomysłowość i upór.

Zadanie skonstruowane jest mniej więcej tak: weź F16, naklej w kokpicie karteczkę o treści "spytaj bufetową o godzinę, żeby wygrać" i postaw koło samolotu biorących udział w konkursie. Część powie: "zobaczę co jest w kokpicie, może mnie olśni". Część krzyknie "skandal! wymagają pilotowania myśliwca!" i z odpowiedzi zrezygnuje. Nie czuję się specjalnie winny, że właśnie tak skonstruowane jest to zadanie. Nie bez powodu ma w nazwie słowo "specjalne". :->

Zatem przepis na rozwiązanie jest tym razem stosunkowo prosty: pobrać DOSBox, pobrać FASM, pobrać program, kompilować i kombinować. Ale przede wszystkim: czytać treść zadania!

Fantastycznie! Lubię ASMa, Tato!
Powiedziała ruda Karolinka
Prosty jest ten szyfr - dodała - ale za to
Widzę, że we flincie flinta

Wierszyk może nie najwyższych lotów, ale jako rodzony Częstochowianin ponad rymy częstochowskie się raczej nie wzniosę. ;-) Wierszyk ma za zadanie informować o trzech rzeczach. Po pierwsze: podpowiada jaki kompilator jest potrzebny poprzez pierwsze litery słów z pierwszego wersu. Dla ułatwienia pogrubiłem je tutaj. Na stronie konkursowej były one wyróżnione kursywą. Po drugie: informuje, że mamy do czynienia z szyfrem. Po trzecie: podpowiada, że zadanie nie jest złożone z jednej tylko fazy.

"Flinta we flincie" to określenie (które wedle mojej wiedzy - proszę o sprostowanie w razie czego) pochodzi z magazynu Magia i Miecz, w którym to służyło do opisu przygód, w których wykorzystano więcej niż jeden zwrot fabularny. Flinta we flincie, strzelba ukryta w strzelbie, ostrze w ostrzu, zagadka w zagadce. Bo taki charakter ma dołączony do zadania kod.

format MZ

  push    cs
  pop     ds
  mov     cl, 77
  mov     si, MAGIC2

foo:
  mov     al, [si]
  cmp     cl, al
  je      bar

  inc     si
  add     bl, al
  xor     bh, bh

  mov     ah, 06h
  mov     dl, [MAGIC1+bx]
  int     21h
  jmp     foo

bar:
  mov     ax,4C00h
  int     21h

MAGIC1  db "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789, "
MAGIC2  db 12,244,6,2,250,26,9,222,254,36,246,7,2,248,1
        db 5,2,247,2,7,252,4,248,1,4,3,249,4,3,248,0,255
        db 9,255,1,248,2,1,5,247,6,3,248,1,6,1,253,0,77

Uruchomienie FASM jest naprawdę proste: w linii komend wpisujemy nazwę kompilatora (np. fasm.exe) i za nią nazwę pliku z kodem. Voila! Uruchamiamy wynikowy program i naszym oczom ukazuje się tekst:

MAGIC2 DB 18,238,13,6,237,37,221,9,245,17,239,77

Wystarczy rzut oka na kompilowany kod, by wpaść na przynajmniej kilka potencjalnych sposobów na wykorzystanie tego. Można podmienić jedną linię, a można podmienić trzy. Można też usiąść i płakać, ale zadania mają premiować wytrwałych, pomysłowych i chętnych do eksperymentowania a nie tych, których zaangażowanie kończy się na odczytaniu pierwszego wyniku z wyszukiwarki.

Nie wnikając w sposób działania tego kodu (jeśli istnieje takie zapotrzebowanie, mogę opisać w osobnej notce) dodam tylko, że zarówno podmiana jednej linii jak i trzech ostatnich dają oczekiwany rezultat. Bo jeżeli podmienimy odpowiedni fragment kodu, ponownie skompilujemy i uruchomimy program, naszym oczom pokaże się ostateczne rozwiązanie. Jakie? To nazwa miasta, w którym znajduje się główna siedziba Intela.

SANTA CLARA

I to jest odpowiedź na drugie zadanie specjalne. Wszystkim, którzy do niego dotarli gratuluję wzorowego podejścia do postawionego problemu. :-)

Na koniec jeszcze kilka uwag. Nie będę tym razem pisał jakie losowe odpowiedzi trafiły się nam. Dość powiedzieć, że procent poprawnych odpowiedzi jest wyższy niż w przypadku poprzedniego zadania. To świadczy wprost o tym, że było ono dużo bardziej strawne niż poprzednie zakodowane pytanie.

Z komentarzy na stronie wynika, że grający "rozbijali" się na różnych etapach tego zadania. Część nie zauważyła podpowiedzi w wierszyku i używała innego kompilatora. Podejrzewam, że najczęściej kończyło się to błędem na linijce "format MZ". Część ta jest w przypadku FASM kluczowa, by wygenerowany program uruchomił się pod DOSBoksem, a zatem by użytkownicy wszystkich najpopularniejszych systemów operacyjnych (Win, Linux, Mac OS X) mogli wynikowy kod uruchomić.

Część zignorowała podpowiedź o zadaniu w zadaniu, lub nie zadała sobie trudu eksperymentowania z kodem. Stąd m.in. odpowiedzi pod postacią przepisanej magicznej wartości z pierwszego uruchomienia. Uprzedzając pytania: takie odpowiedzi nie będą nagradzane punktami.

Część rozbiła się o schody do kokpitu F16: czy to o przerażający fakt istnienia kodu jako części zadania, czy to przy próbie uruchomienia kompilatora albo programu wynikowego. Uważam jednak, że moje oczekiwania wobec grających nie były szczególnie wygórowane; DOSBox to nie jest jakaś szalenie ezoteryczna aplikacja. Jest w dziale pobierania vortalu, pojawiał się w aktualnościach. Zdobycie i uruchomienie jego jak i FASM nie powinno wykraczać poza umiejętności grających.

Cieszę się, że - jak wnioskuję po komentarzach - części z Was podobało się zadanie. Całej reszcie pozostaje mi życzyć więcej szczęścia w następnym zadaniu specjalnym. Może lepiej trafię w Wasz gust. :-) Ale ostrzegam, że następne zadanie specjalne naprawdę będzie trudniejsze. ;-> 

Komentarze