Frage zu Assembler und der Syntax



  • Hallo,

    Wieso kann man z.b. die meiste Hardware nur mit Assembler ansprechen ?

    Warum hat Assembler z.b. eine Syntax wie:

    mov eax,1
    push eax

    Hat Assembler solch eine Syntax bekommen weil es früher dadurch einfach leichter zu kennzeichnen war welchem Bauteil man welche Stromimpulse gesendet hat ?



  • Das hat sich in logischer Folge aus der Hardware ergeben. Eine CPU kann nur sequentiell Befehle ausführen und jeder Befehl hat eine fixe Anzahl an Parametern. Nun lag es also nahe, diese Befehle zu benennen, da sich die Bitmuster ja doch keiner merken konnte und für jede CPU anders waren. Weiters war es leichter Register und Speicher mit Namen zu versehen bzw. bei 0 zu beginnen und den Assembler dann alles korrekt verschieben und positionieren lassen weil sonst bei jeder Änderung möglicherweise alle Adressen verändert werden müssen.

    Nun das reicht für den Anfang und schon war Assembler in dieser Form da. Dann erkannte man natürlich, dass man mittels Sprüngen Prozeduren zusammenfassen kann und jedesmal für if und while rumzuspringen war irgendwann auch nicht mehr sexy genug also ging man daran weiter zu abstrahieren und "erfand" die prozeduralen Programmiersprachen.

    Ein ewiger Weg von Abstrahierung, willst du aber ganz nah ran, kannst du mit hoher Abstrahierung nichts anfangen und musst auch heute noch zu Assembler greifen.

    MfG SideWinder



  • Als gibt es nicht jeden CPU Befehl auch in irgendeiner Hochsprache und deshalb muss man dann Assembler benutzen ?



  • Eine CPU zu bauen die eine Sprache wie C (von komplizierteren Sprachen wie Java ganz zu schweigen) versteht wäre sehr kompliziert und langsam.
    Assembleranweisungen kann mans ehr gut als Computerchip bauen. Das ist der einzige Grund



  • Aber aus welchem Grund wäre so etwas komplizierter und langsamer ?

    Assembler und C Befehle sind letzendlich auch nur Text ...

    btw.

    Ich hab mich auch mal gefragt wie wohl ein PC genau funktioniert.

    Man hat etliche Bauteile baut irgendwelche Schaltungen setzt das ganze unter Strom und auf dem Monitor der auch wieder etliche Bauteile hat und auch wieder

    unter Strom gesetzt wird zeigt mir irgendwelche Farben oder so an.

    Weiss jemand ob es irgendwo eine Dokumentation zu so etwas gibt wie das ganze funktioniert würde mich nämlich echt mal interessieren.


  • Mod

    Hier liegt wohl ein gewaltiger Irrtum vor: Assembler selbst ist bereits eine Hochsprache und wird von Prozessoren nicht direkt ausgeführt. Es muss erst übersetzt werden. Das Ergbebnis dieses Übersetzungsvorgangs kannst du dir angucken, indem du eine Executable mal mit einem Editor öffnest. Das nennt man dann Maschinensprache und hat mit einem Text nichts mehr zu tun.



  • In was wird denn dann Assembler übersetzt ?

    Und in das was Assembler übersetzt wurde das ist doch dann im Endeffekt auch wieder nur Text. ^^

    Mehr lies sich auf aus dem 16Bit Assembler Programm nicht rauskopieren 😞

    Also ist das jetzt richtige Maschienen Sprache und wie kann die CPU z.b. damit was Anfangen ?

    MZ     ! ÿÿ        >    ûqjr                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ¸ ŽØº  ´	Í!´LÍ!hallo$
    


  • SeppJ schrieb:

    Hier liegt wohl ein gewaltiger Irrtum vor: Assembler selbst ist bereits eine Hochsprache und wird von Prozessoren nicht direkt ausgeführt. Es muss erst übersetzt werden. Das Ergbebnis dieses Übersetzungsvorgangs kannst du dir angucken, indem du eine Executable mal mit einem Editor öffnest. Das nennt man dann Maschinensprache und hat mit einem Text nichts mehr zu tun.

    Und auch hier liegst du noch falsch weil Executables meistens noch Header und Footer dran haben 🤡

    @void**: Wenn dich der Aufbau eines gesamten Computers interessiert könnte ich dir eine Vorlesung an meiner Universität empfehlen bzw. allgemein das dort empfohlene Buch ans Herz legen: https://www.auto.tuwien.ac.at/courses/viewDetails/12 (allerdings benötigst du nur die ersten Kapitel, der Rest ist aber dann auch interessant).

    MfG SideWinder



  • Ty ich werde mal nach dem Buch schauen.



  • void** schrieb:

    Ty ich werde mal nach dem Buch schauen.

    Ich habe noch einmal schnell hineingeblättert. Evtl. werden dort die elektrotechnischen Grundlagen zu kurz und die Betriebssystemlandschaft zu lang beschrieben um für dich als "Top-Treffer" zu gelten. Schau dich also auch nach Alternativen um!

    MfG SideWinder


  • Mod

    void** schrieb:

    In was wird denn dann Assembler übersetzt ?

    Und in das was Assembler übersetzt wurde das ist doch dann im Endeffekt auch wieder nur Text. ^^

    Nein, das sind dann nur noch elektronische Zustände die auf den Leitungen liegen.

    Mehr lies sich auf aus dem 16Bit Assembler Programm nicht rauskopieren 😞

    Also ist das jetzt richtige Maschienen Sprache und wie kann die CPU z.b. damit was Anfangen ?

    Ja, das ist eine Interpretation von Maschinensprache als Text. (Bis auf die Einschränkung, dass Executables auch noch ein bisschen Inhalt jenseits von Maschinensprache haben). Etwas übersichtlicher wird das, wenn man die Maschinensprache als Zahlen interpretiert (weil man im text sonst so viele nicht-druckbare Zeichen hat:

    E8 03 58 03 1A 90 04 1B 03 80 7C BA 04 19 03 E6 03
    

    Das kannst du dir dann so vorstellen, dass wenn da eine 03 steht, dann ist das in binär 110. Das heißt im Prozessor liegen dann auf der zweiten und der dritten Leitung Spannung und auf allen anderen nicht. Zumindest wenn man es sehr vereinfacht darstellt.



  • Trifft vielleicht noch genauer das was du themenmäßig suchst: http://www.lrr.in.tum.de/public/TeachingETIWS09

    MfG SideWinder



  • void** schrieb:

    In was wird denn dann Assembler übersetzt ?

    Und in das was Assembler übersetzt wurde das ist doch dann im Endeffekt auch wieder nur Text. ^^

    Mehr lies sich auf aus dem 16Bit Assembler Programm nicht rauskopieren 😞

    Also ist das jetzt richtige Maschienen Sprache und wie kann die CPU z.b. damit was Anfangen ?

    MZ     ! ÿÿ        >    ûqjr                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ¸ ŽØº  ´	Í!´LÍ!hallo$
    

    Wie wird Text auf einem Computer gespeichert? In dem man eine Kodierung hat, die bestimmten Zahlenwerten eine bestimmte Bedeutung (zB einen Buchstaben) zuordnet. Computer können nämlich nur Zahlen abspeichern. Im Normalfall sogar nur in binärer Darstellung. Ein Assembler wandelt den Assemblercode aber nicht in eine "übliche" Textdarstellung um, sondern in ein Format, dass einfacher für die Verarbeitung in der CPU ist(*). Deshalb ist der von dir kopierte Abschnitt natürlich auch wenig sinnvoll, da du einfach das Format versucht hast als Text zu interpretieren, was natürlich zu "Kraut und Rüben" führt. (Wenn du dir den Inhalt anschauen willst, dann nimm entweder einen Hexeditor, der dir die Zahlenwerte darstellt, oder einen Disassembler, der dir den Maschinencode wieder versucht in Assembler darzustellen).

    Wie der Maschinencode genau aussieht, hängt natürlich von der CPU ab. Aber prinzipiell gesehen stecken da Werte drin, die die genaue Operation angeben und ggf. noch Parameter, wie Register, Speicheradressen oder Literals. Das ganze wird von der CPU aus dem Speicher geladen und der Decoder liest aus dem Befehl aus, wie was in der CPU angesteuert werden soll. Das ist dann aber alles in Hardware realisiert (und basiert im Endeffekt auf Milliarden von Transistoren).

    Irgend wie hatte ich mal einen Link zu einem Online CPU Emulator, der die ganzen Vorgänge schön visualisiert hat. Leider finde ich den jetzt nicht mehr (habe aber dafür einen gefunden, der in Javascript/HTML5 einen 6502 auf dem Transistorlevel visualisiert http://www.visual6502.org/JSSim/index.html. Ziemlich 🕶. Aber leider nicht so hilfreich für die Diskussion)

    (*) genauer gesagt wird heute um den Maschinencode noch einiges drumrum geschrieben, da man ja heute Betriebssysteme hat, die das starten der Anwendung dann übernehmen und den Maschinencode auslesen (ggf. noch dynamisch linken) und in den Speicher laden.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Assembler verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • void** schrieb:

    In was wird denn dann Assembler übersetzt ?

    Und in das was Assembler übersetzt wurde das ist doch dann im Endeffekt auch wieder nur Text. ^^

    ...

    *lol* Irgendwie muss ich dabei gerade an die super geheimen .exe-Codes von autoexec.bat denken. 😃



  • Das hier http://www.visual6502.org/JSSim/index.html sieht ja sehr Interessant aus leider sagt mir das ganze gar nix. ^^

    Und wofür ist dieser Hex Editor da auf der Rechten Seite ?

    Ich hab da einfach mal irgendwelche Werte eingeben und dann auf den Start Button geklick aber ich konnte keine veränderungen festellen. ( Warscheinlich weil ich 0 Ahnung davon habe ^^ )

    Das ganze ist ein sehr Interessantes Thema aber anscheind auch extrem kompliziert. 😞

    Aber ich versuch trotzdem mal so ein paar Grundlagen davon zu verstehen.
    Etwas ahnung von Digitaltechnik hab ich ja aus der Schule.



  • void** schrieb:

    Hallo,

    Wieso kann man z.b. die meiste Hardware nur mit Assembler ansprechen ?

    Das stimmt so nicht, die "Hochsprachen" sind ja dafür da, die Hardware auf andere Weise anzusprechen als mit Assembler oder mit Hexcodeeingaben. Wie würde Windows funktionieren, wenn es mit seinem Hochsprachencode keinen Einfluss auf "die Hardware" hätte?

    void** schrieb:

    Warum hat Assembler z.b. eine Syntax wie:

    mov eax,1
    push eax

    Hat Assembler solch eine Syntax bekommen weil es früher dadurch einfach leichter zu kennzeichnen war welchem Bauteil man welche Stromimpulse gesendet hat ?

    Die beiden Befehle bewirken unterschiedliche Arbeitsweisen, darum heißen sie anders. Inwieweit Push und Pop jetzt so heißen und nicht Stacki und Stacko oder Blitz etc. weiß ich auch nicht so genau, man kann es sich aber denken, wenn man die Arbeitsweise des Stacks kennt.

    mov eax,1 könnte man direkt mit Schaltern realisieren, die Schalterstellungen werden binär codiert:

    1011100000000001000000000000000000000000
    

    nun gibt es aber beim Pentium über 1000 unterschiedliche Befehle. Viel Spaß beim Bearbeiten komplexer Programme...
    Eine kleine Hilfe ist das Hexadezimalzahlensystem,
    mov eax,1 hexcodiert:

    B801000000
    

    schon besser, denn ein Hexwert kann 4 Bits zusammenfassen. Zum Editieren von Spielständen sehr praktisch. Aber viel Spaß beim Bearbeiten oder Erstellen oder gar Braindebuggen komplexer Progamme...

    der Befehl

    mov eax,1
    

    zeigt auf den ersten Blick, worum es geht.
    Push eax zeigt Insidern sofort worum es geht.
    Assemblerroutinen versteht man dagegen nicht gleich auf den ersten Blick, man braucht Dokumentation. Da diese oft vergessen wird: viel Spaß beim Bearbeiten komplexer Programme, die nicht gut strukturiert und dokumentiert sind, vor allem, wenn die Maschinen selbst ganz unterschiedlich sein können oder das Betriebssystem direkte Hardwarezugriffe z.B. auf Ports und Prozessormodes weitgehend aussperrt.

    Programmierung und Programmierschnittstellen an sich, hängen meistens direkt mit der Hardware oder dem Betriebssystem der Doku und dem Mainstream usw. zusammen.
    Ein bißchen seltsam ist die Hello World praxis in einer von Audio und Video und Mathematik bestimmten Multimediarechenwelt.

    Kennt hier jemand eigentlich den Song Jasmine and Rose?
    http://www.youtube.com/watch?v=HdIGw8k19n4

    Mir ist in diesem Zusammenhang aufgefallen, das die Bekanntschaft mit Jasmin http://www.lrr.in.tum.de/~jasmin/ und Jazelle http://en.wikipedia.org/wiki/Jazelle gar keine so schlechte ist.

    (Und ein Geheimnis ist (pssst!) Asm Grundlagen lassen sich leichter lernen als Hochsprachengrundlagen. Manche Hochsprachengrundlagen lassen sich leichter verstehen, wenn man Asm-Grundlagen schon kann.(/pssssssst)



  • void** schrieb:

    Das hier http://www.visual6502.org/JSSim/index.html sieht ja sehr Interessant aus leider sagt mir das ganze gar nix. ^^

    Und wofür ist dieser Hex Editor da auf der Rechten Seite ?

    Ich hab da einfach mal irgendwelche Werte eingeben und dann auf den Start Button geklick aber ich konnte keine veränderungen festellen. ( Warscheinlich weil ich 0 Ahnung davon habe ^^ )

    Jo, das Ding ist toll. 🙂

    Auf der rechten Seite siehst du den Inhalt eines an die CPU angeschlossenen RAM in Form von Hex-Zahlen. Die CPU faengt dann an, ganz oben Links bei Adresse 0 den RAM auszulesen und das Gelesene auszufuehren.
    In der Grafik links kannst du dann eine Darstellung des DIE der CPU sehen. Leitungen, auf denen eine "1" liegt, werden darin scheinbar rot dargestellt...
    Den Code im RAM kannst du dann Schritt fuer Schritt ausfuehren lassen und dir zusaetzlich ueber der Darstellung des RAM ansehen, was in den Registern steht.



  • Ich meinte mit Assembler natürlich Maschinencode sorry.
    Der Unterschied von der Komplexität ist der:
    Es ist recht einfach einen Chip zu bauen der eine Zahl in ein register schiebt. Es ist sehr kompliziert einen Chip zu bauen der a) Text versteht b) variablennamen auf register und Speicher abbildet und c) dann noch kompliziertere ausdrücke wie a=b=0; verarbeitet
    Deshalb kann der Prozessor

    mov eax,1
    

    (bzw. den maschinenbefehl dazu, also eine Zahl) d.h. lege an das Register eax so Strom an dass nachher eine 1 drinsteht aber nicht

    a=1;
    

    (was zur Hölle ist a und überhaupt was sollen diese 4 Zahlen 0x61 0x3D 0x31 0x3B bedeuten)

    void** schrieb:
    Hallo,

    Wieso kann man z.b. die meiste Hardware nur mit Assembler ansprechen ?

    Das stimmt so nicht, die "Hochsprachen" sind ja dafür da, die Hardware auf andere Weise anzusprechen als mit Assembler oder mit Hexcodeeingaben. Wie würde Winddows funktionieren, wenn es mit seinem Hochsprachencode keinen Einfluss auf "die Hardware" hätte?

    Mit Hochsprachen kann man Hardware ansprechen weil der Compiler den text in Maschinensprache übersetzt (auch wenn man natürlich in manchen Einsatzbereichen Assembler nutzen _muss_ weil es (noch) keine Funktionen zum Ansprechen gibt.
    Die Teile die auf die Hardware zugreifen sind übrigends in assembler geschrieben 😉
    Es gibt dann halt eine Schnittstelle zwischen dem Hochsprachencode und dem Assemblercode



  • Man, habt ihr Probleme 🙂
    Ich würde vielleicht gerne wissen, warum man die Syntax so gemacht hat, dass man zum Teil von rechts nach links lesen muss...
    Warum "mov eax, 1" und nicht "mov 1, eax" 😕 wobei man natürlich irgendwie noch zwischen Displacements unterscheiden muss, was bei AT&T Syntax mit $-Zeichen gemacht wird: "mov $1, %eax" (Konstante) und "mov 1, %eax" (Displacement).
    Und dann habe ich noch ein Problem, warum vergessen viele nach dem Komma ein Leerzeichen zu setzen 😕
    Warum "mov eax,1" und nicht "mov eax, 1" 😕 Ich finde ein Komma ohne Leerzeichen danach irgendwie störend... ja, es stört den Lesefluss...


Anmelden zum Antworten