64 Bit Assembler lernen.

5 Antworten

Ein weitere Möglichkeit ist der High Level Assembler. Den gibt es für Linux und Windows mit dem zugehörigen Lehrbuch "The Art of Assembler Programming". Das Buch gibt es frei und gedruckt. Der Autor ermutigt jeden Programmierer Assembler zu lernen und geht davon aus, daß Vorkenntnisse in Hochsprachen vorhanden sind. Der HLA benutzt einige dieser Statements, um den Einstieg in Asm zu vereinfachen. Das Ausgeben eines Textes unter Linux und Windows oder die Programmierung von Schleifen erfordert schon fortgeschrittenere Asm-Kenntnisse. Zu Beginn werden diese Sachen mit Hochsprachstatements realisiert. Im weiteren Textverlauf werden die Asm-Programmierungen gezeigt. Den vorher gegebenen Tip auf Adam Osbornes Buch "Grundlagenbuch der Mikrocomputer-Technik" aus dem te-wi Verlag kann ich als Ergänzung zum HLA-Lehrbuch uneingeschränkt unterstützen. Dort werden die Grundlagen der Mikroprozessortechnik und -programmierung vermittelt. Es ist nur noch antiquarisch erhältlich.

Hallo.

Erstens: Ich würde vielleicht nicht gleich mit dem x86-64-Assembler beginnen!

Ich selbst habe im sehr jungen Alter (ich war damals in der Grundschule in der 4. Klasse) ein Buch über den Aufbau von Rechnern und Assembler-Programmierung in die Hand bekommen: "Microcomputer-Technik" von Adam Osborne. Wer sich damals für Computer interessierte, musste sich erstmal einen selber bauen! Daher beschreibt das Buch ganz eindrücklich den Aufbau von Rechnern, wie diese intern funktionieren und wie man diese mit Assembler programmiert. Obwohl die Technik inzwischen weit fortgeschritten ist, ist dieses Buch was die Grundlagen angeht immer noch brandaktuell. Leder wird es das Buch wohl nur noch im Antiquariat geben.

Das Buch beschreibt in der zweiten Hälfte einen einfachen 8-Bit-Prozessor. Der 6800 (das ist der Prozessor, mit dem ich damals begonnen habe) hat nur ein Register mehr als der dort beschriebene Prozessor und ist daher einer der einfachsten Prozessoren, die ich kenne (noch einfacher als der 6502).

Wenn du aber direkt mit dem x86 anfangen willst, dann beginne erst einmal mit 32-Bit Code. Sowohl 64-Bit-Linux als auch 64-Bit-Windows erlauben das Ausführen von 32-Bit-Code.

Besser wäres es aber, du besorgst dir einen Emulator für einen 8-Bit-Prozessor und versuchst, dich in den 8-Bit-Chip hineinzuversetzen, bevor du versuchst, einen so komplexen Chip wie den 80386 zu verstehen - was du zumindest teilweise können musst, bevor du dich an Assembler dranmachst.

Natürlich sind die Befehle andere (z.B. "LDAA &1234" beim 6800 anstatt "mov 0x1234,%eax" beim 386), jedoch ist der Umstieg von einem Chip auf einen anderen nicht so schwer, wie sich erstmalig in die Assemblerprogrammierung hineinzuversetzen.

Zweitens: Warum hat das Tutorial nur 16-Bit Code?

Ganz einfach: Natürlich könnte man mit Assembler direkt auf die Hardware zugreifen - wenn kein Betriebssystem da wäre, das mittels MMU den Programmen den Zugriff auf Hardwarekomponenten verbieten würde. Man müsste dann (wenn das Betriebssystem das zulassen würde) an eine bestimmte Adresse einen Wert schreiben, um ein bestimmtes Pixel auf dem Bildschirm schwarz oder weiß zu machen und dadurch einen Text darzustellen - nicht gerade einfach.

Die einzige gangbare Variante ist also, aus dem Assemblercode heraus das Betriebssystem (oder das BIOS) aufzurufen, um z.B. einen Text auf den Bildschirm zu schreiben.

Bei MS-DOS (das war das Betriebssystem, das bis etwa 1995 überall lief) wurde dies über den Interrupt 21h (dies ist die letzte Zeile in deinem Beispielprogramm) gemacht. Bei 32-Bit-Linux-Programmen geht dies über Interrupt 80h. Bei 64-Bit-Linux-Programmen über die Assembler-Anweisung SYSCALL.

