Hinweise C-Programmierung

Ähnliche Dokumente
Assembler - Einleitung

Tutorium Rechnerorganisation

Bibliotheks-basierte Virtualisierung

Assembler - Adressierungsarten

RO-Tutorien 3 / 6 / 12

Aufgabe 1 Entwicklung einer Virtuellen Maschine

Embedded-Linux-Seminare. Toolchains

Welche Informatik-Kenntnisse bringen Sie mit?

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

Shangrila. One Instruction Set Computer

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Moderne C-Programmierung

Die Programmiersprache C99: Zusammenfassung

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

U4 Grundlagen der C-Programmierung

Integer Integer Integer (Voreinstellung) Integer Gleitkomma Gleitkomma leer/unbestimmt Integer ohne Vorzeichen Integer (explizit) mit Vorzeichen

Busse. Dr.-Ing. Volkmar Sieh. Institut für Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2008/2009

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

Assembler-Programmierung

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

5. Tutorium zu Programmieren

Vorkurs C++ Programmierung

Einführung in die C-Programmierung

Datenstrukturen, Alignment Stack Prozeduraufruf, Parameterübergabe und -rückgabe (Calling Conventions) Leaf procedures

2Binden 3. und Bibliotheken

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Karlsruher Institut für Technologie

AuD-Tafelübung T-B5b

Die Programmiersprache C Eine Einführung

Programmieren I + II Regeln der Code-Formatierung

Betriebssysteme Teil 4: Übersetzung von C-Programmen

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

Probeklausur: Programmierung WS04/05

Grundlagen der Programmierung in C Funktionen

1.7 Assembler Programmierung

Mikrocontroller effektiv in C programmieren - ein noch unbekanntes Land

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

Werkzeuge zur Programmentwicklung

Zusammenfassung des Handzettels für Programmieren in C

0 C (Carry) Überlauf des 8ten Bits. 1 DC (Digit Carry) Überlauf des 4ten Bits. Mnemonic Parameter Beschreibung Status-Flags.

Microcontroller Praktikum SS2010 Dipl. Ing. R. Reisch

[E-1] Wolf, Jürgen: C von A bis Z. Galileo Computing, 3. Auflage,

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Propädeutikum. Dipl.-Inf. Frank Güttler

Diplomarbeit Antrittsvortrag

Repetitorium Informatik (Java)

1.4. Funktionen. Objektorientierte Programmierung mit C++

Zeiger, Arrays und Strings in C und C++

3. Anweisungen und Kontrollstrukturen

Zählen von Objekten einer bestimmten Klasse

1. Übung zu "Numerik partieller Differentialgleichungen"

Teil 1: Prozessorstrukturen

Übung 1 - Betriebssysteme I

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

C++ Templates - eine kleine Einführung. Allgemein. Funktionstemplates. Allgemein. Funktionstemplates. Klassentemplates

Microcontroller Kurs Programmieren Microcontroller Kurs/Johannes Fuchs 1

Die Mikroprogrammebene eines Rechners

Programmieren I. Kapitel 5. Kontrollfluss

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Delegatesund Ereignisse

Rechnerarchitektur, Einführung in die Laborübungen

= 7 (In Binärdarstellung: = 0111; Unterlauf) = -8 (In Binärdarstellung: = 1000; Überlauf)

Vorlesung Programmieren

Programmieren in C. Eigene Datentypen per typedef und Strukturen. Prof. Dr. Nikolaus Wulff


b) Gegeben sei folgende Enumeration: enum SPRACHE {Deutsch, Englisch, Russisch};

Einführung in die technische Informatik

Primitive Datentypen

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Deklarationen in C. Prof. Dr. Margarita Esponda

Informatik für den Satellitenbau. Toolchains und Crosscompiler

Advanced Programming in C

Computergrundlagen Programmieren in C

Einstieg in die Informatik mit Java

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Programmieren I. Prinzipieller Ablauf. Eigenschaften von JAVA. Source-Code Javac Bytecode. Java Virtual Machine (Java, Browser, Appletviewer)

3. Einführung in C Programmierung Einführung in C Programmierung

Java Kurs für Anfänger Einheit 5 Methoden

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Erste Schritte der Programmierung in C

x86 Open Source Virtualisierungstechniken Thomas Glanzmann

Angewandte Mathematik und Programmierung

Hardware-basierte Virtualisierung

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

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

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Buffer Overflow 1c) Angriffsstring: TTTTTTTTTTTTTTTT (16x) Beachte: Padding GCC-Compiler Zusatz: gcc O2 verhindert hier den Angriff (Code Optimierung)

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Debuggen mit GDB (Gnu DeBugger) unter Eclipse

Transkript:

Hinweise C-Programmierung Dr.-Ing. Volkmar Sieh Department Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2016/2017 V. Sieh Hinweise C-Programmierung (WS16/17) 1 17

Bit-Manipulation das n-te Bit gesetzt: 1 << n Maske für alle außer dem n-ten Bit: ~(1 << n) Bit setzen Verodern: x = 0x01; Bit löschen Verunden: x &= ~0x01; Bit umkehren Exklusives Oder x ^= 0x01; niederwertiges Byte: x & 0xff nur niederwertiges Byte verändern: x &= ~0xff; x = b & 0xff; V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 2 17

Variablen fester Größe C garantiert keine Größe von short int, int, long int, aber inttypes.h enthält folgende Definitionen: uint8_t uint16_t uint32_t uint64_t int8_t int16_t int32_t int64_t V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 3 17

Format-String für inttypes Problem: %d bezieht sich auf int, %ld auf long int usw. Für Variablen fester Größe können die Macros PRId8, PRIu16, PRIo32, PRIx64 etc. verwendet werden. Beispiel: uint32_t x; x = 1234; printf("x hat den Wert %" PRIu32 "\n", x); V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 4 17

Funktionspointer Eine Funktion ist eine Adresse im.text-segment Diese Adresse kann in C genutzt werden (z.b. für Callbacks) Deklaration für Funktionspointer: Rückgabe-Typ (*Name)(Parameter-Typ, Parameter-Typ, ) Beispiel: void (*funptr)(int, long int); Zuweisung: funptr = myfunc; Aufruf mittels: (*funptr)(23, 42); Einfacher: funptr(23, 42); V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 5 17

C-Code Binär-Code Programmierer schreibt Programm in C CPU führt binäre Befehle im Speicher aus Was passiert dazwischen? V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 6 17

Toolchain 1. Preprozessor cpp ersetzt Makros und fügt Code für inkludierte Dateien ein. cpp hallo.c > hallo.pre.c 2. Compiler cc1 erzeugt Assembler-Code cc1 [-m32] hallo.pre.c 3. Assembler generiert Object-Code as [-32] hallo.pre.s -o hallo.o 4. Linker bindet Object-Dateien zusammen, und löst dabei Referenzen auf und führt Relokation durch ld [-m elf_i386] hallo.o -o hallo.bin [] V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 7 17

Relokation beim Binden 0x0000 0x05a0 0x0000 0x0120 hallo.o welt.o call 0x0048 0x0000 0x05a0 0x06c0 hallo.o welt.o call 0x05e8 V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 8 17

Tools zum Inspizieren von Objects/ELFs Anzeigen der Relokationstabelle: objdump -r <datei> Assembler-Listing (mit Binärdarstellung) anzeigen: objdump -D <datei> Eine Sektion in Binärform in eine Datei kopieren: objcopy -O binary -j <sektion> <datei> <zieldatei> Weitere Tools: readelf, nm V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 9 17

Performance Problem: Virtuelle Maschinen sind immer (zu) langsam. Fakten: moderne CPUs sind sehr schnell (bis zu 4.000.000.000 Instruktionen pro Sekunde) Speicherzugriffe langsam (u.u. mehrere Tausend Instruktionen) Sprünge flushen ggf. die Instruktions-Pipeline (damit werden ggf. bis zu 50 Instruktionen verworfen) V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 10 17

Performance Was heißt das für die Programmierung einer Virtuellen Maschine? Cache gut ausnutzen Zustand der virtuellen CPU (Register inkl. Status-Wort und Inst.-Pointer) Zustandsinfos der virtuellen I/O-Geräte häufig durchlaufener Simulations-Code sollte in möglichst wenigen Cache-Zeilen stehen Sprünge sollten vermieden werden Inlining rechnen statt springen V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 11 17

Performance Caches Z.B.: struct cpu_state { uint32_t ip; uint32_t flags; uint32_t eax; uint32_t ebx; cpu_state attribute (( aligned (128))); Ergebnis: CPU-Zustandsinfo liegt (vermutlich) in ein oder zwei Cache-Zeilen. V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 12 17

Performance Caches schlecht cpu_step() { if (! power) { /* Do nothing */ else if (irq_pend) { cpu_step_irq(); else { cpu_step_inst(); C-Compiler generiert vermutlich zwei (i.a. genommene) Sprungbefehle (=> Code vermutlich verteilt auf mehrere Cache-Zeilen) gut #define BE(a, b) builtin_expect(a, b) cpu_step() { if (BE(! power, 0)) { /* Do nothing */ else if (BE(irq_pend, 0)) { cpu_step_irq(); else { cpu_step_inst(); C-Compiler generiert vermutlich zwei (i.a. nicht genommene) Sprungbefehle (=> Code vermutlich in ein/zwei Cache-Zeilen) V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 13 17

Performance Sprünge schlecht uint32_t add(uint32_t a, uint32_t b) { uint64_t res = (uint64_t) a + b; if (0x100000000 <= res) { carry = 1; else { carry = 0; return (uint32_t) res; Sprungvorhersage unzuverlässig, da Carry-Bit nicht vorhersagbar (=> viele Pipeline-Flushes). gut uint32_t add(uint32_t a, uint32_t b) { uint64_t res = (uint64_t) a + b; carry = (res >> 32) & 1; return (uint32_t) res; Linearer Code (=> keine Pipeline-Flushes). V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 14 17

Performance Sprünge Problematisch: exec_inst() { uint8_t inst = load(ip++); switch (inst) { case 0x00: ; break; case 0x01: ; break; case 0xff: ; break; Sprungvorhersage unzuverlässig, da immer neue Instuktionen (=> viele Pipeline-Flushes). V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 15 17

Performance Sprünge Datei x.c Datei y.c schlecht void bar() { foo() { bar(); Nicht static und andere Datei (=> Inlining i.a. unmöglich). eine Datei gut static void bar() { foo() { bar(); static und gleiche Datei (=> Inlining möglich). V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 16 17

Performance Sprünge uint32_t alu(int cmd, uint32_t a, uint32_t b) { uint32_t res; switch (cmd) { case 0: res = a + b; break; case 1: res = a - b; break; case 2: res = a * b; break; case 3: res = a / b; break; return res; inst immer wieder anders (=> viele Pipeline-Flushes). eventuell besser uint32_t alu(int cmd, uint32_t a, uint32_t b) { uint32_t res[4]; res[0] = a + b; res[1] = a - b; res[2] = a * b; res[3] = a / b; return res[cmd]; linearer Code (=> keine Pipeline-Flushes). V. Sieh Hinweise C-Programmierung (WS16/17) C-Programmierung 17 17