Programmiersprachen Einführung in C

Ähnliche Dokumente
Programmiersprachen Einführung in C

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Tutorium Rechnerorganisation

Einführung in die Systemprogrammierung

Zusammenfassung: Grundlagen der Informatik Zahlensysteme, b-adische Darstellung, Umrechnung Beispiel: Umrechnung von ( ) 10 ins Dualsystem

Technische Informatik I - HS 18

Lösungsvorschlag 10. Übung Technische Grundlagen der Informatik II Sommersemester 2009

Technische Informatik 1 Übung 2 Assembler (Computerübung) Matthias Meyer

RO-Tutorien 15 und 16

28. März Name:. Vorname. Matr.-Nr:. Studiengang

Klausur Mikroprozessortechnik 29. März 2010

Heute nur MIPS-Praxis (4 Aufgaben)

21. Februar Name:. Vorname. Matr.-Nr:. Studiengang

Lösungsvorschlag zur 3. Übung

Einleitung Grundlagen Erweiterte Grundlagen Zusammenfassung Literatur. C: Funktionen. Philip Gawehn

Assembler Programmierung Motivation. Informatik II SS 2004 Teil 4: Assembler Programmierung. Assembler vs. Maschinensprache

Arithmetik, Register und Speicherzugriff. Grundlagen der Rechnerarchitektur Assembler 9

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Übungsblatt 10 (Block C 2) (16 Punkte)

5.BMaschinensprache und Assembler

Weitere Arithmetik. Grundlagen der Rechnerarchitektur Assembler 33

Unterstützung von Jump Tables

MIPS-Programmierung in der WebSPIM-Umgebung (0.3)

Praktikum Rechnerstrukturen (WS 14/15) Bogen 4

C-Programmierkurs Mathematik

Einführung in die Systemprogrammierung

Technische Informatik I Übung 3: Assembler

Unterprogramme. Unterprogramme

Mikroprozessortechnik. 03. April 2012

Besprechung des 4. Übungsblattes Was ist MIPS? SPIM-Simulator MIPS-Befehlsformate MIPS-Befehle Assemblerdirektiven Syscalls in MIPS

Zeiger, Arrays und Strings in C und C++

Vorlesung Rechnerarchitektur

Technische Informatik I - HS 18

Institut für Informatik Prof. Dr. D. Hogrefe Dipl.-Inf. R. Soltwisch, Dipl.-Inform. M. Ebner, Prof. Dr. D. Hogrefe Informatik II - SS 04.

Übungsblatt 10 (Block C 2) (16 Punkte)

Grundlagen zur Assemblerprogrammierung unter SPIM im Sommersemester Lorenz Schauer Mobile & Verteilte Systeme

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

U23 Assembler Workshop

Grundlagen der Rechnerarchitektur. MIPS Assembler

Die Maschinenprogrammebene eines Rechners Jörg Roth 294

Kompilieren Datentypen Operatoren. Überblick. 1 Kompilieren. 2 Datentypen. const static volatile. 3 Operatoren. Alexander Batoulis

Technische Informatik 1 - HS 2017

Darstellung von Instruktionen. Grundlagen der Rechnerarchitektur Assembler 21

Beim Programmieren mit MMIX habt ihr vielleicht schon öfter eine der folgenden Fehlermeldungen von MMIXAL bekommen:

Technische Informatik 1

GI Vektoren

Einführung. Saalübung Informatik II SS Einführung. Einführung

U23 Assembler Workshop

Die Programmiersprache C Eine Einführung

Übungspaket 10 Fallunterscheidungen

32 Bit Konstanten und Adressierung. Grundlagen der Rechnerarchitektur Assembler 78

Übungspaket 14 Eindimensionale Arrays

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Einführung in die Systemprogrammierung

Compiler: Vom Code zum Maschinen-Code. C Programmierung - Vorlesung 2 Hochschule Regensburg Universitätsstraße 31, Regensburg

Kap.2 Befehlsschnittstelle. Prozessoren, externe Sicht

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Technische Informatik 1 - Übung 3 3. & 4. November Philipp Miedl

Arrays (Felder/Vektoren)

RO-Tutorien 3 / 6 / 12

Computersysteme. Stacks Anwendung in der Assembler-Programmierung

Kap 5. 5 Die Maschinenprogrammebene eines Rechners. int a=1, b=2; a = a+2*b; Höhere Programmiersprache. Assembler und Maschinenprogramm

Von Assembler zu Java

Praktikum Rechnerstrukturen. Assemblerebene Stack

Notwendigkeit für andere Instruktionsformate

Übungspaket 9 Logische Ausdrücke

Assembler am Beispiel der MIPS Architektur

Einführung Programmierpraktikum C Michael Zwick

Einführung in C. EDV1-04C-Einführung 1

Lösungsvorschlag zur 9. Übung

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

Übungspaket 12 Der Datentyp char

ARM-Cortex-M4 / Thumb-2-Befehlssatz Adressierungsarten und arithmetische Operationen

Grundlagen der Informatik III

Kap.3 Mikroarchitektur. Prozessoren, interne Sicht

