370 13 130KB
German Pages 15 Year 1999
Asse m ble r – Tu t or ia l Grundlagen und Theorie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
Vorwort I n diesem Tut orial werden wir Grundlagenarbeit bet reiben. Diese best eht daraus, daß wir Begriffe w ie Regist er, oder „ St ack“ erläut ern. Wir w erden uns auch den Segm ent en eines Program m es zuw enden, in Bezug auf den 8086 bzw. den neueren Prozessoren m it Windows 9x als Bet riebssy st em . Dieses Kapit el habe ich leider noch in keinem Tut orial vorgefunden, obw ohl es sehr viel zum Verst ändnis eines Pr ogram m es auf der Assem bler–Ebene beit rägt . Doch genug für den Anfang. Beginnen w ir.
Zahlensysteme und deren Darstellung Wie j eder PC Anfänger w eiß, kann der Com put er nur m it Einsen oder Nullen um gehen. Dieses Zahlensyst em nennt m an das Binär- oder Dualsyst em . Weit erhin exist ieren das Dezim alsyst em , w elches uns am geläufigst en ist , und m it dem wir uns Tag für Tag auseinanderset zt en, sowie das Hexadezim al–Syst em ( auf der Basis der Zahl 16) und das Okt al–Syst em ( auf der Basis 8) . Ein genauere Einführung ist w ohl eher unint eressant , daher lasse ich sie weg. Nur eine Sache sollt geklärt werden: Die Dar st ellung negat iver Zahlen im Binärform at . Dam it m an eine Zahl im Binärfor m at m it einem Vorzeichen „ behaft en“ kann, w urde folgende Lösung erdacht : Man best im m t ein Bit , welches angibt , ob die Zahl - oder + ist . Dadurch v erschiebt sich allerdings die Menge der darst ellbaren Zahlen: So kann m an m it einem 8 Bit großen Wert 2^ 8 = 265 m ögliche Zahlen darst ellen. Som it lassen sich bei einem vorzeichenlosen Wert die Zahlen 0 - 255 darst ellen. Doch sobald ein Vorzeichen Bit dazu kom m t , hat m an nur noch 7 Bit übrig ( Das erst e Bit , ist das Vorzeichen Bit ) . Som it bleiben folgende Zahlen übrig: 00000000- 01111111 für 0 bis 127; sowie 10000000- 11111111 für die Zahlen - 1 bis - 127. Som it geht zwar nicht direkt die Menge der darst ellbaren Zahlen zurück, doch es verschiebt sich der Bereich von 0 bis 255 auf - 127 bis 127. Will m an nun eine posit ive Zahl in eine negat ive verwandeln, bildet m an ein so genannt es Zwei–Kom plem ent . Hierzu ein Beispiel: 5 ist im Dualsyst em gleich 00000101. Um die Zahl - 5 darzust ellen, dreht m an j edes Zeichen um ; so wird aus 00000101 11111010. Das ist ein Zwei–Kom plem ent . Es werden solche Begriffe wie „ Word“ ( „ Wort “ ) oder „ DWord“ ( „ Doppelwort “ ) v ork om m en, daher m öcht e ich sie gleich klären: „ Byt e“ : Ein 8 Bit großer Wert . Ein Byt e ist folgender m aßen aufget eilt : 7
6
5
4
3
2
1
0
Die Zählung der Bit s beginnt bei 0 und endet bei 7. Das 8. Bit ( Bit Nr. 7) ist das Vorzeichenbit . „ Word“ : Ein 16 Bit großer Wert . „ Double–Word“ ( „ DWord“ ) : Ein 32 Bit großer Wert . „ Quad–Word“ ( „ QWord“ ) : Ein 64 Bit großer Wert . „ I nt eger“ : Ein vorzeichenbehaft et er Wert , welcher die Größe v on einem „ Byt e“ , „ Word“ oder „ DWord“ haben kann. „ Arit hm et ische Operat ion“ : Eine der 4 Grundrechenart en: Addit ion, Subt rakt ion, Mult iplikat ion oder Division. - 2 -
06.11.1999
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
N och z u be a cht e n: I n Soft I CE und W32DASM w erden Zahlen in hexadezim aler Schr eibweise dargest ellt . Wenn in Assem bler eine Zahl in einer eckigen Klam m er ( '[ ' und '] ' ) st eht , so w ird diese als Zeiger ( „ Point er“ ) auf eine Speicher st elle int erpret iert . Assem bler–Befehle folgen dem Synt ax < Befehl> < Ziel> , < Quelle> . „ Operanden“ w erden durch eine Kom m a get rennt .
Die Register Ein „ Regist er“ ist ein Teil des Pr ozessor s, welcher Dat en beinhalt et . Diese Dat en dienen dem Prozessor dazu, um auf der eine Seit e die vom Pr ogram m ierer angeordnet en Operat ionen durchzuführen und auf der anderen Seit e, um ein Pr ogram m überhaupt zum Laufen zu bringen. Der Prozessor hält ab dem 80386 16 Regist er zur Program m ierung bereit . I nt el unt ert eilt die Regist er wie folgt ( beschrieben im „ I nt el Archit ect ur e Soft war e Dev eloper Manual“ ) :
„General-purpose data registers“ (Allzweckregister) EAX EBX ECX EDX ESI EDI EBP ESP
„ accu regist er“ „ base regist er“ „ count er regist er“ „ dat a regist er“ „ source index regist er“ „ dest inat ion index regist er“ „ base point er regist er“ „ st ack point er regist er“
Akkum ulat or Basisregist er Zählregist er Dat enregist er Quell–I ndex Ziel–I ndex Basiszeiger St ack–Zeiger
„Segment registers“ (Segmentregister) CS DS ES SS
„ code segm ent regist er“ „ dat a segm ent regist er “ „ ext ra segm ent regist er“ „ st ack segm ent regist er“
FS GS
„ help segm ent 1 regist er“ „ help segm ent 2 regist er“
„Status & control registers“ (Status- und Kontrollregister) EFLAGS EI P
„ EFLAGS–Regist er“ ( Flag–Regist er) „ inst ruct ion point er r egist er“ ( Befehlszeiger)
Das Flag–Regist er hat eine besonder e Bedeut ung, und w ird gleich gesondert behandelt . Daher gelt en die folgenden Aussagen nicht für dieses Regist er .
- 3 -
06.11.1999
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
Die Größe der Register Säm t liche Allzw eckregist er sow ie die St at us- und Kont rollregist er haben eine Gr öße von 32 Bit ( Gek ennzeichnet durch das 'E' am Anfang) . Die Segm ent regist er sind nur 16 Bit groß. Alle 32 Bit großen Regist er lassen sich aber auch als 16 Bit Regist er ansprechen, indem m an das 'E' am Anfang des Kürzels w egläßt . Die erst en 4 Regist er besit zen außerdem noch eine Besonderheit ( desw egen der Absat z) : Sie lassen sich zusät zlich als zwei 8 Bit Regist er ansprechen. Das heißt folgendes: EAX AX
Ein m axim al 32 Bit großer Wert kann in diesem Regist er gespeichert werden. Bedeut et , daß nur die er st en 16 Bit gem eint sind.
Diese beiden Möglichkeit en der Behandlung haben alle 32 Bit Regist er gem einsam . Die beiden folgenden w eit eren Möglichkeit en beschränken sich auf EAX, EBX, ECX und EDX. AL AH
Dies sind nur die erst en 8 Bit des Regist ers. ( 'L' st eht für „ low“ ) . Dies sind die zweit en 8 Bit des Regist ers. ( 'H' st eht für “ high“ ) .
Die Verwendung bzw. die Aufgaben der Register
Die Allzweckregister Die er st en 4 Allzweckr egist er sind die, m it denen der Pr ogram m ier er am häufigst en arbeit et . Sie können beliebig kom biniert werden. Doch j edes dieser Regist er hat spezielle Aufgabengebiet e, die durch Befehle deut lich gem acht werden. EAX EBX ECX EDX
Diese Regist er dient haupt sächlich für arit hm et ischen Operat ionen EBX ist dazu gedacht , um auf Speicherst ellen zu zeigen ECX w ird bei Schleifen eingeset zt I / O Zeiger
Diese Aufgaben durch Beispiele darzust ellen, halt e ich an diesem Punkt für falsch, denn dafür benöt igt m an w eit eres Wissen, w elches erst spät er dazu k om m t . Daher lassen wir es, und gehen zu den nächst en Regist ern. Die vier w eit eren Regist er dienen dazu um auf spezielle Bereiche in einem Segm ent ( was das ist , wird gleicht behandelt ) zu zeigen. Da das Wissen noch fehlt , um diese Sachen genauer zu erläut ern sei nur folgendes gesagt : ESI und EDI sind die einzigen weit eren Regist er, die m anchm al vom Pr ogr am m ierer wie EAX, EBX, ECX, oder EDX eingeset zt w erden k önnen. ESP und EBP haben spezielle Aufgaben, die im Kapit el über den St ack behandelt werden.
Die Segmentregister Auch für diese Regist er gilt , daß sie erst im spät eren Teil behandelt werden können.
Status- und Kontrollregister Das Flag–Regist er wird ausführlich im Kapit el „ Flags“ behandelt werden. Das EI P Regist er ist vielleicht das wicht igst e Regist er für den Prozessor, da es auf die St elle im Speicher zeigt , w elches den nächst en Befehl beinhalt et . EI P ist für den Pr ogram m ierer recht unint eressant , da m an es nur indirekt beeinflussen kann.
- 4 -
06.11.1999
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
Flag–Register Einige werden sich vielleicht wundern, warum ich diesem Regist er ein eigenes Kapit el widm e. Doch das ist gerecht fert igt , wie wir gleich sehen w erden. Ein Flag ist , wie der Nam e schon sagt eine Flagge, die et was signalisiert . Das Flag–Regist er ist 32 Bit groß, und kann dam it 32 m al 'j a' oder 'nein' sagen, in Form von einer 0 für ein 'nein' bzw. für eine nicht –geset zt e Flagge; oder in Form v on einer 1 für ein 'j a', bzw. für eine geset zt e Flagge. Doch w ozu diese Flaggen? Ganz einfach: Sie dienen dazu um den Ausgang best im m t er Operat ionen anzuzeigen, oder best im m en das Verhalt en des Prozessors, bei besonderen Akt ionen. Es ist zwar m öglich m it dem Regist er 32 Flaggen zu beset zt en, doch es gibt nur 17 St ück. Die anderen Bit s sind reserviert e Posit ionen und dürfen nicht genut zt w erden. Und auch von diesen 17 „ Flags“ sind für uns nur einige relevant , näm lich 9 St ück. Diese 9 sind folgende: OF DF OF DF IF TF SF ZF AF PF CF
IF
TF
SF ZF AF PF
„ Ov er flow Flag“ „ Direct ion Flag“ „ I nt er rupt Enable Flag“ „ Trap Flag“ „ Sign Flag“ „ Zero Flag“ „ Auxiliary Cary Flag“ „ Parit y Flag“ „ Car ry Flag“
Die Bedeutung der „Flags“ Was die „ Flags“ im einzelnen bedeut en, oder bew irk en, m öcht e ich nat ürlich niem andem vorent halt en: Allerdings ist das „ Parit y Flag“ , „ Trap Flag“ und das „ I nt er rupt Enable Flag“ recht unint eressant für einen „ Crack er “ , und daher w erden sie nur kurz angeschnit t en. Und auch die anderen „ Flags“ sind nur selt en für einen „ Cracker“ w irklich wicht ig ( ausgenom m en das „ Zer o Flag“ ) , t rot zdem w erden sie behandelt , dam it im Fall der Fälle m an im m er noch auf dieses Dokum ent zurückgreifen kann. I n dem folgenden Abschnit t w erden leider solche Begriffe w ie St ring–Operat ionen und I nt errupt benut zt . Diese werden nicht erklärt ( Um best im m t e Befehle, oder Befehlsart en zu verst ehen ist es Em pfehlensw ert , sich ein Buch darüber zu besorgen) , t rot zdem m üssen sie benut zt werden, um die Funkt ionen der „ Flags“ zu klären. Ein Anfänger sollt e sich nicht davon abhalt en lassen, das t rot zdem zu lesen, da doch einiges erklärt wird, was auch ohne Vorwissen zu verst ehen ist .
Das „Carry Flag“ (Übertrage–Flag) Diese Flag w ird geset zt , w enn nach einer arit hm et ischen Operat ion ein Überlauf st at t gefunden hat . Wenn m an z.B. zwei 8 Bit Wert e wie 100 und 200 addiert , ist das Ergebnis 300. Doch die Zahl 300 überst eigt , die m ögliche Anzahl der darst ellbaren v orzeichenlosen Zahlen um 45. Um 300 darzust ellen benöt igt m an 9 Bit . Dam it diese Zahl nicht verloren geht , wird das „ Carry Flag“ geset zt ; som it erhält m an die 9 Bit ( 8 Bit , das norm ale Byt e + das „ Carry Flag“ ) .
- 5 -
06.11.1999
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
Das „Parity Flag“ (Paritäts–Flag) Diese „ Flag“ dient zur Fehlerüberprüfung bei einer Dat enübert ragung auf eine serielle Schnit t st elle.
Das „Auxiliary Cary Flag“ (Übertrage–Hilfs–Flag) Dieses Flag ist geset zt wenn ein übert rag v on Bit 3 ( das 4. Bit , da das 1. Bit , Bit 0 ist ) auf Bit 4 er folgt ist . Es wird im Um gang m it dem „ BCD–Sy st em “ benut zt . Dieses Zahlensyst em wird hier nicht behandelt , da es im PC- Bereich kaum Verw endung findet .
Das „Zero Flag“ (Null–Flag) Dieses Flag ist zweifellos das wicht igst e für einen „ Crack er“ , und wahrscheinlich auch das wicht igst e für einen Assem bler Program m ier er. Dieses Flag zeigt an, ob das Ergebnis einer Operat ion Null ist , oder nicht . Falls es Null ist , ist das „ Zero Flag“ geset zt , falls das Ergebnis ungleich Null ist , w ird es nicht geset zt . Eine w icht ige Benut zung des „ Zero Flag“ aus der Sicht eines „ Crack ers“ ist sicherlich, wenn aus einem Unt erprogram m der Rückgabew ert er m it t elt wird. Doch das ist für den Anfänger noch nicht so int er essant .
Das „Sign Flag“ (Vorzeichen–Flag) Dieses Flag ist geset zt , w enn das Ergebnis einer arit hm et ischen oder logischen Operat ion negat iv ist . Falls das Ergebnis posit iv ist , ist das Flag nicht geset zt .
Das „Trap Flag“ (Einzel–Schritt–Flag) Dieses Flag ( falls es geset zt ist ) verset zt den Prozessor in einen Zust and, w o er j eden Befehl einzeln ausführt ( t ut er j a sow ieso) und danach den I nt errupt 1 aufruft . Dadurch ist es m öglich Debugger einzuset zen, um dem Program m ierer z.B. bei der Fehlersuche, erheblich seine Arbeit zu erleicht ern.
Das „Interrupt Enable Flag“ (Unterbrechungs–Flag) Dieses Flag gibt an, ob das Program m durch I nt errupt s, z.B. von der Tast at ur unt erbrochen w erden darf. Falls es geset zt ist , kann das Pr ogram m unt erbrochen w erden. Falls es nicht geset zt ist , läßt der PC keine Unt erbrechung des Pr ogram m s zu.
Das „Direction Flag“ (Richtungs–Flag) Diese Flag gibt die Richt ung bei sogenannt en St ring–Operat ionen an. Falls es geset zt ist , wird die St ring–Verarbeit ung nach aufst eigenden Adressen durchgeführt . Falls es nicht geset zt ist , wird die St ring–Verarbeit ung nach abst eigenden Adressen durchgeführt .
- 6 -
06.11.1999
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
Das „Overflow Flag“ (Überlaufs–Flag) Dieses Flag ist geset zt , w enn das Vorzeichenbit durch eine „ arit hm et ische Operat ion“ zerst ört ist .
Noch etwas zu negativen und positiven Zahlen Wie wir ganz am Anfang gelernt haben, wird die Darst ellung von negat iven und posit iven Zahlen im Dualsyst em durch ein Vorzeichenbit gelöst . Doch w oher soll der Pr ozessor wissen, ob er bei einer Addit ion das Bit 7 ( oder das Bit 15, oder Bit 31) als Vorzeichen, oder als Teil einer Zahl, die kein Vorzeichen hat behandeln soll. So kann 10011010 gleich 154 oder - 102 sein. Der Prozessor kennt den Unt erschied nicht . ( I n Soft I CE w ie folgt zu überprüfen: Wenn ein Regist er größer als 80000000h ist , so kann m an sich durch den Befehl '? < Regist ernam e> ' den Wert des Regist ers in Hex und Dezim al anzeigen lassen. Dadurch das der Wert des Regist ers m indest ens 80000000h ist , wird hint er der Dezim al Zahl noch eine weit er e Zahl in Klam m ern angezeigt . Diese Zahl ist negat iv, da Soft I CE bei ihr das höherw ert igst e Bit als Vorzeichen int erpret iert hat . Da Soft I CE genauso w enig wie der Prozessor weiß, ob die Zahl m it Vorzeichen oder ohne gedacht war, m uß Soft I CE beides in Bet racht ziehen und zeigt beide Möglichkeit en an.) Doch w as soll das Ganze dann, w enn der Pr ozessor den Unt erschied nicht kennt ? Ganz einfach: Es kom m t auf den Befehl an. So z.B. führt der Befehl MUL eine Mult iplikat ion durch, ohne dabei auf das höherwert igst e Bit zu acht en. I m Gegensat z zu I MUL, wo das höherw ert igst e Bit als Vorzeichen gew ert et wird.
Die Segmente Die Segmente beim 8086 Einige werden sich j et zt vielleicht Fragen, warum nehm en wir hier die Segm ent e beim 8086 durch, w obei doch in der heut igen Zeit dieser Prozessor hoffnungslos veralt et ist . Die Ant w ort ist relat iv einfach: Das was wir j et zt besprechen gilt heut e im m er noch. Also aufgepaßt . I m vorherigen Abschnit t habe ich bei den Segm ent –Regist ern darauf verwiesen, daß w ir diese er st spät er behandeln. Und j et zt ist spät er . Wenn ich hier von Regist ern spreche, m uß m an noch folgendes Wissen: Beim 8086 gab es noch k eine 32 Bit großen Regist er, sondern es waren alle 16 Bit groß. Das bedeut et es gab k ein Regist er m it dem Nam en EAX, sondern AX.
Der Bus Beim 8086 gibt es folgende Busse: Der St euerbus, der Adreßbus und der Dat enbus. Dav on int eressier en uns nur der Adreßbus und der Dat enbus. Der St euerbus dient nur zur Regelung der Dat enübert ragung am Com put er ( nicht , das es nicht w icht ig w äre, aber er ist für uns nicht relevant im Bezug auf die Segm ent e) . Beim 8086 ist der Adreßbus 20 und der Dat enbus 16 Bit breit . Und das ist nicht gut . Der Adreßbus dient dazu eine Speicher st elle im Arbeit sspeicher zu adr essieren. Der Adr eßbus ist 20 Bit breit und 2^ 20 ergibt 1048576 Byt e bzw. 1024 KB und dies wieder um ist 1 MB. Dam it wäre klar, daß der 8086 m axim al ein MB ansprechen k onnt e. Von der Adresse 0 bis 1048575. Der Dat enbus hat w iederum die Aufgabe den I nhalt der St elle im RAM, der vom Adreßbus definiert worden ist , zu t ransport ieren; ent weder zum Prozessor hin, und von ihm weg. Dabei t ransport iert er Code ( also ausführbare Befehle) und Dat en ( I nform at ionen, w elches das Program m benöt igt , um m it den Befehlen vernünft ig zu arbeit en) .
- 7 -
06.11.1999
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
Das Problem Okay, w ir haben einen 20 Bit großen Adreßbus und einen 16 Bit großen Dat enbus. Dadurch können die Regist er m axim al 16 Bit groß sein. Eine Adresse, auf die m an m it t els des Adreßbus zugreifen will, m uß j a irgendw o gespeichert sein. Und dies irgendw o sind die Regist er. Doch wie will m an m it einem 16 Bit großem Wert voll auf 20 Bit ( = 1 MB) zugreifen? Genau das ist das Problem . Wenn wir z.B. auf die Adresse 10000h zugreifen wollen, welche 20 Bit zur Darst ellung benöt igt , so ist es nicht m öglich diese Zahl in einem Regist er zu speichern, da ein Regist er beim 8086 m axim al 16 Bit groß ist .
Die Lösung Dieses Problem bedarf einer Lösung, die wie folgt aussah: Man benut zt 2 Regist er. Dies klingt nicht sehr einfallsreich; doch w ie w ir j et zt sehen w erden, ist es nicht ganz so einfach. Wir haben einen Adreßraum v om 1 MB ( = 1024 kB) . Um diese 1 MB sinnvoll aufzut eilen auf 2 Regist er, dividiert e m an 2^ 20 ( = 1024 KB; die m axim ale Größe des Adreßr aum s) durch 2^ 16 ( die m axim ale Gr öße eines Regist ers) und erhält 16. Som it war klar, daß m an den Adreßraum in Blöcke zu j e 16 Byt e auft eilt e. Das bedeut et , daß der Adreßraum ab sofort nicht m ehr nur 1024 KB groß ist , sondern auch aufget eilt ist in Blöcke zu j e 16 Byt e. Diese Blöcke heißen Paragraphen. Doch w ieviele dieser Paragraphen gibt es denn? Ganz einfach: Man dividiert die 2^ 20 durch 16, und bek om m t die Zahl 65.536. Nochm als zusam m engefaßt : Man t eilt e den Adreßraum in Segm ent e auf, die j e m indest ens 16 Byt e groß sind, deren Anzahl 65.535 bet rägt . Soweit , so gut . Solch eine Zahl, die zwischen 0 und 65.535 groß sein kann, wird in den Segm ent –Regist ern gespeichert . Also CS, DS, ... . Doch das k onnt e j a nicht alles sein, denn m it Hilfe von diesen Segm ent –Regist ern, k onnt e m an sich zwar im Adreßraum im Abst and von 16 Byt e " bew egen" , doch m an m ußt e j a j edes einzelne Byt e explizit ansprechen können ( und nicht nur j edes 16.) . An diesem Punkt kom m en die sogenannt en Offset –Regist er ins Spiel. Durch dieses zweit e Regist er k ann m an sich innerhalb eines Segm ent es bew egen. Denn es gibt den Abst and vom Beginn des Segm ent s ( welcher, wie wir j a wissen in den Segm ent –Regist ern gespeichert ist ) , bis zu der gewünscht en Speicher st elle an. Dieses Offset –Regist er ist der Zeiger auf den Segm ent –I nhalt . Som it erhalt en wir eine Met hode, bei der wir m it 2 Regist ern j ede St elle in dem 1 MB großen Adreßraum ansprechen können.
Die Segmentregister Wir haben besprochen, w ie die Segm ent ierung funkt ioniert , nun m üssen w ir noch die Aufgaben der Segm ent regist er klären. Es exist ieren folgende Segm ent r egist er ( wie wir am Anfang schon gelernt haben) : CS DS ES SS
„ code segm ent regist er“ „ dat a segm ent regist er “ „ ext ra segm ent regist er“ „ st ack segm ent regist er“
FS GS
„ help segm ent 1 regist er“ ( erst ab dem 80386 vorhanden) „ help segm ent 2 regist er“ ( erst ab dem 80386 vorhanden)
Die Aufgaben der Regist er CS und DS sind w ohl klar: I n ihnen ist die Segm ent –Grenze einm al für den Code und einm al für die Dat en gespeichert . Das „ st ack segm ent regist er“ beinhalt et die Segm ent –Grenze für den St ack, welcher in einem ext ra Kapit el behandelt wird. Das „ ext ra segm ent regist er“ wird bei St ring–Operat ionen benut zt . Die „ help segm ent regist er“ dienen zur w eit eren Aufnahm e, und finden m eines Wissens nach kaum Beacht ung.
- 8 -
06.11.1999
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
Der Leser, der die Segm ent ierung v erst anden hat , wird sich j et zt fragen, w elche die dazu gehörigen Offset –Regist er sind. Diese sind nur zw eim al klar definiert : Näm lich für das „ code segm ent regist er“ , w elches als Offset –Regist er das I P ( EI P) Regist er hat . Und für das „ st ack segm ent regist er“ ist das SP ( ESP) Regist er zust ändig. Für die übrigen Regist er k om m t es auf den Befehl an, von dem es dann abhängt , w elches andere Regist er den Offset –Ant eil bildet .
Glossar / Zusammenfassung Das Kapit el über die Segm ent e beim 80386 ist sicherlich eines der schwieriger en Sort e, deshalb folgt j et zt noch einm al so et was wie eine Zusam m enfassung, m it einer näheren Er klärung:
Segment Ein Segm ent ist m indest ens 16 Byt e groß, kann aber bis zu 65.536 Byt e groß sein. Das hängt dam it zusam m en, daß ein Offset –Regist er ( w elches 16 Byt e groß ist ) einen m axim alen Wert von 2^ 16 aufnehm en kann. Wenn dies der Fall ist , wird die nächst e Segm ent –Grenze überschrit t en, und kann som it das Segm ent auf den Wert von 65.536 Byt e erhöhen.
Segment–Grenze Die Zahl, die in einem Segm ent regist er gespeichert wird, nennt m an Segm ent –Grenze, da es auf den Anfang eines Segm ent es zeigt .
Adresse Die Adresse einer Speicher st elle wird in einem Segm ent r egist er und einem Offset –Regist er gespeichert , w elcher folgender Not at ion folgt : SEGMENTREGI STER : OFFSETREGI STER. z.B. m erkt sich der Prozessor über die Regist erk om binat ion CS: I P ( ab dem 80386 CS: EI P) w elchen Befehl er als nächst es ausführ en m uß. Die physikalische Adr esse bek om m t m an indem m an den Wert im Segm ent regist er * 16 nim m t ( da m an den Adreßraum in Blöcke zu j e 16 Byt e aufget eilt hat ) und den Wert im Offset –Regist er hinzu addiert . Daraus folgt : Adresse = 16 * Segm ent + Offset .
Offset(–Register) Der Offset –Ant eil einer Adr esse wird im Offset –Regist er gespeichert . Ein Offset –Regist er ist ein Zeiger um sich innerhalb eines Segm ent es zu "bew egen" . Der Offset –Ant eil einer Adr esse wird zu der „ Segm ent –Grenze“ hinzu addiert .
Physikalische Adresse Eine physikalische Adresse ist eine „ wahr e“ Adr esse im Speicher. Eine norm ale Adresse best eht aus einem Segm ent regist er, und einem „ Offset –Regist er“ . Daraus läßt sich eine physikalische Adresse errechnen. ( siehe „ Adresse“ )
Die Segmente ab dem 80386 Das was wir gerade bespr ochen haben w ar nicht sinnlos, da diese Regeln heut e für DOS Program m e im m er noch gelt en. Doch derj enige der sich am let zt en Teil fast die Zähne ausgebissen hat , wird j et zt fr oh sein, denn für Windows Program m e gelt en diese Regeln nicht m ehr.
Der Bus und dessen Auswirkungen Es gibt im m er noch einen Adreßbus und einen Dat enbus, doch sind seit dem 80386 beide gleich groß. Das bedeut et , daß m an m it einem Adreßbus von 32 Bit m axim al 2^ 32 Byt e ansprechen kann. Dies sind 4 GB. Da nun auch der Dat enbus 32 Bit groß ist , braucht m an - 9 -
06.11.1999
Assem bler–Tut orial – Gr undlagen und Theor ie
© Hubert us Loobert & seaw0lf ( pdf- only) ht t p: / / w w w .am ok.notrix.de
keine Segm ent e m ehr. Es exist iert nun ein " flat m em ory m odel" . Dieses neue Speicherm odell hat zur Folge, daß alles linear ist . Doch w ozu w erden dann noch die Segm ent regist er benöt igt , die j a noch da sind, und sogar Zuw achs bekom m en haben m it FS und GS. Das hat folgenden Grund: Die 4 GB Adreßraum , die j edes Program m besit zt sind virt uell. Dies bedeut et , daß das Bet riebssyst em m it Adressen arbeit et , die gar nicht exist ieren. Und das Bet riebssyst em ist dafür verant w ort lich, daß die akt uellen Dat en im physikalischen Speicher zur Verfügung st ehen. Um dies zu bewerk st elligen braucht Windows sogenannt e Deskript or en. I n diesen Deskript oren st ehen I nform at ionen die Windows dazu benöt igt , wie z.B. Zugriffsbericht igungen. Genau an diesem Punkt k om m en die Segm ent regist er ins Spiel; sie zeigen näm lich auf die Deskript or en. Doch diese Vorgänge sind für eine „ Crack er“ unint eressant . Es ist nur wicht ig zu wissen, daß m it Windows ein " flat m em ory m odel" eingeführt wurde. Die Segm ent regist er k önnen som it beim „ Crack en“ außer acht gelassen werden. ( Wer sich t rot zdem für diese Vorgänge int eressiert , findet I nform at ionen im „ I nt el Archit ect ure Soft w ar e Dev eloper` s Manual“ im Abschnit t „ Prot ect ed- Mode Mem or y Managem ent “ .)
Der Stack Der Stack allgemein Der St ack ist ein wicht iger Best andt eil eines Program m es. Er ist so wicht ig ( und so vollkom m en unbekannt in den „ Cracking–Tut orials“ ) , daß ich ihm ein eigenes Tut orial gewidm et habe. I ch w erde ihn hier ausführlich behandeln, da er sehr wicht ig ist im Bezug auf 'API Funkt ionen'. Das St ack–Ende findet m an zu j eder Zeit in der Regist er kom binat ion SS: ESP. ( Das Segm ent regist er SS, und das Offset –Regist er ESP) . Der St ack ist eine Art Ablageplat z. Dort können Dat en gespeichert w erden. Dies m uß m an zum Beispiel m anchm al vor dem Aufruf eines Unt erprogram m es t un, um die I nhalt e wicht iger Regist er zu " ret t en" , die sonst im Laufe des Unt erprogram m es verloren gehen würden. Dur ch den Befehl PUSH kopiert m an einen Wert auf den St ack; durch den Befehl POP holt m an einen Wert w ieder herunt er . Mit dieser Erklärung könnt e m an sich zufrieden geben. Doch das werden wir nicht . Was also passiert wenn m an z. B. m it t els des Befehls „ PUSH EAX“ ( Der Befehl PUSH erwart et nat ürlich eine Angabe, was er auf den St ack kopier en soll. Diese Angabe wird im m er nach dem Befehl gem acht .) Durch diesen Befehl verändert sich der Zeiger des St ack . Danach zeigt er näm lich auf den I nhalt von EAX. Vor dem Befehl: ???