Zeiger in Assembler

Diskutiere Zeiger in Assembler im Plauderecke Forum; Guten Tag zusammen, da ich leider keine Ahnung hatte wohin mit dieser "merkwürdigen" Frage poste ich sie in der Plauderecke :) Also da ich...

  1. ocsme
    ocsme Aktives Mitglied
    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
     
  2. Wenn du jetzt Java lernen möchtest, dann sichere dir hier unseren Java-Videokurs heute zum Sonderpreis (hier klicken!)
  3. httpdigest
    httpdigest Bekanntes Mitglied
    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
     
  4. ocsme
    ocsme Aktives Mitglied
    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
     
  5. httpdigest
    httpdigest Bekanntes Mitglied
    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.
     
    ocsme gefällt das.
  6. ocsme
    ocsme Aktives Mitglied
    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
     
  7. White_Fox
    White_Fox Mitglied
    Sicher, die Informatik ist heute nicht umsonst in viele kleinere Teilbereiche zergliedert. Das hat schon lange niemand mehr einen umfassenden Überblick.

    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:
    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.
     
    ocsme und mihe7 gefällt das.
  8. ocsme
    ocsme Aktives Mitglied
    Danke nochmals :)

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

    LG
     
Passende Stellenanzeigen aus deiner Region:





Die Seite wird geladen...

Zeiger in Assembler - Ähnliche Themen

Zeiger auf Array
Zeiger auf Array im Forum C/C++
Zählen der Zeiger auf Objekte
Zählen der Zeiger auf Objekte im Forum Java Basics - Anfänger-Themen
GUI-Bedienelemente mit Zeiger/Referenzen-Array veralten
GUI-Bedienelemente mit Zeiger/Referenzen-Array veralten im Forum Java Basics - Anfänger-Themen
Größe des Mauszeigers ermitteln
Größe des Mauszeigers ermitteln im Forum AWT, Swing, JavaFX & SWT
Mauszeiger springt in obere linke Ecke des JDialogs
Mauszeiger springt in obere linke Ecke des JDialogs im Forum AWT, Swing, JavaFX & SWT
Thema: Zeiger in Assembler