Zeichenketten (1) Literale von Zeichenketten werden in doppelte Anführungszeichen gesetzt

Welche Informatik-Kenntnisse bringen Sie mit?

Transkript:

Programmiersprachen Einführung in C Teil 1: Von der Maschinensprache zu C Prof. Dr. Maschinensprache: MIPS R2000 Was bewirkt folgendes Programm: 00100111101111011111111111100000 10101111101111110000000000010100 10101111101001000000000000100000 10101111101001010000000000100100 10101111101000000000000000011000 10101111101000000000000000011100 10001111101011100000000000011100 10001111101110000000000000011000 00000001110011100000000000011001 00100101110010000000000000000001 00101001000000010000000001100101 10101111101010000000000000011100 00000000000000000111100000010010 00000011000011111100100000100001 00010100001000001111111111110111 10101111101110010000000000011000 00111100000001000001000000000000 10001111101001010000000000011000 00001100000100000000000011101100 00100100100001000000010000110000 10001111101111110000000000010100 00100111101111010000000000100000 00000011111000000000000000001000 00000000000000000001000000100001 2 1

Maschinensprache: MIPS R2000 MIPS R2000 ist ein 32-Bit-Prozessor Alle Maschinenbefehle sind 32 Bit lang, verschiedene Formate 32-Bit-Worte, 32 Prozessorregister mit je 32 Bit Maschinenbefehle können direkt in Assemblerbefehle übersetzt werden Die ersten (und ggf. auch letzten) 6 Bits spezifizieren den Befehl Assemblerbefehle sind einfacher zu merken als Bitmuster Die restlichen Bits müssen je nach Befehl unterschiedlich interpretiert werden 3 Maschinensprache: MIPS R2000 4 2

Maschinensprache: MIPS R2000 Was bewirkt folgendes Programm: addiu 11101111011111111111100000 sw 11101111110000000000010100 sw 11101001000000000000100000 sw 11101001010000000000100100 sw 11101000000000000000011000 sw 11101000000000000000011100 lw 11101011100000000000011100 lw 11101110000000000000011000 00 01110011100000000000011001 addiu 01110010000000000000000001 slti 01000000010000000001100101 sw 11101010000000000000011100 00 00000000000111100000010010 00 11000011111100100000100001 bne 00001000001111111111110111 sw 11101110010000000000011000 lui 00000001000001000000000000 lw 11101001010000000000011000 jal 00000100000000000011101100 addiu 00100001000000010000110000 lw 11101111110000000000010100 addiu 11101111010000000000100000 00 11111000000000000000001000 00 00000000000001000000100001 5 Maschinensprache: MIPS R2000 Was bewirkt folgendes Programm: addiu 11101,11101,1111111111100000 sw 11101,11111,0000000000010100 sw 11101,00100,0000000000100000 sw 11101,00101,0000000000100100 sw 11101,00000,0000000000011000 sw 11101,00000,0000000000011100 lw 11101,01110,0000000000011100 lw 11101,11000,0000000000011000 multu 01110,01110,0000000000 0000000000 addiu 01110,01000,0000000000000001 slti 01000,00001,0000000001100101 sw 11101,01000,0000000000011100 mflo 00000,00000,01111,00000 addu 11000,01111,11001,00000,00000 bne 00001,00000,1111111111110111 sw 11101,11001,0000000000011000 lui 00000,00100,0001000000000000 lw 11101,00101,0000000000011000 jal 00000100000000000011101100 addiu 00100,00100,0000010000110000 lw 11101,11111,0000000000010100 addiu 11101,11101,0000000000100000 jr 11111,000000000000000 addu 00000,00000,00010,00000,00000 6 3

Maschinensprache: MIPS R2000 konturierte Bits haben keine Bedeutung (Füllung, da alle Befehle 32 Bit lang sein müssen) unterstrichene Bits sind feste Werte Fünfer-Gruppen von Bits (als Binärzahlen ohne Vorzeichen Werte zwischen 0 und 31) geben die Nummer eines Registers ($0 bis $31) an 7 Aufbau des MIPS R2000 8 4

Assembler: MIPS R2000 Was bewirkt folgendes Programm: addiu $29, $29, -32 sw $31, 20($29) sw $4, 32($29) sw $5, 36($29) sw $0, 24($29) sw $0, 28($29) lw $14, 28($29) lw $24, 24($29) multu $14, $14 addiu $8, $14, 1 slti $1, $8, 101 sw $8, 28($29) mflo $15 addu $25, $24, $15 bne $1, $0, -9 sw $25, 24($29) lui $4, 4096 lw $5, 24($29) jal 1048812 addiu $4, $4, 1072 lw $31, 20($29) addiu $29, $29, 32 jr $31 move $2, $0 9 Einfacher Assembler: MIPS R2000 Maschinenbefehle sind direkt in eine lesbarere Form übersetzt worden: 00100111101111011111111111100000 in addiu $29, $29, -32 Register werden noch durch ihre Nummer bezeichnet; die in ihnen gespeicherten Werte haben so noch keine Bedeutung: $29 ist eigentlich der Stapelzeiger 10 5

