Frage von GluecklicheHuhn, 118

Was ist Assembler ?

Ich wollte mich mal ein bisschen über die Programmiersprache Assembler informieren.

Erstens würde ich gerne Wissen was es mit diesen verschiedenen Arten auf sich hat von Assemblersprachen. Irgendwie gibt es da wohl tausende für verschiedenste Systeme(?) und ist dann da immer die Syntax komplett anders oder was? Oder gibt es da nur für verschiedene Sachen (z.B. Hello World) verschiedene Methoden und trotzdem die gleiche Syntax? Also ich habe mir NASM als Übersetzer, Assembler, Kompilierer(?) geholt und kann Assembler Geschreibel in richtige Dateien umwandeln. Doch nun kommt es: In diesen Dateien wenn ich sie mit einem Editor öffne sind gar keine Nullen und Einsen (Wie ich es erwartet hätte bei Assembler weil es ja auch bei Wiki und so steht) sondern irgendein normales, wirres .exe-Gedöns: "ê| ú¸ ŽÐ¼ û¸ ŽÀŽØˆ)|è) ¸ ŽÀŽØê " was ich halt echt nicht verstehe. Denn das ist doch das was Assembler so geil macht. Aber vor allem konnte ich bisher kein einziges Assembler Programm z.B. in der Terminal ausführen. Ob ich es jetzt zu .bin oder .exe oder so gemacht hab. Aber man kann ja diese komische "Programmiersprache", Assembler auch nicht irgendwie installieren dass es da bestimmte Datei-Endungen gibt und so.

Bitte erklärt mir das und sagt mir wie ich AS-Syntax zu 01110100 fuchteln kann und ausführen kann. Wiederum nicht dass ganze Gejammer dass Assembler eine schwere Sprache ist und und und. Ich will ja nur Wissen wie das alles aufgebaut ist.

Danke.

Expertenantwort
von TeeTier, Community-Experte für programmieren, 22

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! :)

Kommentar von GluecklicheHuhn ,

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

Expertenantwort
von funcky49, Community-Experte für Computer, 53

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
von Schachpapa, 43

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.

Kommentar von GluecklicheHuhn ,

Im Wiki steht aber nicht wie man nun Assembler Text richtig umkonvertiert und ausführt.

Kommentar von Starjuice ,

Hab mich nun auch belesen, vielleicht könnte das helfen.

https://www4.cs.fau.de/Lehre/WS09/V_BS/Uebungen/oostubs/assembler.shtml

Kommentar von PerfectMuffin ,

Weiß es von der Architektur abhängt.

Expertenantwort
von Volens, Community-Experte für Sprache, 24

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
von bcords, 46

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.

Kommentar von GluecklicheHuhn ,

Hab ich mir mal gedownloadet

Antwort
von androhecker, 38

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.

Kommentar von GluecklicheHuhn ,

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.

Antwort
von Mikkey, 32

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.

Kommentar von GluecklicheHuhn ,

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

Kommentar von Mikkey ,

Natürlich.

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

Antwort
von josef050153, 14

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
von sodiumChlorate, 13

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
von Starjuice, 41

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ß

Kommentar von androhecker ,

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.

Kommentar von funcky49 ,

Genauso ist es.

Kommentar von Starjuice ,

Okay danke.

Kommentar von Mikkey ,

Auch Funktionen sind keine Hochsprachenkonzepte, denn die Befehle

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

Kommentar von androhecker ,

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.

Antwort
von Laberdor, 44

http://freecode.com/projects/khexedit

Kannst du damit was anfangen?

Kommentar von GluecklicheHuhn ,

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

Kommentar von GluecklicheHuhn ,

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

Kommentar von Laberdor ,

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.

Antwort
von Modem1, 11

Info bei  www.myAVR.de

Keine passende Antwort gefunden?

Fragen Sie die Community