Za jídlo, šaty a vzduch otročíme na programech z temných světů

Debug je náš přítel

V té úžasné době, kdy ovládání počítače pro 99% lidí nebylo jen klikání myší na ikonky, ale poctivé ťukání příkazů do příkazového řádku lidé ještě věděli, že uvnitř té krabice je nějaký procesor, který má registry a vykonává instrukce. Nikdo se nesnažil spasit svět Javou či .NETem a ti kteří místo assembleru používali Pascal byli terčem posměchu. V této skvělé době kraloval počítačům IBM PC a kompatibilním systém MS-DOS a v něm bylo možné najít program debug.exe (původně samozřejmě debug.com), o kterém tu dneska bude řeč.Jak jsem už nastínil debug není program pro ty, kteří nejsou schopni se orientovat kdekoliv pod abstraktní úrovní java.util.Hashtable. Vychází z utility, kterou si vytvořil Tim Paterson, autor QDOSu, který později po drobných úpravách Microsoftem vešel ve známost jako MS-DOS. Tato utilita původně běžela v ROM a až následně byla překopána do podoby samostatné, v operačním systému spustitelné binárky.


debug01.png

Debug nelze podezřívat z přehnané košatosti uživatelského rozhraní. Po spuštění z DOSu se vykreslí prompt v podobě pomlčky a tím to hasne. Proto jsem také v době, kdy byl DOS mým hlavním systémem v této chvíli končil.
Když jsem navštívil plzeňský Sinclair Klub, posadil jsem se před SinclairPC a měl jen jednu disketu se systémem. Nasm prohlásil, že mu 512kB RAM rozhodně nestačí (je to peklo, co?) a tak jsem odvážně začal zkoumat, co že to ten Debug vlastně umí. Není toho málo, posuďte sami:


debug02.png

S debugem můžeme dělat v zásadě dvě věci:

  1. Psát nový kód, což je ale poněkud hardcore, protože jde o řádkové vkládání, bez možnosti návěští, takže při téměř každé zásadní změně kódu je třeba posouvat kód a měnit adresy všech skoků
  2. Upravovat existující binárky, což je naopak docela legrace a alespoň se můžeme podívat, co jak funguje


debug03.png

Pokud se rozhodneme pro to druhé, je třeba si nejdříve nahrát nějaký ten soubor do paměti. K tomu se hodí příkaz n (name), kterým vybereme soubor a l (load), kterým nahrajeme soubor do paměti. Pokud nestanovíme jinak, nahrává se binárka od offsetu 0x100. Následně si můžeme příkazem u (unassemble) disassemblovat kus nahraného souboru. Čísla za příkazem udávají od a do jakého offsetu se má disassemblovat a stejně jako všechna další čísla jsou zadávaná v hexadecimální soustavě.
Pokud si chceme zařádit v cizí binárce, můžeme tak učinit commandem a (assemble), který nám umožňuje zadávat pohodlně instrukce a sám je ukládá jako binárku přímo od zadaného offsetu.


debug04.png

Výsledek můžeme spustit příkazem g (go), který má jako parametr za rovnítkem offset od kterého chceme spouštět. Kód udělá co má, a pokud je slušný tak se po ukončení vrátíme zpět do debugu.


debug05.png

Někdy si můžeme chtít provedené změny i uložit. To se dělá příkazem w (write). V registru CX nejdříve ale musíme mít délku ukládaného souboru, jinak hrozí, že si poškodíme disk. Příkaz rcx naštěstí umí vypsat i nastavit obsah tohoto registru. Po nahrání souboru z disku registr CX již délku obsahuje, stačí si ji tedy zapamatovat.

Debug není v žádném případě tak pohodlný jako kombinace kteréhokoliv textového editoru a assembleru. Není také určený pro stejné nasazení, cílem je spíše ladění a koukání do kódu od kterého nemáme zdroják. Přesto, pokud potřebujete nacpat bordel do VideoRAM, nebo si jen tak zablbnout není co řešit – je to ten pravý nástroj!
(Kupodivu se nachází i ve všech verzích Windows včetně Visty.)

Doporučuji vytisknout a používat velmi pěkně napsaný manuál k debugu.

Keywords:MS-DOS, assembler, debug.com, debug.exe, debugging, programming, code