Zeiger in Assembler

Bitte aktiviere JavaScript!
Guten Tag zusammen,
da ich leider keine Ahnung hatte wohin mit dieser "merkwürdigen" Frage poste ich sie in der Plauderecke :)

Also da ich angefangen habe mich mit den Abstrakten Datentypen zu beschäftigen und dort immer wieder der Begriff des "Zeigers" auftritt, habe ich mir gleich mal wieder so wie ich bin, die Frage gestellt wie wird sowas in Assembler realisiert.

Denn auch ein if, else oder Schleifen werden in Assembler ja nicht so "leicht" repräsentiert wie in Hochsprachen (ist ja auch logisch). Doch das würde jetzt zu viel werden auch sowas zu besprechen.

Fange ich mal an:
Wir haben ein Verbundtyp das speichert mir eine Liste von Elementen x1 ... xn von irgend einem Typ z. B. int. Dann speichert dieser Verbundtyp einen Zeiger von sich selbst. Sprich man muss durch den Zeiger nicht mehr wissen wo genau im Speicher die Elemente x1 ... xn stehen. Das erledigt ja der Zeiger der genauso groß sein muss wie der Verbundtyp selbst.
Soweit so gut. Wie wird das ganze nun aber in Assembler dargestellt? Oder brauchen wir das in Assembler gar nicht da wir ja "Wissen" wo die Daten stehen. Doch wie würde so etwas dann genau aussehen?
Ich speichere n int Werte sprich DW1 , ... , DWN. Dann hätte ich ein Verbundtyp wie erstellt man nun einen Zweiten und Zeigt auf den ersten oder auf den Zweiten?

Wenn nicht muss ich eben bei dieser Frage wieder locker lassen und mich später eben mal mehr mit C auseinandersetzen wenn ich Java mal halbwegs drauf habe :D Das ist nur ein Problem von mir immer wenn ich so etwas lese und mir 1000 Fragen im Kopf rum schwirren wüsste ich gerne wie so etwas gemacht wird :D

Vielleicht hat da jemand eine nette Idee?
Oder muss ich Assembler lernen :D?

LG
 
A

Anzeige




Vielleicht hilft dir unser Java-Tutorial hier weiter —> (hier klicken)
Ersteinmal zur Nomenklatur:
Das Wort "Assembler" bezeichnet ein Programm, welches einen Quelltext in einer "Assembly"-Sprache (z.B. x86 Assembly (Intel oder AT&T Style)) in ein für einen Computer/Prozessor ausführbares Binärformat übersetzt.
Also: Die für Menschen lesbare textuelle Repräsentation eines Maschinenprogrammes nennt man "Assembly". Das Programm, welches diesen Text dann in Binärcode für den Prozessor übersetzt, nennt man "Assembler".
Das nur dazu.
Ein Zeiger ist wirklich nichts anderes als eine Speicheradresse (plus dem statischen Typ des referenzierten Objektes - der Begriff "Zeiger" ist ein Konstrukt der Programmiersprache). Wenn du z.B. eine Instanzvariable in einer Klasse vom Typ `int` hast, dann steht in diesem int einfach eine Zahl drin, die du z.B. mittels arithmetischer Operationen weiterverarbeiten kannst, wie etwa diese Zahl mit 2 zu addieren.
Wenn du nun eine Referenz speicherst, (z.B. mittels des Referenztyps `java.lang.Integer`), dann wird in der Instanzvariablen nicht einfach ein int im Speicher stehen, sondern eine Adresse, an der das `java.lang.Integer` Objekt zu finden ist.
Wenn du z.B. den Member/Punktoperator "." in Java verwendest, um auf einem Objekt eine Methode aufzurufen (z.B. `myInteger.intValue()`), passiert im Hintergrund (wenn noch nichts wegoptimiert wurde!) genau folgendes:
1. Die Adresse von `this` (also deinem Objekt, welches `myInteger` enthält) wird geladen (falls noch nicht passiert)
2. Die Adresse von `myInteger` (die Instanzvariable in deinem Objekt) wird geladen - via bekanntem Offset des Feldes von der Adresse von `this` aus Schritt 1
3. Die Methode `intValue` wird aufgerufen mit `this` = Adresse aus Schritt 2
 
