
Statistik Anzeige | Tutorial: Assembler Grundkurs -- Teil 1 -- TheorieAssembler Grundkurs -- Teil 1 -- TheorieDer Kurs beschreibt die ASM Programmierung und versucht es verständlich zu machen. Hallo, dieser Assembler Grundkurs soll als Einstieg in die Assemblerprogrammierung dienen. Da ich allerdings dieses Tutorial eher für die Verwendung zur Betriebssystemprogrammierung geschrieben habe, habe ich versucht, jegliches Betriebssystemabhängige wegzulassen. Wer z.B. vorhat nur für Windows zu programmieren, sollte ein anderes Tutorial bzw. ein weiteres Tutorial sich einverleiben. Die Suche bei Google ("Assembler Tutorial") bringt wahre Wunder hervor, glaubt es mir ;) Ich habe folgende Gliederung in diesem 1. teil des Tutorials: 1.Theorie 2.Philosophi 3.Voraussetzungen Teil 2 des Tutorials enthält dann den Einstieg. Leider müsst ihr euch noch gedulden, bis es richtig losgeht :( btw. ich glaub, Bilder braucht man bis jetzt keine :-) 1. Theorie Die Theorie ist eigentlich ganz einfach. Assembler bildet den Grundstock für jede Programmiersprache. Jeder Assemblerbefehl wird 1:1 in den Maschinencode umgewandelt. Daraus ergibt sich dann unweigerlich eine gewisse Systemabhängigkeit. z.B. Wenn man in C printf(...) schreibt, kann dieser Befehl von jedem C-Compiler, egal auf welchem System, umgewandelt werden. So ist es egal, ob der C-Code unter Windows auf einem 8086 Prozessor umgewandelt wird oder für einen Mikroprozessor in einer Küchenuhr übersetzt wird. Dies hängt mit den Header Dateien von C zusammen. In diesen ist definiert, wie z.B. die printf(...) Funktion in Assembler aussieht. wenn man z.B. für einen 8086er Prozessor kompatiblen Code erstellen will, muss man nur die entsprechenden Headerdateien includen. Bei Assembler ist das anders. Assembler wird 1:1 umgewandelt in Maschinencode. Dazu ein Beispiel: Der Befehl zum Neustarten ist auf einem 8086 Int 19h (wobei dieser Int so weit ich weis wiederum vom BIOS zur Verfügung gestellt wird). Was genau Int' s sind, und wie diese mit dem BIOS zusammenhängen, erfährt ihr später. Der Maschinencode für int 19h lautet im Hexadezimalsystem CD19. Nun kann es allerdings sein, dass genau dieser Code auf einem Mikroprozessor überhaupt nicht vorhanden ist oder eine Funktion zum löschen eines Speichers aufruft. Dieses Problem kann man nicht umgehen. Vielleicht werden jetzt einige sagen: Aber man könnte doch den Assemblerquelltext mit einem Assembler übersetzen, der für den gewünschten Prozessor entwickelt wurde. Nun, theoretisch stimmt das, praktisch gibt es aber zig verschiedene ASM Syntaxen. Für jeden Prozessor einen. Mit der Portabilität ist es also nicht weit her. 2. Philosophi So, hier will ich über die Vorteile, Nachteile und auch Vorurteile sprechen. Fangen wir mit dem Vorteil an: ASM ist schneller, kleiner und effizienter als der Maschinencode, den höhere Programmiersprachen Compiler erzeugen. Ein Problem hierbei ist, dass ich auf einem 2Ghz AMD nicht viel merke, ob ich ein ASM Programm oder ein C Programm ausführe :( Auch ist es einer 80 GB festplatte merklich egal, ob die Datei 100Byte oder 10 KByte hat. Besonders, da die Dateisysteme wie Fat32 eine einzelne Datei sowieso unnötig vergrößern. So gesehen bringt ASM nicht wirklich was, außer dass man mit ASM Sachen machen kann, die eine höhere Programmiersprache nicht zusammenbekommt. Da sind wir bereits beim nächsten Punkt: Mit ASM hat man bis zum letzten Ticken der Systemuhr die volle Kontrolle über das System! Die Nachteileliste ist leider länger: ASM Code wird unübersichtlich und ist schwer zu warten. Wenn in einem Softwareunternehmer die Arbeiter mit ASM arbeiten müssten, würde sich das Unternehmen wohl bankrott zahlen müssen an den Gehältern. Denn schaut man den Quellcode eines C Programms und eines ASM Programms an, hat man grob geschätzt ein Verhältnis von 1:10. Dementsprechend länger dauert es, bis man den gewünschten Erfolg mit ASM hat. So, das reicht auch schon, ich will es ja keinem vermiesen ;) Außerdem greife ich jetzt einige Aspekte noch mal auf, um die Nachteile etwas zu entschärfen und einige Nachteile zu den Vorurteilen zu verschieben. Dass der Code unübersichtlich werden kann, ist ja klar. Wer will, kann gerne mal die Sourcen von meinem Betriebssystem ( http://bielos.de.tk )anschauen. Wenn man dann anschaut, wie wenig am Schluss eigentlich rauskommt, ist es sicherlich etwas beängstigend. Allerdings kann jeder Herr über das Chaos werden! Was man machen muss, ist eben strenge Kommentierung! Natürlich nicht jede Zeile, aber wenn man, z.B. eine Funktion zur Ausgabe von Zahlen schreibt, sollte man das auf jeden Fall dazu schreiben. Dadurch erübrigt sich auch die schwere Wartbarkeit. Wenn ich Kommentare streng setze, sehe ich auf den 1. Blick, wo ich den Fehler suchen muss. Sicher, es dauert einige Zeit, bis man das Fehlersuchen in ASM beherrscht (übrigens dauert es auch, bis man Kommentiert - ich habe in noch keinem Projekt so viele Kommentare gesetzt, wie in meinem Betriebssystem :-)), allerdings wenn man es beherrscht, dauert es oft nur kurze Zeit, bis man einen Fehler findet. Was leider kein Vorurteil ist, dass ASM viel länger dauert zum programmieren. schade eigentlich, aber das soll uns nicht abhalten. Ein klares Vorurteil ist die Behauptung, dass ASM schwer sei. Ich bin der Meinung, dass C++ schwerer als ASM ist. Aber das muss wohl jeder selbst entscheiden. So, der Teil wäre nun auch geschafft. Weiter geht es mit den Voraussetzungen. 3. Voraussetzungen Das ist leicht aufgezählt. Zum ASM programmieren benötigt man zuerst mal einen Assembler, der die Befehle in (halben) Maschinencode umwandelt. Ich kann hier 3 Assembler empfehlen: 1. den MASM 2. den TASM 3. den FASM Zu 1. Dieser ist, soweit ich weis, Freeware. Der MASM ist übrigens von Microsoft. Zu kriegen ist er unter anderem hier: http://www.codingcrew.de/masm32/index.php Wenn man das runterlädt, merkt man, dass ziemlich viel Schrott dabei ist. Hier muss man dann den MASM und den Linker selber suchen. Wer es bequemer mag, sollte mal diesen Link ausprobieren: http://www.phatcode.net/downloads.php?sub=compilers Da ist der MASM auch zu erhalten. Allerdings ungetestet. Zu 2. Dieser ist, soweit ich weis, KEINE Freeware. Zumindest in den neueren Fassungen nicht. Da man allerdings den alten C++ v1.x Compiler von Borland herunterladen kann, kann man getrost den TASM benutzen, der dem C++ Compiler beigelegen ist. http://community.borland.com/article/0,1410,21751,00.html Da müsste der C++ Compiler zu kriegen sein. Runterladen, entpacken und dann darin den TASM+TLink suchen. Der TASM ist, wie bereits gesagt, von Borland. Zu 3. Der FASM ist für die Betriebssystemprogrammierung mehr als geeignet. Ihn kann man auf Sourceforge kostenlos herunterladen. Und auch hier: http://www.phatcode.net/downloads.php?sub=compilers Auch hier: Ungetestet! Allgemeine Anmerkung zu den Assemblern: Der Syntax von TASM und dem MASM ist relativ gleich. Ich verwende in diesem Tut den FASM. Wie genau das alles funktioniert, erfährt ihr später. Des Weiteren benötigt man unter Umständen einen Linker. Ich habe durch die Bemerkung "(halben) Maschinencode" bereits angedeutet, dass ein Assembler den Code nicht allein in Maschinencode umwandelt. Vielmehr benötigt man unter Umständen noch einen Linker. Der genaue Unterschied zwischen Assembler und Linker ist nicht wichtig, aber grob gesagt, ist es so: Ein Assembler verwandelt den Code in eine Objektdatei. Er verwandelt z.B. Variablen in die richtige Speicheradresse. Der Linker hingegen erstellt den Dateiheader und erstellt dann den richtigen Maschinencode. Ich schreibe "unter Umständen" deshalb, da der FASM keinen Linker benötigt. Er erstellt sofort eine Binärdatei ohne Header. Diese Linker sind bei beim MASM und TASM mit enthalten. Beim TASM heißt er TLink und beim MASM entweder nur Link oder auch MLink. Beide benötigen übrigens noch eine Extradatei. Beim MASM ist es eine Datei, in der lediglich Fehlermeldungen gespeichert sind. Der TASM hingegen benötigt scheinbar eine Systemdatei, die bei manchen Windowsversionen vorhanden ist und bei manchen nicht. Ich gehe davon aus, dass, wenn irgendeine Delphi Version oder der C++ Compiler von Borland installiert ist, diese Datei bereits vorhanden ist. Ist sie dieses nicht, gibt der TASM und der TLink sowieso eine Fehlermeldung aus. Dann einfach den Dateinamen aufschreiben und im Internet danach suchen. Das gleiche gilt für den MASM und MLink. Um übrigens das Tutorial (vor allem die Codes) richtig zu verstehen, würde ich dazu raten, den FASM zu benutzen, da ich auf die Benutzung der anderen Assembler und Linker nicht weiter eingehe und nur den FASM benutze. Die Benutzung des FASM wird im nächsten Teil erklärt ;) Als weitere Voraussetzung könnt ich noch starke Nerven und einen ebenso starken Kaffee empfehlen ;) Wie dem auch sei. Das ist nun der Schluss dieses Teils und auch der Schluss dieses Tutorials. Im nächsten Teil des Tutorials kommt dann der Einstieg in die Sprache. Dieses Tutorial wurde von biehler am 04.01.2006 verfasst. Kommentare
|