Einfacher Assembler: MIPS R2000 Kontrollstrukturen (if goto-schleifen) sind nur schwer zu erkennen, und goto ist relativ zur konkreten Position des Verzweigungsbefehls: slti $1, $8, 101 und bne $1, $0, -9 Speicheroperationen (load, store) werden relativ zu einem Pointer-Register durchgeführt: sw $31, 20($29) bedeutet, dass der Inhalt von Register Nummer 31 (die Rücksprungadresse als 32-Bit-Wort) im Hauptspeicher ab der Stelle (Inhalt von Register 29)+20 abgespeichert wird. 11 Einfacher Assembler: MIPS R2000 Funktionen werden durch Sprung an eine konkrete Stelle im Hauptspeicher aufgerufen: jal 1048812 ruft die Funktion (welche?) auf, die mit der Speicheradresse 1048812 (durch 4 teilbar) beginnt. Es gibt keine Variablen, nur im Hauptspeicher vorhandene Werte, auf die mit Hilfe von Pointern gezeigt werden kann: lw $24, 24($29) sw $25, 24($29) Jeder dieser einfachen Assembler-Befehle entspricht genau einem Maschinenbefehl 12 6

Assembler: Registerkonventionen 13 MIPS: Speicherorganisation 14 7

Assembler: MIPS R2000 Was bewirkt folgendes Programm:.data.align 0 str:.asciiz "The sum from 0.. 100 is %d\n.text.align 2.globl main main: subu $sp, $sp, 32 sw $ra, 20($sp) sd $a0, 32($sp) sw $0, 24($sp) sw $0, 28($sp) loop: lw $t6, 28($sp) mul $t7, $t6, $t6 lw $t8, 24($sp) addu $t9, $t8, $t7 sw $t9, 24($sp) addu $t0, $t6, 1 sw $t0, 28($sp) ble $t0, 100, loop la $a0, str lw $a1, 24($sp) jal printf move $v0, $0 lw $ra, 20($sp) addu $sp, $sp, 32 jr $ra 15 Assembler: MIPS R2000 Neben echten Maschinenbefehlen stehen jetzt als Hilfe für den Programmierer: Direktiven an das Assemblerprogramm, kenntlich am., wie z.b..text und.data Labels, die als Variablennamen (str), abstrakte Sprungadressen (loop) oder Funktionsnamen (main, printf) dienen können. Dadurch wird es möglich, Programme übersichtlicher aufzuschreiben. Pseudobefehle, die mehrere Maschinenbefehle zusammenfassen, von der Hardware abstrahieren und den Code lesbarer machen: mul $t7, $t6, $t6 als Zusammenfassung von multu $14, $14 und mflo $15 16 8

Assembler: Pointer.asciiz "The sum from 0.. 100 is %d\n legt fest, dass die in Anführungszeichen stehende Zeichenfolge im ASCII-Code und nullterminiert im Speicher unter dem angegeben Label abzulegen ist (vgl. ASCII-Tabelle auf der nächsten Folie). la $a0, str lädt einen Pointer (Zeiger) auf die Variable str in das Register $a0 ( a für argument ); $a0 enthält also die Speicherstelle, in der das erste Zeichen des obigen Strings (also das T ) abgelegt ist. Auf das zweite Zeichen h kann man dann zugreifen, wenn man den Wert von $a0 um 1 erhöht und dann den Inhalt dieser Speicherstelle lädt. 17 ASCII-Zeichensatz 18 9

Unser erstes C-Programm #include <stdio.h> int main (int argc, char *argv[]) { int i; int sum = 0; for (i = 0; i <= 100; i = i + 1) sum = sum + i * i; printf ("The sum from 0.. 100 is %d\n", sum); } 19 Unser erstes C-Programm #include <stdio.h> Die Sprache C enthält keine Konstrukte für Ein- oder Ausgabe, da diese jeweils stark vom Betriebssystem abhängen. Daher benötigt jedes C-Programm die jeweilige Standardbibliothek stdio.h int main (int argc, char *argv[]) Jedes C-Programm ist selbst eine Funktion, die von der Laufzeitumgebung (i.d.r dem Betriebssystem) aufgerufen wird. Als Ergebnis gibt diese Funktion eine ganze Zahl zurück, wobei negative Zahlen als Fehlercodes interpretiert werden. 20 10

Unser erstes C-Programm Mit char *argv[] wird dem Hauptprogramm ein Array von char ( Characters ) übergeben (das main dann aber gar nicht nutzt). Arrays werden in C als Pointer auf einen nullterminierten String von Zeichen dargestellt. argv[] enthält also die Speicherstelle des ersten Zeichens dieses Strings, und der Dereferenzierungsoperator * bewirkt, dass der Inhalt dieser Speicherstelle betrachtet wird, und der ist vom Typ char. printf ist eine Funktion aus stdio.h; auf ihre Syntax gehen wir an geeigneter Stelle noch ein 21 Literatur http://www.cs.wisc.edu/~larus/spim.html Die auf dieser Seite enthaltenen Links Kernighan, Ritchie, Programmieren in C, 2. Auflage, Hanser 1990. 22 11