Ersteinmal zur Nomenklatur:
Das Wort "Assembler" bezeichnet ein Programm, welches einen Quelltext in einer "Assembly"-Sprache (z.B. x86 Assembly (Intel oder AT&T Style)) in ein für einen Computer/Prozessor ausführbares Binärformat übersetzt.
Also: Die für Menschen lesbare textuelle Repräsentation eines Maschinenprogrammes nennt man "Assembly". Das Programm, welches diesen Text dann in Binärcode für den Prozessor übersetzt, nennt man "Assembler".
Das nur dazu.
Ein Zeiger ist wirklich nichts anderes als eine Speicheradresse (plus dem statischen Typ des referenzierten Objektes - der Begriff "Zeiger" ist ein Konstrukt der Programmiersprache). Wenn du z.B. eine Instanzvariable in einer Klasse vom Typ `int` hast, dann steht in diesem int einfach eine Zahl drin, die du z.B. mittels arithmetischer Operationen weiterverarbeiten kannst, wie etwa diese Zahl mit 2 zu addieren.
Das war mir soweit alles bekannt :) trotzdem nochmals danke :)

Meine Frage ist eher so. Ich kann in einer Hochsprache z. B. Java eine verkettete Liste bauen. Wie sieht das Konstrukt dann aber im Assembler aus? (mit Assembler ist die Sprache gemeint)
Denn alles was ich in der Hochsprache machen kann, kann ich ja auch mit Hilfe von Maschinenbefehlen oder eben im Assembler machen.
Bei mir entsteht nun eben die Verwirrung da ich keine Ahnung habe wie so etwas erstellt wird? Deswegen muss ich Assembler lernen und eine Liste Programmieren? Oder kann man sich mit deiner Erklärung von oben einfach zu Frieden geben? Brauch man so ein wissen vielleicht oder ist das eher uninteressant?
Werden Abstrakte Datentypen denn überhaupt in Assembler geschrieben?

Sry nochmal für die doofe Frage :( Das sind nur so Sachen an denen ich mich gerne aufhänge :( obwohl ich JAVA lernen muss :p
 
Du kannst du dir den zu einer Java-Methode generierten x86 Assembly Code ganz einfach ausgeben lassen. Die JVM hat dafür Kommandozeilenparameter: https://stackoverflow.com/questions/1503479/how-to-see-jit-compiled-code-in-jvm
Du wirst erst einmal höchstwahrscheinlich rein gar nichts erkennen - auch mit den Kommentaren, die der Disassembler an die Instruktionen packt.
Die Tatsache ist, dass du hierfür erst einmal "x86 Calling Conventions" lernen musst. Der Code hängt nämlich vom konkret verwendeten Betriebssystem und der Prozessorarchitektur ab.
Desweiteren: Es gibt in Maschinencode (für den Assembly ja nur eine menschenlesbare Variante ist) keine Klassen/Strukturen wie etwa in Java oder C. Du arbeitest hier wirklich nur auf einem linearen, virtuellen Arbeitsspeicherbereich mit vielen relativen Offsets und Registern.
Schaue dir z.B. mal die Antwort hier an: https://stackoverflow.com/questions/22269319/x86-assembly-end-of-linked-list#answer-22271166 (hier wird eine Assembler-spezifische Spracherweiterung verwendet, die nur für den MASM Assembler gilt)
Wenn du wirklich wissen willst, was da abgeht, empfehle ich dir das Buch "Modern X86 Assembly Language Programming" von Daniel Kusswurm.
 
Wie immer ein super Lieben Dank an dich :) bist echt eine super Hilfe :) httpdigest :)
Dabei belasse ich das ganze Thema auch erst einmal :) Das wird alles viel zu viel ich werde weiter Java "ordentlich (hoffe ich :D)" lernen :) und danach kann man schauen ob man den Horizont noch mehr erweitern will und wie.
Denn es Fragt sich ja auch kein Ottonormal-Verbraucher hey wieso ist 1+1 = 2 :D

