Mal eine andere Frage: Wie funktioniert das eigentlich mit C++ usw.



  • Wenn du diese Grundlagen verstehen willst, schau dir mal Assembler an.
    http://de.wikipedia.org/wiki/Assemblersprache



  • also z.B. int 21h unter DOS für deine cout Implementierung



  • Hallo,

    Zu 1.

    Jedes ausführbare Programm ist erstmal eine ganz normale Datei wie jede andere auch. Im Betriebssystem ist eine Funktion integriert, die nichts anderes tut als so eine Datei in den Arbeitsspeicher zu laden, eventuell noch irgendwelche Nachbearbeitungen und dann einen neuen Prozess startet in dem es einfach an den Anfang des Codesegmentes springt.

    Wie das genau funktioniert ist Betriebssystemabhängig. Das ist auch einer der Gründe, weshalb Linuxexes nicht einfach auf Mac oder Windows gestartet werden können.

    Jedes Programm, das nicht alles selbst implementiert hat, muß natürlich auch irgendwanneinmal Funktionen des Betriebssystems aufrufen können. Das ist spätestens dann erforderlich, wenn die Programme Dateien lesen und/oder schreiben wollen, Arbeitsspeicher brauchen usw. usf. Wie das Betriebssystem nun solche Funktionen zur Verfügung stellt und wie sie aufgerufen werden können, ist auch Betriebssystem- und Prozessorabhängig. Auch deshalb kannst Du nicht einfach Linuxprogramme auf 'ner Windowskiste starten.

    Unter DOS haben die Anwendungen einfach den Softwareinterupt 21 aufgerufen. Auf dem Atari war das ein Trap-Befehl. Ist auch für den Anwendungsentwickler völlig egal, denn dafür gibt es Libraries.

    Zu 2)

    Die Variable cout ist in der Standardlibrary Deines Compilers definiert. Diese Library kennt auch alle Funktionen, die dazu gehören. wie operator << etc. Die Standardlibrary tut dann letztendlich nichts anderes als die Betriebssystemfunktionen aufzurufen. Für manche Systeme ist dafür Assember erforderlich

    move AX, 5
    int 21h
    

    oder so

    movew #5, D0
      trap #1
    

    Andere Systeme (z.B. windows) realisieren das über Shared Libraries so daß das direkt aus C/C++ Code aufgerufen werden kann.

    ...
      CreateFile( ... );
      ...
    

    In der Exefile steht dann die Information, daß die Os-Funktion CreateFile aus KERNEL.DLL aufgerufen werden soll. Um den Rest kümmert sich der Programmlader von Windows und der Code in der DLL.

    Grundsätzlich kannst Du das dann alles selber machen, aber das ist eigentlich unnötig und wenn Du wissen willst wie's geht, findet man immer wieder irgendwo die Quellen einer solchen Implementation. Bei BC++ wurde beispielsweise der Quelltext der Library mitgeliefert.

    Für Turbo C auf dem Atari habe ich die Bibliotheken mit entwickelt. Damals haben wir beispielsweise fast komplett auf Assembler gesetzt.

    Jetzt reichts hoffentlich.

    mfg Martin



  • Wenn du die Sachen aus 1. wirklich wissen willst, dann würde ich dir eher empfehlen das ganze von unten anzufangen. Das Buch hier:
    Digital Design and Computer Architecture | ISBN: 9780123704979
    ist z.B nicht schlecht. Das geht von einer sehr tiefen Ebene (Aufgabe Transistoren) bis hin zu High Level Programmierung (C). Da bekommt man imo einen ganz guten Überblick über die Funktionsweise von Prozessoren und damit auch Programmen.

    //EDIT:
    Von der kindlichen Aufmachung muss man halt wegsehen. Es ist wirklich professionell. 😉



  • Also erstmal VIELEN DANK.
    Ihr habt echt schnell geantwortet 🙂

    Ok, das mit den Dateien einbinden und warum Windows Programme nicht auf Linux usw funktionieren habe ich jetzt verstanden, vielen Dank.
    Ich werde mir mal das Buch anscheuen und mich einwenig mit Assembler auseinander setzen, um meiner Frage, wie der Computer mich überhaupt versteht, zu beantworten.

    Nochmal Danke 😃



  • Leider ist es ziemlich schwer genau zu verstehen was so ein Prozessor macht. Soweit ich weiss ist die Mathematik dazu auch nicht gerade trivial (korrigiert mich, falls ich hier falsch liege).



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • icarus2 schrieb:

    Soweit ich weiss ist die Mathematik dazu auch nicht gerade trivial (korrigiert mich, falls ich hier falsch liege).

    ach was... schwer ist nur das was du nicht verstanden hast 😉



  • icarus2 schrieb:

    Leider ist es ziemlich schwer genau zu verstehen was so ein Prozessor macht. Soweit ich weiss ist die Mathematik dazu auch nicht gerade trivial (korrigiert mich, falls ich hier falsch liege).

    Also eine trivialere Mathematik wie die einer CPU gibt es kaum:

    Kennt nur 2 Ziffern: 0 und 1
    Kennt nur 4 Operatoren: AND, OR, XOR, NOT

    Das war's meines Wissens.

    Hab ich was vergessen?

    mfg Martin



  • Wenn ich mich an meinen Unterricht über Logikschaltungen richtig erinnere, können aus NAND oder NOR die anderen zusammengeschaltet werden, einschließlich FlipFlops zur Speicherung. Und die NANDs, NORs wiederum kannst du aus Transistoren und Widerständen bauen.

    Es gibt auch Projekte wo Leute sich aus den einfachsten Bauelementen einen 8bit Maschine zusammenbauen. Computer kannst du übrigens nicht nur mit Elektronik bauen .

    Zum Ablauf von Programmen kann man sagen das ein Programm Funktionen aus anderen Programmen aufruft, bis zum Bios oder Controller oder weiß ich was und dazwischen Kernel, Treiber etc. Ausgeführt wird vom Prozessor.



  • icarus2 schrieb:

    Leider ist es ziemlich schwer genau zu verstehen was so ein Prozessor macht. Soweit ich weiss ist die Mathematik dazu auch nicht gerade trivial (korrigiert mich, falls ich hier falsch liege).

    Ein Prozessor hat nicht viel mit Mathematik zu tun, auch wenn man versucht seine Funktionsweise mathematisch zu beschreiben.

    Er besitzt in der Regel einen "Prozesszähler". Das ist einfach ein Register, in dem eine Adresse steht. Er macht jetzt nichts weiter, als den Speicher an dieser Adresse auszulesen und anhand des Inhalts von dem Speicher ein bestimmtes Schaltnetz/Schaltwerk durchlaufen zu lassen. Anschließend erhöht er den Wert des Adresszählers um auf den nächsten Befehl zu zeigen. Bei "Sprüngen" wird einfach der Prozesszähler neu beschrieben.

    Es gibt unterschiedliche Arten, wie Prozessoren an die Daten im Speicher kommen um mit denen zu rechnen. Ein ARM hat beispielsweise immer 2 Operanden- und eine Ergebnisadresse die mit angegeben werden müssen. Die liegen mit im Befehlscode und damit der Adressraum ausreicht werden nur interne Register verwendet. Die Daten müssen vorher in die internen Register hinein, bzw Ergebnisse wieder aus ihnen hinaus geladen werden, was mit den Load-/Store- Befehlen geschieht.

    Ein Stackprozessor arbeitet dagegen komplett ohne Adressangabe für Operanden oder Ergebnis. Er besitzt einen Arbeitsstapel von dem er einfach die obersten Daten nimmt und das Ergebnis einer Rechnung wieder oben ablegt. Auch hier müssen also sowas wie Load-/Store- Befehle existieren, diese benötigen aber nur eine Adressangabe, da die Daten als Ziel/Quelle immer den Stapel haben.



  • icarus2 schrieb:

    Leider ist es ziemlich schwer genau zu verstehen was so ein Prozessor macht. Soweit ich weiss ist die Mathematik dazu auch nicht gerade trivial (korrigiert mich, falls ich hier falsch liege).

    Das ist schon machbar. Nur halt nicht in ein paar Stunden. Dafür benötigen die meisten ein paar Semester an der Hochschule, um all die Details zu verstehen. Wenn man dann so weit ist, merkt man, dass überall nur mit Wasser gekocht wird.



  • painting schrieb:

    wie versteht mein Computer eigentlich, was er machen soll???
    Wie kann so ein Computer überhaupt etwas ausführen???

    Ganz einfache Antwort: gar nicht.

    Ein Computer versteht gar nicht, was er machen soll. Ein Computer ist eine dumme Maschine mit ein paar einfachen Grundoperationen (Daten hin- & herkopieren, logische Verknüpfungen, evtl. Grundrechenarten, ...) und sie führt diese genau so aus, wie sie im Maschinenprogramm vorkommen.

    Ein Computer "versteht" nichts, denn dafür bräuchte er Intelligenz. Es ist ein dummes Stück Materie, wie ein Stein, ein Baum ... obwohl beim Baum bin ich mir nicht sicher, ob der nicht eine gewisse Intelligenz haben könnte.

    Ein Computer versteht also von dem, was ausgeführt wird, soviel, wie ein Stück Papier was von dem Liebesbrief versteht, den man darauf schreibt.

    Alle Intelligenz steckt in den Köpfen der Programmierer. Software ist formalisiertes, geronnenes Wissen - mal mehr mal weniger die Quintessenz menschlicher Intelligenz für die Lösung eines bestimmten Problems.

    Das oben erwähnte Buch ist sehr empfehlenswert, wenn man im Detail verstehen will, wie ein Prozessor funktioniert. Assembler (oder besser die ISA == Instruction Set Architecture) ist bei üblichen CISC Prozessoren schon wieder so komplex, dass man oft nicht wirklich nachvollziehen kann, was auf Microarchitektur-Ebene abläuft.

    Ansonsten sind noch Hennessy/Patterson "Computer Architecture - A Quantitative Approach" und "Computer Organization and Design: The Hardware/Software Interface" Lehrbuchklassiker auf diesem Gebiet.

    Wegen der Exe Frage, solltest Du mal in die üblichen Betriebssystem Lehrbücher schauen. Z.B. Tanenbaums Minix3 Buch sollte helfen: "Operating Systems Design and Implementation, 3rd Ed.".

    Sein "Structured Computer Organization" ist vielleicht für Einsteiger besser als Hennessy/Patterson, um einen Eindruck zu bekommen, was alles im Computer vor sich geht.



  • hibbes schrieb:

    Wenn ich mich an meinen Unterricht über Logikschaltungen richtig erinnere, können aus NAND oder NOR die anderen zusammengeschaltet werden, einschließlich FlipFlops zur Speicherung.

    Logisch gesehen genügen nur NOT und OR Operatoren, um alle andere Operatoren darzustellen.

    Die "Mathematik", die hinter einem Prozessor steht, ist sehr einfach, hier geht es nur um Aussagenlogik. Was ein Prozessor erst interessant macht, ist wie er aufgabut ist und wie die Schnittstellen zum Speicher, Register usw. definiert sind, wie die verschiedene Datenbusen durch bestimmtes Timing miteinander arbeiten, wie man die Befehle kodiert, usw. Leider sprengt das total den Rahmen eines Forums, um es hier schreiben zu können. Ich habe es einmal vor vielen Jahren an einem anderen Forum versucht (mit einer sehr sehr einfachen RISC Architektur) und hab über 3 Posts (mit jeweils max. Anzahl von Zeichen) gebraucht, um es halbwegs verständlich zu machen.



  • Ich habe es einmal vor vielen Jahren an einem anderen Forum versucht

    Link?



  • gib schrieb:

    Ich habe es einmal vor vielen Jahren an einem anderen Forum versucht

    Link?

    find's leider nicht mehr 😞



  • Logisch gesehen genügen nur NOT und OR Operatoren, um alle andere Operatoren darzustellen.

    Logisch gesehen genügt nur der NAND Operator, um alle anderen Operatoren darzustellen.
    Alternativ: NOR statt NAND nehmen.

    Daher gibt es auch meist nur eine Transistorart in einem Prozessor (s. http://de.wikipedia.org/wiki/NAND-Gatter bzw. http://de.wikipedia.org/wiki/NOR-Gatter)...


Anmelden zum Antworten