Donnerstag, 20. Oktober 2011

C und die Welt von Assembler - Teil 3

Die Arbeitsweise einer CPU
Wie eine CPU aufgebaut ist, wissen wir nun. Doch zu Wissen wie sie aufgebaut ist, heißt noch lange nicht zu Wissen wie sie arbeitet. Was macht eine CPU mit dem Maschinencode? Dieser Frage wollen wir nun auf den Grund gehen. Fangen wir am Anfang an.

Man nehme an jemand hätte ein Programmcode geschrieben und diesen mit einem Assembler in den Maschinencode compiliert. Jetzt sind die Einsen und Nullen irgendwo im Arbeitsspeicher.

Ein Programm besteht aus einer Reihe von Befehlen. Diese werden vom Prozessor bearbeitet. Dies geschieht folgendermaßen.
  1. Zum Anfang wird der Programmzähler auf die Adresse des Speicherplatzes gesetzt. In dieser Adresse befindet sich der Code des nächsten Befehls. 
  2. Der Befehlscode wird aus dem Arbeitsspeicher geholt und dekodiert.
  3. Jetzt wird der Befehl ausgeführt. Wäre der Befehl "LSR". So würde der Prozessor alle Werte im Stack um eine Position nach Links verschieben.
  4. Danach wird der Programmzähler erhöht und ein neuer Zyklus beginnt.
Die Highways des Computer: Die Busse
Wie schon erwähnt sind die CPU und die Arbeitsspeicher(RAM) durch Bussysteme miteinander verbunden. Diese Digitalen Autobahnen befördern eine Unmenge an Daten zwischen all den Komponenten im PC. Man unterscheidet zwischen drei Bussysteme.

  1. Der Datenbus
    Der Datenbus überträgt Daten zwischen Computerbestandteilen innerhalb eines Computers oder zwischen verschiedenen Computern. Die Bezeichnungen 4-Bit-, 8-Bit-, 16-Bit-, 32-Bit- oder 64-Bit-CPU bezeichnen in der Regel die Breite des internen Datenpfades einer solchen CPU. Der Prozessor kann auf den Datenbus in
    zwei Richtungen zugreifen: lesend und schreibend. So eine Verbindung, die in
    beide Richtungen möglich ist, bezeichnet man auch als bidirektional.
  2. Der Adressbus
    Der Adressbus ist im Gegensatz zum Datenbus ein Bus, der nur Speicheradressen überträgt. Die Busbreite, also die Anzahl der Verbindungsleitungen, bestimmt dabei, wie viel Speicher direkt adressiert werden kann. Der Adressbus leitet Informationen nur in eine Richtung, nämlich vom
    Steuerwerk des Prozessors zum Arbeitsspeicher. Er wird daher als unidirektional
    bezeichnet.
    Bei einem System mit 32 Adressleitungen können
    232 4 GB angesprochen werden. Bei einem 64-Bit-System können sogar 264 =  16 Exabyte angesprochen werden. Um mehr als 4 GB RAM ansprechen zu können benötigt man demnach ein 64-Bit-System.

    Die 8086/8088-CPU beispielsweise besitzt einen 20 Bit breiten Adressbus. Damit
    kann sie auf  1 MB Speicher zugreifen. Allerdings müsste dafür das Register in der CPU auch 20 Bit aufweisen. Da sich in diesem Register die Adresse befindet, bevor sie auf den Adressbus geht.
    Die 8086/8088-CPU hat allerdings nur ein 16 Bit Register. Damit können lediglich 65 KB direkt adressiert werden.
    Um dennoch auf die 1 MB Speicher zugreifen zu können, werden zwei Register benötigt. Mit zwei 16-Bit-Registern kann man 4 GB Arbeitsspeicher ansprechen. Teilt man die Adresse auf die beiden Register auf, so dass 16 Bit vom einten und 4 Bit vom anderen Register genutzt werden, hat man eine 20 Bit Adresse.
  3. Der Kontroll- / Steuerbus
    Der Kontrollbus ist ein Teil des Bussystems, welcher die Steuerung des Bussystems bewerkstelligt. Hierzu zählen unter anderem
    • die Leitungen für die Lese-/Schreib-Steuerung, 
    • Interrupt-Steuerung, 
    • Buszugriffssteuerung, 
    • die Taktung (falls ein Bustakt erforderlich ist), 
    • Reset- und Statusleitungen. 
    Der Kontrollbus koordiniert den Adress- und den Datenbus. Er sorgt dafür, dass nicht mehrere Komponenten gleichzeitig darauf zugreifen.

Nun kennen wir die Hardware nochmals ein wenig besser.


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!
hugo17 has contributed to DaniWeb

Mittwoch, 19. Oktober 2011

