Was ist Assembler ?

...komplette Frage anzeigen

12 Antworten

Ein Assembler ist ein Übersetzer für Programmcode, der sich aus Maschinenbefehlen zusammensetzt. Diese Befehle können sich je nach
verwendeten Prozessor stark unterscheiden.

In der Art der verwendeten Befehle besteht der wesentliche Unterschied zu allen anderen Programmiersprachen. Während sich Befehle bei den Hochsprachen in der Übersetzung aus mehreren Anweisungen im endgültigen Code zusammensetzen, wird der Assemblerbefehl durch den Assembler lediglich in die entsprechende Binärform übersetzt. Weiterhin ersetzt der Assembler Variablen durch die entsprechenden Speicheradressen.

Zitat aus http://assembler.hpfsc.de/

Man schreibt also keine Nullen und Einsen, sondern nutzt eine Befehlssyntax. Der Assembler übersetzt dann die Befehle auf direktem Weg in Nullen und Einsen (mal vereinfacht ausgedrückt), also in direkte Anweisungen für den Prozessor. Man spricht deshalb von hardwarenaher Programmierung (im Gegensatz zu Hochsprachen).

Hier gibt es ein Online-Buch für Anfänger:

https://de.wikibooks.org/wiki/Assembler-Programmierung_f%C3%BCr_x86-Prozessoren

und hier ein PDF:

http://avr-asm-download.de/beginner_de.pdf

Du findest im Netz noch viele weitere Informationen, ggf. solltest Du Dir auch ein gutes Anfänger-Buch kaufen, vielleicht gibt es eine gute Buchhandlung in Deiner Nähe, die entspr. Literatur anbietet.

Antwort bewerten Vielen Dank für Deine Bewertung

Auch wenn ich dir deine Fragen zur Genüge beantworten könnte, tue ich das jetzt aus Zeitmangel nicht. Außerdem haben dir die anderen schon genügend geschrieben (mit dem ich teilweise aber nicht einverstanden bin ... aber egal).

Nur so viel: Ich spüre, dass du gaaaanz kurz vorm Durchbruch bist! Jetzt bloß nicht aufgeben!

Halte dich einfach an die Tutorials auf der offiziellen NASM Website, und häng dich bei jedem auftretenden Problem rein, bis es läuft.

Ich weiß noch, wie das früher bei mir war ... ich habe auch ewig gebraucht, bis "Hello World" lief (das war so 1990), aber dann kam der Aha-Effekt und die Erfolge sprudelten nur so.

Gerade bei Assembler wirst du als Anfänger ganz am Anfang nicht alles verstehen können ... das ist aber egal, solange du einfach weiter machst. Irgendwann macht es dann schon "Klick".

Wenn erst einmal dein "Hello World" läuft, kannst du ja auch mal viele andere Assembler-Dialekte ausprobieren (v. a. x86-64 o. ARM), dich in eine andere Syntax einarbeiten (Intel vs. AT&T), verschiedene Assembler benutzen (NASM, MASM, GAS, HLA, o. sogar TASM, etc.) und die Interfaces wechseln (Interrupts & Syscalls o. Libc-puts).

Ich garantiere dir, dass wenn du JETZT aufgibst, wirklich etwas großes verpassen wirst! Sei dir dessen bewusst.

Assembler ist über all die Jahre hinweg eine meiner Lieblings-Sprachen (wenn man das überhaupt als Sprache bezeichnen will). Das, was damit möglich ist, bekommst du in keiner anderen Programmiersprache hin, auch wenn Aufwand und die investierte Zeit oft überproportional sind.

Relativ kurze Zeit, nachdem du dich eingefummelt hast, wirst du mit Assembler schon grafische Oberflächen und Netzwerksachen programmieren können, wobei die resultierende EXE (oder ELF) Datei deutlich kleiner als 1KB ist (im Schnitt 500 bis 700 Byte, z. B. für eine Webcam-Software mit Bildupload über FTP).

An der Stelle, an der du dich jetzt gerade befindest, trennt sich das erste mal die Spreu vom Weizen. Also mach weiter! "Hello World" wirst du auf jeden Fall hinbekommen!

Viel Erfolg! :)

Antwort bewerten Vielen Dank für Deine Bewertung
GluecklicheHuhn 08.08.2016, 17:37

Vielen dank! Ich habe es mittlerweile in der VM geschafft "Hello World" oder andere Texte auszugeben.

1

https://de.wikipedia.org/wiki/Assemblersprache

Ich habe vor ca. 30 Jahren noch Assembler auf dem c64 programmiert. Der hatte einen Prozessor mit einem recht überschaubaren Befehlssatz und man konnte nette (kleine) Sachen damit machen.

Die modernen Prozessoren mit Level 1,2,3 Cache, Pipelining, protected Memory und ähnlichen Spezialitäten kann man meiner Meinung nach als Amateur nicht mehr auf Maschinenebene selbst programmieren. Dafür ist der Mensch zu fehleranfällig. 

Lerne höhere Programmiersprachen daran hast du mehr Freude und weniger Frust.