Bei Windows geht dies gar nicht direkt. Man muss die aus C/C++ bekannten Funktionen (wie z.B. "printf()") aus dem Assemblerprogramm heraus aufrufen. Dies kann man prinzipiell auch in Linux und in MS-DOS machen - wenn man aber 32-bit-Programme im 64-bit-Linux laufen lassen will, muss man dazu zusätzliche Bibliotheken installieren.

Da man bis Windows Vista MS-DOS-Programme noch direkt in Windows laufen lassen hat können, es nur wenige Leute mit Linux-Rechnern gab und man die Variante "C-Funktion aus Assembler heraus aufrufen" nicht im Tutorial zeigen wollte, hat man sich eben für MS-DOS-Code (also 16-Bit) entschieden.


RoflX 
Beitragsersteller
 05.10.2013, 12:27

Egal , ich hab mir jetzt vorgenommen , das 16 Bit Assembler zu lernen (also für x86 Prozessoren ) und dann die erweiterung von x86 zu x 64 zu lernen.

Ist das so in Ordnung , oder was würdet ihr sagen.

Und übrigens , könnt ihr mir sagen wo ich einen kostenlosen Assembler und diesen Emulator herbekomme ? :) '

Danke

0
RoflX 
Beitragsersteller
 05.10.2013, 12:26

Antwortet mal auf meine Frage ;)

0
RoflX 
Beitragsersteller
 05.10.2013, 09:49

Was wäre nun dein Vorschlag ? :)

0
PerfectMuffin  05.10.2013, 10:16
@RoflX

Besser wäres es aber, du besorgst dir einen Emulator für einen 8-Bit-Prozessor und versuchst, dich in den 8-Bit-Chip hineinzuversetzen, bevor du versuchst, einen so komplexen Chip wie den 80386 zu verstehen - was du zumindest teilweise können musst, bevor du dich an Assembler dranmachst.

Varflucht... jetzt will ich einen 8bit-Prozessor programmieren! ;-;

0
procoder42  05.10.2013, 10:22
@PerfectMuffin

ich auch tja ich werd mir wohl nen emulator holen . möge das programieren beginnen :D

0
PerfectMuffin  05.10.2013, 10:38
@procoder42

:o Aber wo? Und einen Assembler bräuchte ich dann auch.

Ein Tutorial über den 6800 habe ich aber noch.

0
procoder42  05.10.2013, 10:50
@PerfectMuffin

danke, englisch sollte für informatiker kein problem sein :D ich hab ne 2 wird wohl reichen

0

Was soll ich mir darunter vorstellen: „nachdem ich C und C++ Grundkenntnisse gesammelt habe“?

So wie du es schreibt, ist auch das: „64 Bit Assembler lernen“ völliger Quatsch.

Assembler ist eine prozessor-spezifische Programmiersprache, die für jeden Prozessor anders ist. Anfangs gab es Prozessoren mit 8-Bit-Daten, die dann über 16 Bit, 24 Bit … auf 64-Bit-Daten erweitert wurden. Deswegen spricht der Fachmann aber nicht von „64 Bit Assembler“.

http://de.wikipedia.org/wiki/Assemblersprache Weiter unten findest du auch wichtige Literatur zu dem Thema!


RoflX 
Beitragsersteller
 05.10.2013, 12:24
  1. Damit meine ich das ich jetzt Assembler lernen möchte .
  2. Wenn dus meinst.
0

Du wirst im deutssprachigen Raum niemanden finden, der wirklich Ahnung hat. Keiner hat den A... in der Hose, dass zuzugeben, statt dessen labern sie nur nach, was im englischen seit Jahrzehneten bekannt ist. Wenn man die vorherigen Antworten liest, stellt man fest, dass die Frage nach 64er Assembler entweder ignoriert wird, oder auf x86er umgeleitet wird. Wer den Unterschied zwischen diesen beiden nicht einmal sieht, kann mit Assembler unter Garantie auch nichts anfangen. Ich bin 58 Jahre und will auch mit Assembler anfangen - im Netz tummeln sich im deutschsprachigen Raum wohl nur technische Idioten. Lerne englisch, dann kommst Du wesentlich direkter an's Ziel - ich mache das gerade ebenso. Grüße und Kopf hoch, auch wenn der Hals dreckig ist ;-)

