Po drátě 5: Řešení úlohy č. 11

Pokud jste přijali pozvánku do našeho počítačovému musea a připojili se na port 1969, dozvěděli jste se tohle:


+++ Welcome to our computer museum. +++
+++ Our time machine will connect you to one of our exhibits. +++

Po zadání nějakého náhodného řetězce stroj odpověděl:


Ошибка входа (стр. 1): Плохой знак
a zavřel spojení. Po zaslání některého z příkladů, třeba ex-arith jsme se dozvěděli:

+000000000001 + +000000000002 + +000000000003 = +000000000006
Машина остановлена -- Останов машины
СчАК:0062 См:+000000000000 Р1:+000000000000 Р2:+000000000006

Vypadá to tedy, že máme co do činění s nějakým dinosauřím počítačem ze sovětské éry. Vskutku, je to poměrně věrná kopie počítače Minsk-2.

Ovládáme ho podobně, jako se tehdy počítače ovládaly: systémová konzole umí ukládat kamkoliv do paměti libovolné číslo (12 osmičkových číslic se znaménkem, stroj je totiž 37-bitový), spustit program a po jeho zastavení nám ukázat stav všech registrů: СчАК je čítač instrukcí, См je akumulátor (sumátor), Р1 a Р2 jsou další dva registry, ovšem na rozdíl od dnešních procesorů se s nimi v programu nezachází přímo – v prvním si procesor pamatuje druhý operand instrukce, druhý registr obsahuje stav akumulátoru před začátkem zpracování instrukce. Součástí počítače je také tiskárna, co vytisknete, to také vidíte.

Zbývá maličkost: vyluštit, jak fungují instrukce (aniž bychom se nachytali na to, že součástí kódu instrukce je i znaménko), a napsat si program, který v paměti najde heslo (všude jinde jsou samé nuly, ovšem záporné, protože to je kód instrukce na zastavení programu).

Způsobů, jak procházet paměť, je vícero. Buďto můžete objevit, jak funguje nepřímá adresace, nebo (jednodušeji) napsat program, který sám sebe modifikuje. Tak jste se nakonec mohli dostat k azbuko-latinkovému textu ПАРОЛЬ: BALALAJKA čili "heslo: balalajka". Při nejhorším šlo také napsat program, který vypíše fixní blok paměti (můžete vytisknout až 100 řádků, než tiskárně dojde papír), a poslat ho ve více verzích lišících se adresami. To stačilo udělat 41-krát, protože paměť stroje obsahuje pouhých 4096 slov.

Zajímavosti

Za námět na úlohu děkujeme knihovně Matfyzu, kde Anička objevila k vyřazení určenou knížku V. M. Salikova Programmirovanije dlja ECBM Minsk-22 (vydána v roce 1969) a přinesla ji domů s tím, že by se mohla hodit na Po drátě. Martinovi zaplála očíčka, časem strávil jedno odpoledne čtením knížky (být živoucí fosilie, která ještě ve škole potkala špetku ruštiny, se někdy hodí), druhé napsáním emulátoru většiny stroje, a za třetí do něj jen tak pro radost doimplementoval i všechny floatové instrukce.

Stroj má spoustu na dnešní dobu nezvyklých vlastností. Na adrese 0 je zadrátována hodnota 0. Čísla se znaménkem nejsou uložena ve dvojkovém doplňku, ale v sign-magnitude reprezentaci. Jelikož neexistují téměř žádné registry, k nepřímé adresaci se používají paměťové buňky s adresami 1–15 a ještě navíc modifikují adresu obou operandů instrukce najednou. Obecné I/O porty nebo paměťově mapované I/O jsou hudbou budoucnosti, s každou periferií se komunikuje jejími speciálními instrukcemi (čtečku a děrovačku pásky jsme neimplementovali, děrné štítky a dálnopis také ne, ale řádkovou tiskárnu kompletně).

Minsk-22 se od Minsku-2 liší dvojnásobnou kapacitou paměti. Adresy ovšem zůstávají nadále 12-bitové, jen dva dříve nevyužité bity v kódu instrukcí přepínají bloky paměti pro zdrojový a cílový operand (takže například procházet cyklem pole ležící přes hranici bloků je dost pracné). Vida, ošklivé hacky pro zpětnou kompatibilitu nejsou jen výsadou dnešních procesorů od Intelu. Tak jsme si raději vystačili s menší pamětí, byť skrýt heslo do horního bloku by bývalo bylo krásně ďábelské.

Knížka bohužel nepopisuje všechny detaily, je to spíš učebnice programování (ve strojovém kódu a v Algolu 60) než referenční příručka. Detaily chování některých instrukcí jsme tedy museli hádat a pokoušet se rekonstruovat schéma zapojení stroje (v tom knížka občas napovídá).

Můžete si stáhnout emulátor (dá se ovládat jak přes standardní vstup a výstup, tak spustit jako síťový daemonek) i popis instrukční sady stroje.

Úlohu vytvořil Martin, inspiraci dodala Anička a pan Salikov.

Re: Po drátě 5: Řešení úlohy č. 11 Bilbo (8. 12. 2010 - 12:57) Sbalit(3)
> Můžete si stáhnout emulátor (dá se ovládat jak přes standardní vstup a výstup, tak spustit jako síťový daemonek) i popis instrukční sady stroje

Nemůžeme, odkaz na instrukční sadu je blbě a hází akorát
404: Muhehehehechlemst! Emulátor ale stáhnout jde :)
Re: Po drátě 5: Řešení úlohy č. 11 anicka (org) (8. 12. 2010 - 13:01) Sbalit(2)
> Nemůžeme, odkaz na instrukční sadu je blbě a hází akorát
> 404: Muhehehehechlemst! Emulátor ale stáhnout jde :)

Fixed.

Re: Po drátě 5: Řešení úlohy č. 11 festr2 (8. 12. 2010 - 13:51) Sbalit(1)
smekam nad touto ulohou autorum.
Re: Po drátě 5: Řešení úlohy č. 11 Michal Kubeček (8. 12. 2010 - 18:22) Sbalit(1)
Moc pěkná úloha, se slzou v oku jsem zavzpomínal na doby, kdy jsem na PMD-85 stroják psal ještě rovnou v kódech, ne v mnemonice assembleru; ještě dlouho jsem pak ze zvyku instrukci volání podprogramu říkal CD místo CALL. :-) Jen jsem čekal, že autoři budou trochu zákeřnější a buď budou heslo umísťovat pokaždé jinam nebo ho umístí právě tam, kde jsou ve všech ukázkách instrukce nebo data, takže jsem byl trochu překvapený, že fungoval hned první pokus s jednou smyčkou (a druhou v shellovém skriptu).