Antwort bewerten Vielen Dank für Deine Bewertung

Ein Assemblerbefehl war (ist) z.B.

MVC A,B

Das bedeutet, dass der Inhalt der Speicherstelle B nach A übertragen wird (alter IBM-Assembler).

MVC steht für Move Characters.

Ich weiß den Maschinenbefehl von MVC nicht mehr auswendig (F2 oder D2 ?). Dahinter steht dann die Länge des Empfangsfelds, das im Bestimmungsteil des Programms abgelegt ist, und wieder dahinter die Adressen der Speicherstellen (meist noch durch Registerinhalte modifiziert).

Das macht der Programmierer nicht selber, sondern ein Programm, das dann auch "Assembler" heißt. Im Maschinencode nimmt dann so ein Befehl 1 bis 4 Bytes ein - je nach Komplexität.

Was haben wir damals herumoptimiert, um Speicherplatz zu sparen. Teile des Maschinencodes wurden sogar als Längenschlüssel verwendet.

Und heute? ...

Mein erstes Assemblerprogramm hieß SOAP (Self Optimalizing Assembling Program) und verwaltete einen sich drehenden Trommelspeicher, damit dieser immer die richtige Stellung für den nächsten Befehl hatte. Dieser hatte 10.000 Speicherplätze. Das war noch vor der Erfindung von "MVC".

Antwort bewerten Vielen Dank für Deine Bewertung

Nun da sich der direkte Maschinencode ja aus Nullen und Einsen zusammensetzt (also aus Binär Zahlen) muss der Editor der ja nicht weiß das es sich um einen direkten Binär Code handelt diese Nullen und Einsen interpretieren das tut er in dem er die Nullen und Einsen nimmt und in 8er Gruppen zusammenfasst, sodass sich daraus eine Zahl zwischen 0 und 255 ergibt. Jede Zahl steht aber dann im ASCII System für ein Zeichen und das wird dir dann statt der Nullen und Einsen dargestellt.

Wenn Du also einen Binärcode direkt anzeigen lassen willst, dann musst du auch einen Binäreditor zum anzeigen der Dateien verwenden.

Antwort bewerten Vielen Dank für Deine Bewertung
GluecklicheHuhn 06.08.2016, 22:14

Hab ich mir mal gedownloadet

0

Diese "exe-Gedöns" ist doch gerade das, was Du mit Assembler erzeugst.

Die Syntax ist bei allen Assemblern eigentlich dieselbe:

Ein Prozessor-Befehls-Mnemonic gefolgt von keinem oder den dazugehörigen Parametern. Diese Parameter sind Register, Speicheradressen (Variablen) oder feste Werte, bei Sprüngen auch Zielmarken, die später in Befehlsadressen umgerechnet werden.

Der Assembler transferiert die Folge solcher Befehle in eben jenes exe-Gedöns. Dabei ist "ê| ú¸ ŽÐ¼ û¸ ŽÀŽØˆ" eben auch nur eine Darstellung der Daten.

Antwort bewerten Vielen Dank für Deine Bewertung
GluecklicheHuhn 06.08.2016, 22:12

Das heißt ja das alles in echt aus 10010101011110001 besteht !

0
Mikkey 06.08.2016, 22:15
@GluecklicheHuhn

Natürlich.

Allerdings besteht "Zehn kleine Negerlein" auch aus 01101010110110001...

0

In Assembler Sprachen werden einfach CPU Anweisungen direkt definiert, so wie sie eine CPU eben ausführt. Hochsprachen wie C++ müssen dagegen erst zu diesen Anweisungen kompiliert werden.

Die Verschiedenen Sprachen kommen zustande, da es verschiedene CPU Architekturen mit eigenen Befehlssätzen gibt. Bei Desktop PCs gibt es sowieso nur noch x86, aber viele Einplatinencomputer und so ziemlich alle Smartphones nutzen ARM. Also im Prinzip nur andere Anweisungen.

Wenn du mit einem Texteditor Maschinensprache lesen willst, wirst du nur wirres Zeug sehen, weil es eben keinen Zeichensatz verwendet wie UTF-8. Wenn du eine Datei mit einem Binär-Editor öffnest, wirst du nur 0 und 1 sehen, aber eben auch bei Textdateien. Unterschied ist eben, dass diese Nullen und Einsen CPU Anweisungen sind.

Wenn du PC Programme schreiben willst, würde ich dir nicht Assembler empfehlen, den Aufwand ist es nicht wert. Auf Mikrocontrollern ist das weitaus wichtiger.

Antwort bewerten Vielen Dank für Deine Bewertung
GluecklicheHuhn 06.08.2016, 22:02

Ist ja fast wie in Ägypten wo man auf der Wand Hieroglyphen übersetzen kann.

Ich will Assembler nicht richtig zum Programmieren benutzen. Keine Angst. Ich will nur wenigstens einmal ein Hello World in der Terminal ausgeben können.

0

Assembler ist ein maschinenorientierte Programmiersprache. Das bedeutet, für jede CPU gibt es einen eigenen.

