Site hosted by Angelfire.com: Build your free website today!

Het debug - programma

 

Het programma debug (kan je vinden in c:\dos of c:\windows\command) laat enorme mogelijkheden toe. Je kan er programma's mee aanmaken, andere programma's mee uitvoeren en testen, en stap voor stap de processor van je PC besturen. Je kan kiezen of je de aangemaakte programma's opslaat op harde schijf, of alleen maar wil laten uitvoeren.


Probleem: de prompt van Debug is niet gemakkelijk, de gebruikte assembleertaal evenmin, en je moet opletten wat je doet. Er zijn commando's waarmee je in een fractie van een seconde je harde schijf volledig schrapt. Sneller dan het format-commando, en vrijwel onmogelijk om ongedaan te maken. Toch mag dat je niet afschrikken, want je kan heel wat leren over de interne werking van je computer.


1. De prompt commando's

Als je in dos gaat (windows verlaten), en je typt het commando "debug", zie je in plaats van de oude vertrouwde prompt C:\>_ iets anders: enkel het horizontale streepje "-". Zolang je in debug werkt, zie je dat.

2. Voorbeeld van het gebruik van debug:

We willen een programma, om een blauwe rand aan het Dos-scherm te zetten. Zonder ansi.sys onmogelijk, zou je zeggen - maar niets is minder waar. Ga uit Windows, naar dos, en start debug. Tekst in het rood zijn de commando's die wij typen, in het groen zijn de antwoorden van debug. Het eerste deel van het geheugenadres (hier 1E6E) heeft geen belang, dat kan op elke PC anders zijn - afhankelijk van in het geheugen geladen programma's.

a (Enter) - start assembleren
1E6E:0100 mov ax,1001 (Enter) - zet register op waarde "1001"
1E6E:0103 mov bh,3 (Enter) - het bh-register bevat de kleur
1E6E:0105 int 10 (Enter) - bios video interrupt
1E6E:0107 int 20 (Enter) - einde programma
1E6E:0109 (Enter) - alleen Enter = stop assembleren
-
r cx - (waarde van telregister opvragen)
CX 0000 - (staat op 0)
: 9 (Enter) - zet op 9 - (verschil tussen 0109 en 0100)
nkleur.com (Enter) - (naam van dit programma: kleur.com)
w (Enter) - schrijf naar schijf
Bezig met het schrijven van 00009 bytes.
q (Enter) - stop debug

C:\>kleur (Enter) - start kleur.com


Het lijkt eerder dom, een programma te schrijven dat enkel een randkleur aan een dos-scherm zet. Maar we hebben zojuist een volledig programma geschreven, en uitgevoerd. Probeer maar in een andere programmeertaal een programma te schrijven dat hetzelfde doet, met als resultaat een uitvoerbaar bestand van 9 bytes groot wel te verstaan. Je kan experimenteren door de waarde van bh aan te passen, om aan andere kleur te bekomen.

Alle waarden die we invullen in debug, zijn hexadecimaal, hoewel dat voor waarden onder 10 (decimaal) geen belang heeft, zoals in dit programma.


Crashen van een pentium:

Misschien heb je al gehoord van de "F00F"- pentium bug. Je kan een pentium processor doen stilstaan, door het uitvoeren van 4 bytes code: F0, 0F, C7, C8 (f - nul, nul - f, enz... geen letter "o" dus).

Om het bestandje aan te maken in debug (doe maar in een dos-venter in windows - startknop, uitvoeren, "command"):

C:\windows\desktop>debug (Enter)

a: (Enter)
1E6E:0100 db f0 (Enter)
1E6E:0101 db 0f (Enter)
1E6E:0102 db c7 (Enter)
1E6E:0103 db c8 (Enter)
1E6E:0104 (Enter)
r cx (Enter)
CX 0000
: 4 (Enter)
ncrash.com (Enter)
w (Enter)
bezig met het schrijven van 00004 bytes.
q (Enter)
C:\windows\desktop>exit (Enter)

Klik nu op het icoontje "crash.com" (ik veronderstel dat je, zoals in dit voorbeeld, gewerkt hebt in c:\windows\desktop). Een pentium-processor zal nu stilstaan, je kan enkel nog de PC uit- en terug aan zetten. 4 bytes code zijn voldoende hiervoor.

Je kan je de grap wel voorstellen, om dit programma aan te roepen bij het opstarten van Windows, op de PC van een vriend.


Een groter programma schrijven in debug:

Voor echt grote programma's is debug niet geschikt. Maar voor snelle, handige routines kan het best gebruikt worden. Een programma dat een diskette volledig overschrijft, inclusief bootsector, FAT, en root-directory is een voorbeeld van dergelijke routine. Handig om een bootsectorvirus te verwijderen van een diskette. Ok, je kan gewoon de diskette gewoon formatteren ook, maar dan leren we niet om iets te maken in debug. Aan de slag dus:

C:\>debug (Enter) - start debug
-a (Enter) - start assembleren
01e6:0100 push cs (Enter) - adres van dit programma gebruiken
01e6:0101 pop es (Enter) - om gegevens in het geheugen te zetten
01e6:0102 mov di,012e (Enter) - vanaf plaats 012e (= nog vrij)
01e6:0105 cld (Enter) - clear direction flag - waarde ophogen per stosw
01e6:0106 mov ax,f6f6 (Enter) - tweemaal het teken ÷ in register ax zetten
01e6:0109 mov cx,2400 (Enter) - aantal keren dat stosw zal worden uitgevoerd
01e6:010c repz (Enter) - herhaal tot cx = 0
01e6:010d stosw (Enter) - schrijven van "÷÷" naar es:di
01e6:010e push es (Enter) - zet adres van het gebruikte register es
01e6:010f pop ds (Enter) - in het ds-register
01e6:0110 mov dx,ffdc (Enter) - zet dx op waarde - 24 (zie add-functie verder)
01e6:0113 mov cx,0050 (Enter) - telregister op waarde 80 (50 hex)
01e6:0116 push cx (Enter) - en bewaren in stack
01e6:0117 mov cx,0024 (Enter) - aantal sectoren voor int 26
01e6:011a add dx,24 (Enter) - vanaf eerste sector (dx, wordt 0 de eerste keer)
01e6:011d xor ax,ax (Enter) - al bevat drive nummer, 0 = a: 1 = b: enz...
01e6:011f mov bx,012e (Enter) - ds:bx bevat adres van gegevens voor int 26
01e6:0122 int 26 (Enter) - absoluut schrijven naar schijf (op sector)
01e6:0124 popf (Enter) - vlag van de stack halen omdat int26 ze pusht
01e6:0125 pop cx (Enter) - haal de vorige cx van de stack (50hex)
01e6:0126 loop 0116 (Enter) - ga naar regel 0116 en voer uit, aantal keer = in cx
01e6:0128 mov ax,4c01 (Enter) - proces beëindigen met terugkeercode
01e6:012b int 21 (Enter) - einde programma
01e6:012d (Enter) - einde assembleren
r cx (Enter)
CX 0000
: 2d (Enter) - telregister zetten op grootte van ons programma
ndiskette.com (Enter)
- naam van het programma opgeven
w (Enter)
- schrijven van ons programma
bezig met het schrijven van 0002D bytes.
q (Enter)

Ok, 't is gemaakt en klaar. Stop nu een 1.44-diskette in de a: drive, een diskette waar je de gegevens niet meer van nodig hebt, wel te verstaan. Als je het programma start, zal de diskette volledig worden overschreven met "÷" tekentjes, onvoorwaardelijk, zonder waarschuwing en snel. Zo zou je dit programmatje kunnen gebruiken om een installatieroutine vanaf diskette, na de installatie naar de diskette te laten schrappen.

Enkele opmerkingen:

Om het programma niet nodeloos ingewikkeld te maken, zijn sommige zaken weggelaten. Zo wordt bij uitvoering niet nagegaan of er wel een diskette in de drive zit, en het formaat van de diskette (1.44 of 720) wordt niet gecontroleerd. Daarom gaan we uit van een standaard 1.44 Dos-geformatteerde diskette, al dan niet met gegevens op. Verander het programma niet door de xor ax,ax - lijn te wijzigen in een mov ax,2 - opdracht, want dergelijk programma zou de harde schijf wissen.

Waarom gebruik ik de opdracht xor ax,ax, om het ax-register op 0 te zetten, in plaats van mov ax,0? Snelheid. een xor-bewerking van een register op zichzelf resulteert in het op 0 zetten van dat register, in twee kloktikken. Een mov-bewerking op datzelfde register kost drie kloktikken. Nu heeft dat 100-miljoenste van een seconde op een pentium 100 weinig belang, maar principiëel kies je voor de snelste en kleinste bewerking.


Opletten met onbekende interrupts en het "w" commando:

Let op met het aanroepen van Dos-interrupts die je niet kent. De interrupts 10 (Hex) en 20h zijn vrij onschuldig, aangezien deze resp. schermaansturing routines en einde van een programma uitvoeren. Interrupt 13h en 26h - schrijfroutines, zijn gevaarlijk als je niet weet wat je doet. Een volledig overzicht van de interrupts heb ik thuis beschikbaar, en kan ik sturen per e-mail.

Let ook op met het gebruik van het "w" commando, indien je het anders gebruikt dan hier aangegeven. Je kan dit commando gebruiken om geheugenadressen rechtstreeks naar de schijf te schrijven, naar een sector. Uiteraard kan je op die manier je harde schijf verknoeien. Voorbeeldje?

w b800:0000 2 0 ffff (Enter) - schrijft vanuit het videogeheugengebied b800 naar schijf c (0=a: 1=b: 2=c:) vanaf sector 0 - 65535 (ffff Hex) sectoren. Dergelijk commando verknoeit onmiddellijk je harde schijf. Niet doen dus, als je nog gegevens op die schijf nodig hebt.


Terug naar hoofdpagina

E-mail