C und die Welt von Assembler - Teil 2


Die CPU und ihre Partner
Da der Programmcode von Assembler dazu dient CPU's zu Programmieren, sollte man die CPU verstehen. Die CPU (CentralProcessingUnit) ist der Kern jedes Computers. Hier werden die Berechnungen, welche man Programmiert, durchgeführt.
Neben der CPU gibt es im Computer noch einige wichtige Komponenten. Dies währen:

  • ein Speicher z.Bsp. RAM ( RandomAccessMemory), oder eine Harddisk
  • I/O (Input/Output, Ein- /Ausgabegeräte) z.Bsp. Tastatur, Bildschirm, usw.
  • Bus - System. Als Bus System sind Leitungen zu verstehen welche die einzelnen Komponenten verbinden. Diese befinden sich meistens auf einer Motherboard.
Die CPU unterteilt man in:
  1. Prozessor (Steuerwerk)
  2. Der Prozessor verarbeitet alle eingehenden Informationen in Form von elektrischen Signalpegeln und steuert deren Weiterleitung
    • in den internen Speicher,
    • auf externe Speichergeräte wie z.B die Festplatte,
    • auf Ausgabegeräte wie Bildschirm oder Drucker
    Oft werden vom Prozessor Informationen an die ALU weitergeleitet.
  3. ALU (ArithmeticLogicUnit
    Die ALU kann arithmetische und logische Funktionen berechnen. Dabei sind die möglichen Operationen auf folgende eingeschränkt:
    • Arithmetisch:
      • Addition (ADD)
      • Subtraktion (SUB)
    • Logisch:
      • Negation (NOT)
      • Konjunktion (AND)
      • Disjunktion (OR)
      • Vergleich (compare, CMP)
      • Kontravalenz (XOR)
    • Sonstige:
      • Rechts- und Linksverschiebung (arithmetische Shift, ASR/ASL)
      • Rechts- und Linksverschiebung (logisches Verschieben, LSR/ASL)
      • Rechts- und Linksrotation (ROL, ROR)
      • Register-Manipulationen und Bit-Veränderungen (Bits setzen, löschen und testen)
  4. Interner Speicher (Register)
    Informationen, auf die der Prozessor schnell zugreifen muss, werden im internen Speicher (sogenannter flüchtiger Speicher in Speicherchips) abgelegt.
    • RAM(Random-Access-Memory)
      Von allen internen Speicher eines Computers ist der RAM einer der langsamsten. Dies weil er nicht direkt in der CPU ist sondern meistens über einen Bus auf der Motherboard mit dieser verbunden. Dafür ist er um einiges größer als andere interne Speicher. Hier werden die Programme welche zurzeit ausgeführt werden Gespeichert. Je nach Betriebssystem und Hardware Konfiguration variiert die Wichtigkeit oder auch die Einsatzweise des RAM's.
    • Register
      Der Speicherbereich innerhalb einer CPU welcher direkt mit dem Prozessor verbunden ist nennt man Register.  Diese Speicher sind die schnellsten Speicher eines Computers. Da sie direkt in der CPU sind und so über kein Bussystem verlangsamt werden.
      Es gibt verschiedene Typen von Registern:
      • Datenregister (Akkumulator)
        Datenregister werden benutzt, um Operanden für die ALU und deren Resultate zu speichern.
      • Adressregister(Datenverarbeitung)
        Adressregister werden benützt um Speicheradressen von Operanden oder Befehlen zu berechnen. Das Adressregister bestimmt wie der Prozessor die Operanden findet und wie er die Ergebnisse abspeichern soll.
      • Frei verwendbare Register
        In modernen RISC-CPUs, so PowerPC oder Sun SPARC, heißen die Datenregister allgemeine oder frei verwendbare Register, da sie sich beliebig als Daten- oder Adressregister einsetzen lassen.
      • Stapelregister
        Stapelregister sind Adressregister zur Verwaltung von Stapelspeichern.
        Ein Stapel kann eine theoretisch beliebige, in der Praxis jedoch begrenzte Menge von Objekten aufnehmen. Elemente können nur oben auf den Stapel gelegt und auch nur von dort wieder gelesen werden. Elemente werden übereinander gestapelt und in umgekehrter Reihenfolge vom Stapel genommen.
      • Spezialregister (Hilfsregister für Prozessor)
        • Befehlszählregister, auch Programmzähler oder Befehlszähler.
        •  Befehlsregister, speichert den aktuellen Befehl
        •  Basisregister
        •  Segmentregister
        •  Statusregister, geben bestimmte Zustände nach Ausführung eines Befehls an
        •  Interrupt-Steuerregister
    Das Zusammenspiel dieser Komponenten ermöglicht das Berechnen einiger Befehle. Welche im Programmcode geschrieben und mit Assembler übersetzt werden. Diese befehle beinhalten einfache Schritte welche die CPU ausführen kann. Eine clevere Kombination dieser befehle ermöglicht schlussendlich, komplexe Berechnungen wie sie Heute von den Meisten Computern ausgeführt werden.


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Dienstag, 18. Oktober 2011

C und die Welt von Assembler - Teil 1

Assembler - need to know
Um Prozessoren programmieren zu können benötigt man eine Programmiersprache. Nun gibt es unzählige, verschiedene Sprachen, neben den bekannten Sprachen wie C, C++, C#, Turbo Phyton und Pascal gibt es den Assembler.
Assembler ist eigentlich ein Übersetzer oder Compiler welcher den "Assembler"(Programm)-Code in die Maschienensprache übersetzt.
Die Maschienensprache ist die Sprache des Prozessors welche aus null und eins besteht:
Als Beispiel Übersetzt er folgende Befehle in den Maschienencode:

Da das Dualsystem (0101 1100)  ungeeignet zum Programmieren ist, benützt man einen Assembler und schreibt das Programm im Assembler Code(mov). Dies ist viel einfacher und erspart viel Zeit.
Je nach Prozessor können die vorhandenen Befehle variieren. In den gebräuchlichen PC's werden allerdings Prozessoren verwendet, welche mit dem 8086 von Intel kompatibel sind. So gibt es doch noch eine gewisse Kompatibilität.
Im Gegensatz zu anderen höheren Programmiersprachen wie C oder Java, benötigt der Assembler für jeden Schritt eine Anweisung. Wobei bei den Hochsprachen mit einer Anweisung mehrere Schritte ausgeführt werden. Dies führt automatisch zu mehr Befehlen, für gleiche Anwendungen.

Einige Gründe für die Verwendung von Assemblersprache:
  1.  Treiber werden weitgehend in Maschinensprache geschrieben.
  2. Anspruchsvolle Programme (z. B. Spiele) werden meist erst in einer Hochsprache
    geschrieben - und laufen unzumutbar langsam. Ersetzt man später einige kritische (am häufigsten durchlaufene) Programmteile durch Maschinensprache, wird das gesamte Programm wesentlich schneller. Ersetzt man nur ein Prozent des Programms an den richtigen Stellen durch Assemblercode, läuft das Programm 10- bis 100-mal schneller!
  3. Jeder Compiler erzeugt auch aus einer Hochsprache ohnehin letztlich ein Programm in Maschinensprache. 
  4. Bei industriellen Steuerungen mit Echtzeit-Anforderungen, d.h. die sofort reagieren müssen, ist die Verwendung von Maschinensprache häufig notwendig.
  5. Beschäftigung mit Maschinensprache erfordert und fördert zugleich das Verständnis für das Funktionieren der Hardware.


Gratis Assembler zum Üben. :


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Freitag, 14. Oktober 2011

C- Password Eingabe


Das Programm:
Ein Programm wird mit einem Code geschützt. Der Benutzer hat drei Versuche.
Mit Hilfe einer Do-While-Schlaufe werden die Anzahl Versuche begrenzt.
Die if Funktionen überprüfen die Richtigkeit der Zahl.


/*
Titel: Eingabeprüfung
Datei password.cpp
Autor: Jonathan Ernst
Datum: 26.08.2011
 Rev : 2.0
Funktion:
Password: Ein Programm wird mit einem Code geschützt. Der Benutzer hat drei Versuche.
*/
#pragma hdrstop                                      //compiler anweisung
#pragma argsused                                     //compiler anweisung
#include                                    //Biblioothek Tastatur laden
#include                                    //Bibliothek I/O laden
#include                                     //Bibliothek math laden
//-------------------------------------------------------------------------------------------
int main(void)                                    //aufruf funktion hauprprogramm
{
int code = 1234;                                //Deklaration Variable code
int password = 0;                               //Deklaration Variable password
int zaler = 0;                                  //Deklaration Variable zahler

 printf("Hallo,\nLieber Internet Benutzer, sie haben jetzt die \nM\224glichkeit sich f\201r das Programm anzumelden.\nDazu ben\224tigen wir ihr Password."); //Textausgabe
 printf("\n\nIhr Password: ");      //Textausgabe
 scanf("%i", &password);            //eingabe des Passwords


 if (code != password)                           //Konntrolliert die Richtigkeit des Passwortes
   {
         do        //while schlaufe bis password ok ist.
         {
              printf("\n\nIhr Password: ");       //Textausgabe
              scanf("%i", &password);            //eingabe des Passwords
              zaler = zaler +1;                 //zählt anzahl versuche.
         }
         while (( code != password)&&(zaler < 2));      //Drei Versuche Das Password richtig einzugeben.
   }

if (code != password)                             //Konntrolliert die Richtigkeit des Passwortes
   {
         printf("Sorry, sie haben es nicht geschaft.");       //Textausgabe
         getch();

   }
else                                                               //Wenn das Password Richtig ist.
   printf("Gratulation sie haben den richtigen Code eingegeben!");    //Textausgabe

getch();
return(0);
}

Der Compilierte Code :


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!

Donnerstag, 13. Oktober 2011

C- Eingabeprüfung


Das Programm:
In diesem Programm wird die While-Schlaufe eingesetzt. Diese wiederholt den Programmteil solange die eingegebene Zahl nicht zwischen 100 und 1000 liegt.

Mit den Funktionen if und else werden die eingegebenen Werte mit den festgelegten Werten verglichen. Wenn die Zahl im richtigen Zahlenbereich liegt so wird die Variable: "Entscheidung", gleich "e" gesetzt. Dies bewirkt ein Ende der While-Schlaufe.

Der Benutzer wird im Dialog aufgefordert, eine Zahl einzugeben. Das Programm prüft, ob die
eingegebene Zahl im gültigen Wertebereich liegt.


/*
Titel: Eingabeprüfung
Datei eingabeprüfung.cpp
Autor: Jonathan Ernst
Datum: 08.07.2011
 Rev : 1.2

Funktion:
Eingabeprüfung: Der benutzer wird im Dialog aufgefordert,
eine zahl einzugeben. Das Programm prüft, ob die
eingegebene Zahl im gültigen Wertebereich liegt.

*/
#pragma hdrstop                                      //compiler anweisung
#pragma argsused                                     //compiler anweisung
#include                                    //Biblioothek Tastatur laden
#include                                    //Bibliothek I/O laden
#include                                     //Bibliothek math laden


//-------------------------------------------------------------------------------------------
int main(void)                                    //aufruf funktion hauprprogramm
{
float eingabe = 0;                                //Deklaration Variable eingabe
float wertebereichvon = 100;                      //Deklaration Variable wertebereich von
float wertebereichbis = 1000;                     //Deklaration Variable wertebereich bis
char entscheidung = 'a';                                    //Deklaration variable exit
char scan = 'a';                                    //Deklaration variable scan


while(entscheidung != 'e' )
{
printf("\nGeben sie ihre Zahl ein: ");
scanf("%f", &eingabe);                    //Texteingabe

if ((eingabe > wertebereichvon)&&(eingabe < wertebereichbis))
{
printf(" Die Zahl wurde akzeptiert!");
getch();
entscheidung = 'e';
}
else
{
printf("\nerror - bitte zahl nocheinmal eingeben." );
getch();
entscheidung = 'o';
}

getch();

}
return(0);

}

Der Compilierte Code :

Montag, 10. Oktober 2011

C - Zeitungspapier zum Mond



Das Programm:
Berechnen Sie wie viele Faltungen mit Zeitungspapier der Dicke 0.05 mm notwendig sind, damit die papierstapelhöhe der Distanz Mond - Erde entspricht. ca.(384'000 km)

/*
Titel: Zeitungspapier
Datei zeitungspapier.cpp
Autor: Jonathan Ernst
Datum: 01.07.2011
Rev.1.1

Funktion:
Berechnen Sie wie viele Faltungen mit Zeitungspapier
der Dicke 0.05 mm notwendig sind, damit die papierstapelhöhe
der Distanz Mond - Erde entspricht. ca.(384'000 km)

*/
#pragma hdrstop                                      //compiler anweisung
#pragma argsused                                     //compiler anweisung
#include                                    //Biblioothek Tastatur laden
#include                                    //Bibliothek I/O laden
#include                                     //Bibliothek math laden


//-------------------------------------------------------------------------------------------
int main(void)                                         //aufruf funktion hauprprogramm
{
   double distanz = 384000000000;                        //Deklaration variable distanz Mond-Erde
   float zahler = 0;                                   //Deklaration variable zahler
   double dicke = 0.05;                                    //Deklaration variable dicke

while ( dicke<=distanz)                         //while schlaufe, solange dicke kleiner oder gleich distanz ist ist.

{
    dicke = dicke * 2;                     
     zahler++;                          //berechnung zahler

}

printf("Ein Zeitungspapierst\201ck muss %.0f mal gefaltet werden,\nbis es die Distanz Mond->Erde erreicht. ", zahler);      //textausgabe
getch();                                                  //warte auf enter

   return(0);                                                //ende
}

Der Compilierte Code :


C - simple programs
---------------------------------------------------------------------------------
Captain Malgardi
Malgardis Crew
become a fan on Facebook : Malgardi Fan!