Einen Einstieg in Assembler würde ich dir nicht auf einer Intel-Architektur empfehlen, die x86 oder x64 ist - denn das sind CISC Prozessoren mit einem sehr großen und umfangreichem Befehlssatz (Compex Instruction Set Computing). Das ist sehr spannend und aufregend (in mehrfachem Sinn).

Um ein Gefühl für Assembler zu bekommen empfehle ich daher "Einsteigern" einen einfachen Prozessor wie den MSP430 den es aktuell als Launchpad-Entwicklungsumgebung sehr preiswert gibt. Warum? Das ist ein RISC (Reduced Instruction Set Computing), der viel einfacher zu verstehen ist, wo man das Datenblatt zum Prozessor auch mit (noch) wenigen Kenntnissen lesen und verstehen kann (sind natürlich alle auf Englisch). Sind dennoch rund 400 Seiten und dazu kommt dann noch das Prozessor-Handbuch, etwa ebenso dick. Intel ist ein mehr als 10-20 Faches davon. 

Das ist für den Einstieg schonmal recht viel zu lesen und zu überschauen. Denn als Assemblerprogrammierer stehe ich auf anderen Beinen als in C oder anderer Hochsprache. Wo es bequeme Methoden ala printf gibt, die "einfach da" sind, bin ich hier bei Systemcalls und Interruptroutinen die angesprungen werden können/müssen.

Damals unter MsDOS waren das die INT xxH wo man Funktionen vom Betriebssystem bekam, als Beispiel sei nur einer INT 21H erwähnt. Wenn man ein einzelnes Zeichen auf der Console ausgeben wollte hat man das das Prozessorregister DL den ASCII Code geschrieben (mov) und dann 0x01 in das Register AH (mov, auswahl der Subfunktion) und dann einen int call auf 0x21. Und schon schrieb MsDOS ein Zeichen auf den Bildschirm. Und daneben gab/gibt es noch die BIOS Routinen die genauso angesprungen wurden. In meiner Erinnerung INT 13H - für Festplattem und Diskettenlaufwerke.  

Von den Funktionen gab es eine Menge, damals kam man auf die Hardware, das sieht heute etwas anders aus, das wird in Virtuellen Maschinen gekapselt, so dass man eben nicht mehr den Kernel umgehen kann.  

Unter Linux (da kenne ich mich besser aus) geht es dann ans aufrufen der SysCalls, die Funktionen für deine Programme bereitstellen, vom groben Prinzip her das gleiche, Einsprungpunkt ist 0x80, für Text auf Console schreibt man hier die (Start.)Adresse des Strings nach Register ECX, die Länge die ausgegeben werden soll nach EDX, den Filedescriptor (STDOUT ist immer die 1 unter Linux) und nach EAX den Code für den Systemcall "write" 0x04 und ruft dann den int call auf 0x80 auf. 

Gleicher Prozessor - unterschiedliches Programm, weil hier ein anderes Betriebssystem läuft. Das macht Assembler-Code viel weniger portierbar weswegen Hochsprachen wie C den Siegeszug angetreten haben. 

Klar sollte sein, dass ein Prozessor natürlich nicht auf die Console schreiben kann, da läuft auch wieder weitere Software die das dann alles an die richtige Hardware delegiert. 

Und nu? Was sollte das?

1. Assembler ist meiner Meinung nach SEHR spannend

2. Aber man braucht (da OS vorhanden) sehr gute Kenntnisse davon

3. Man braucht fundierte Kenntnisse des konkreten Prozessors und seiner Architektur

4. Die Lernkurve ist extem steil.

5. Gute Assembler-Programme zu schreiben, wenn der Prozessor Pipelines hat ist nicht trivial, wenn man Performance braucht

6. Compiler liefern sehr gute Performance aus C heraus.

7. Von Hand kann man noch ab und an was holen. 

Assembler brauchen tut man wirklich nur bei Ausnutzen von Prozessorfeatures und bei Treibern. Aber in der Regel mache ich sowas heute mit Inline-Assembler aus C heraus.

Andere Quellen wurden schon genannt, und einen Blick hinter die Kulissen zuwerfen sollte man tun. 

Das was ich Einsteigern geb: http://robotics.hobbizine.com/asmlau.html