Im Prinzip werden ja Maschinenbefehle durch Bytes dargestellt. Um das Programmieren anschaulicher zu gestalten, hat man nun diesen Bytes mnemotechnisch Abkürzungen zugeordnet. JPM (von 'jump') bedeutet z.B. 'springe zu' (einer folgenden Adresse).

Man konnte damit links einen Programmablaufplan erstellen und rechts daneben den entsprechenden Code schreiben.

ist dann da immer die Syntax komplett anders oder was?

Im Prinzip ja, da es vom Befehlsumfang der CPU abhängt.

sondern irgendein normales, wirres .exe-Gedöns: "ê| ú¸ ŽÐ¼ û¸ ŽÀŽØˆ)|è) ¸ ŽÀŽØê"

Das reassemblieren von Assembler-Programmen ist etwas schwierig. Erst einmal musst du ein Programm haben, das zu deiner Maschine passt. Zweitens besteht ein Programm nicht nur aus Programmcode, sondern auch aus Daten. Die Maschine kann aber gar nicht unterscheiden, was Code ist und was Daten sind. Wenn du wirklich eine binäre Darstellung brauchst (wieso eigentlich?) dann benötigst du ein Monitorprogramm.

Wiederum nicht dass ganze Gejammer dass Assembler eine schwere Sprache ist und und und.

Assembler ist keine schwere Sprache. Du beginnst halt nur bei Null (wobei ich wirklich Null meine) und musst dir meist ganze Bibliotheken erarbeiten (oder zur Verfügung gestellt bekommen) um die Arbeit tun zu können, die das Betriebssystem erledigt.

Man kann auch nicht in Assembler geschriebene Programme einfach ablaufen lassen (außer man hat einen Interpreter), sondern muss sie erst in Maschinensprache umwandeln (assemblieren). Auch das Verlinken muss extra geschehen.

Antwort bewerten Vielen Dank für Deine Bewertung

ich weiß nur das man als Assembler eine Maschinensprache bezeichnet.
Ist also sowas wie ein Oberbegriff für Maschinensprache und eine der gängigsten ist C wo du hardwarenahe programmieren kannst, der Kompiler übersetzt dann nur z.B. eine Objektorientierte Sprache wie z.B. Python/Java usw. in die Assemblersprache. Irgendwie so.. (korrigiert mich falls ich falsch liege, weil so hab ich es verstanden)

Gruß

Antwort bewerten Vielen Dank für Deine Bewertung
androhecker 06.08.2016, 22:04

Nein, weder sind Assemblersprachen Maschinensprache noch ist C eine Assemblersprache. Maschinensprache ist einfach nur CPU Anweisungen aus Nullen ind Einsen, die kann man nur schwer lesen. Assemblersprachen haben für solche schwer verständlichen Anweisungen normale Wörter, welche besser zu verstehen sind. C ist eine Hochsprache welche kompiliert werden muss, da sie Hochsprachenkonzepte wie Funktionen einbringt, welche die CPU nicht kennt.

1
Mikkey 06.08.2016, 22:12
@androhecker

Auch Funktionen sind keine Hochsprachenkonzepte, denn die Befehle

CALL, ENTER, LEAVE, RET gab es bereits auf dem 80286

0
androhecker 06.08.2016, 22:37

Doch, das schon. Irgendwie muss man Funktionen ja umsetzen. In einer Assemblersprache kann man jedenfalls keine Funktionen wie in Hochsprachen schreiben, da muss man sich die Funktion "Funktion" "selbst schreiben", aber Funktionen mit Namen, Parametern etc gibt es nicht.

0

http://freecode.com/projects/khexedit

Kannst du damit was anfangen?

Antwort bewerten Vielen Dank für Deine Bewertung
GluecklicheHuhn 06.08.2016, 21:52

Ne nicht wirklich. Scheint wohl ein ... Binär Editor zu sein..?!

0
GluecklicheHuhn 06.08.2016, 21:54
@GluecklicheHuhn

Oh! Das ist ein Lexikon für Assembler auspuff! Das heißt dass nie Dateien als 10101010110110101000011 erscheinen! Ja schade. Aber trotzdem danke

0
Laberdor 06.08.2016, 21:56
@GluecklicheHuhn

Kein Problem.

Verstehe, warum dich das interessiert. Wenn du dich grundsätzlich für's Programmieren interessierst, kannst du dir ja Visual Studio 2015 Community downloaden, da hast du viele Wochen, Monate oder Jahre was zu tun.

0

disclaimer: ich kenne mich auch nicht gut mit assembler aus

1. zu der sicherheit deines "computers":

führe assembler programme vorerst nur in einer virtuellen maschine oder in einer sandbox aus, da du sonst riskierst, dass du dir dein system zerschießt.

2. wenn ich dich richtig verstanden habe, meinst du "mashine language". Diese Variiert nämlich von chip zu chip und ist eine der "tiefsten" programmier sprachen (also eine low-level programming language)

3. das mit den nullen und einsen nennt sich binärcode

Antwort bewerten Vielen Dank für Deine Bewertung

Info bei  www.myAVR.de

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?