was mir nur aufgefallen ist kann es sein das die ganze Informatik sehr undurchsichtig ist? denn es kann ja jeder irgendwo irgendwie etwas versteckeln ob schon in den Chips selbst oder erst in der Software. oder irre ich mich dabei auch? denn in der Mathematik, Physik oder Chemie ist soweit alles relativ gut geordnet und für jeden gut durchsichtig (kommt drauf an in welchen grenzen man sich bewegt natürlich :D)

LG
 
was mir nur aufgefallen ist kann es sein das die ganze Informatik sehr undurchsichtig ist? denn es kann ja jeder irgendwo irgendwie etwas versteckeln ob schon in den Chips selbst oder erst in der Software.
Sicher, die Informatik ist heute nicht umsonst in viele kleinere Teilbereiche zergliedert. Das hat schon lange niemand mehr einen umfassenden Überblick.

denn in der Mathematik, Physik oder Chemie ist soweit alles relativ gut geordnet und für jeden gut durchsichtig
Und das wiederum sieht nur so aus. Auch diese Wissensgebiete sind in zig Teilbereiche zergliedert, und einen umfassenden Überblick hat auch hier schon lange niemand mehr. Schau dir mal ein Buch über theoretische Elektrotechnik an, lege vielleicht noch ein Buch über Halbleiterphysik und Highspeed-Design daneben und versuche abzuschätzen wie lange es dauert, bis du darüber wirklich Bescheid weißt.
Und da bist du noch nicht bei Hochspannnungstechnik, rauscharme Schaltungen, Mikrowellentechnik (aka "Black Magic"), EMV (aka "An other kind of Black Magic") gewesen. Und das ist nur Elektrotechnik, längst noch nicht vollständig.

Und mit Maschinenbau, Werkstofftechnik, Luft- und Raumfahrt, Optik und den restlichen praktischen Anwendungen der klassischen Physik sieht es in etwa genauso aus. Es gibt nicht umsonst den Spruch:
Wenn man glaubt, alles zu wissen, kriegt man das Abiturzeugnis. Wenn man erkannt hat, dass man gar nichts weiß, bekommt man ein Diplom, und wenn man merkt, dass auch alle anderen nichts wissen, wird einem der Doktortitel verliehen.
Aber um mal auf deine Eingangsfrage zurückzukommen:
Wenn dich ASM interessiert (was definitiv gut ist), dann schaue dir mal das AVR-ASM-Tutorial hier an.
https://www.mikrocontroller.net/articles/AVR-Tutorial
Da geht es zwar um einen, zudem relativ simplen, Mikrocontroller, einige deiner Fragen werden damit aber auch schon klar. Es ist schon interessant zu wissen, was für ein Aufriss in so einem Controller stattfindet um einen einfachen Registerwert auf einem LCD anzuzeigen. Es ist an sich natürlich nicht damit zu vergleichen was in der JVM und auf dem Rechner am Ende stattfindet, es liefert aber zumindest einen kleinen Einblick. Und du wirst sehen, daß es nicht sonderlich klug ist, aus dem Hochsprachencode auf das zu schließen, was die Maschine nachher tatsächlich macht. (Stichwort: Compileroptimierungen)

Mir haben meine ASM-Kenntnisse, als wir im Studium C gelernt haben, sehr viel gebracht.
 
Danke nochmals :)

Nun ist alles soweit beantwortet das reicht fürs erste :) hihi =)

LG
 
A

Anzeige




Du möchtest Python lernen? Dann sichere dir hier alle wichtigen Grundlagen.
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben