Rechnertechnik II Assemblerebene Assemblerebene Inhalt: ➢ Assemblersprache ➢ Assemblernotationen Ebene 5 Problemorientierte Sprache Ebene 4 Assemblersprache Ebene 3 Betriebssystemmaschine Ebene 2 Befehlssatzarchitektur Ebene 1 Mikroarchitektur Ebene 0 Digitale Logik Assemblerebene Assemblersprache Assemblersprache Definition: ● ● reine Assemblersprache: ➔ jede Anweisung → eine entsprechende Maschineninstruktion ➔ 1-zu-1-Abbildung Vorteile der Assemblersprache gegenüber Instruktionen der ISA-Ebene: ➔ ➔ leichtere Programmierung: ➢ Verwendung von symbolischen Namen für Befehle ➢ keine Anwendung des numerischen Befehlskodes ➢ Mnemonics wie z.B. ADD, SUB, JMP, POP Adressierung über Marker: ➢ Markenname als Bezeichnung für Speicherstelle ➢ Referenzierung über Marker ➢ numerische Adressberechnung durch Assembler bereitgestellt Assemblersprache Definition (Fortsetzung): ● Vorteile der Assemblersprache gegenüber Hochsprachen: ➔ Zugriff auf ISA-Eigenschaften: ➢ ➢ ➔ ● vollständiger Zugriff auf alle Instruktionen des Befehlssatzes vollständiger Zugriff auf alle Merkmale der Zielmaschine wie z.B. Registersätze, Flags und andere Ressourcen alle Aktionen durch ISA-Befehle hervorgerufen → auf bestimmte Assembleranweisung abgebildet und anwendungsfähig Nachteile der Assemblersprache gegenüber Hochsprachen: ➔ mangelnde Kompatibilität: ➢ ➢ Assemblerprogramm oft nur für 1 Maschinen- / Prozessorfamilie geeignet Quellprogramm der Hochsprachen oft portabel auf verschiedene Architekturen Assemblersprache Implementierung: ● Implementierung durch Übersetzung, nicht durch Interpretierung: ➔ Übersetzer notwendig ➔ Quellsprache → Konvertierung → Zielsprache: ➔ ➢ Objektprogramm ➢ ausführbares Binärprogramm Unterschiede zur Interpretierung → 2 Schritte notwendig: 1) Übersetzung in die Zielsprache 2) Ausführung des Programmes ● Objektprogrammausführung: ➔ mittels Interpretierung durch darunterliegende Ebenen ➔ Betriebsystemmaschine → ISA-Befehl → Mikroarchitektur Assemblersprache Übersetzung: ● verschiedene Übersetzungsvorgänge zur Erzeugung der betriebssystemabhängigen Zielsprache: Hochsprache z.B. C Assemblersprache Kompilieren Assemblieren Quellsprache Zielsprache Objektprogramm Assemblersprache Anwendung: ● Zweck: 1. Leistungsfähigkeit der Programmausführung 2. Zugriff auf darunterliegende Hardware ● Leistungsfähigkeit: ➔ ➔ ● Assemblerprogramm oft kompakter und schneller in der Ausführung Geschwindigkeit und Programmgröße bei eingebetteten Anwendungen wichtig: ➢ Smard-Card-Applikationen ➢ Gerätetreiber ➢ sicherheitskritische Applikationen vollständiger Hardwarezugriff: ➔ Interrupt- / Trap-Handler ➔ Gerätecontroller Assemblersprache Anwendung (Fortsetzung): ● Systemprogrammierung: ➔ ➔ oft Kombination aus Programmierung in Hochsprache, z.B. C, mit Assemblerabschnitten für kritische Regionen Identifizierung kritischer Abschnitte durch Benchmark-Test → anschließend Tuning Programmierung in Mannjahren Assemblersprache Hochsprache Mischansatz für Systemprogram. Kritische Abschnitte 10% Restliche Asbchnitte 90% Gesamt nach Tuning Kritische Abschnitte 10% Restliche Abschnitte 90% Gesamt nach Tuning Programmausführungszeit 50 10 33 100 1 9 90 10 10 100 6 9 30 10 15 40 Assemblerebene Assemblernotationen Assemblernotationen Notationsbeispiele: ● ● ● CISC-Prozessor: ➔ X86 Assembler ➔ Beschreibung X86 Assembler (engl.) RISC-Prozessor: ➔ SPARC Assembler ➔ Beschreibung SPARC Assembler (engl.) Notationsbeispiele der Übungen: ➔ X86 Assembler ➔ AT&T Notation ➔ GCC Inline Assembler Assemblernotationen Grundlegende Inlinenotation: ● Synopsis: asm("assembly code"); ● Grundformen: asm("movl %ecx %eax"); /* moves the contents of ecx to eax */ __asm__("movb %bh (%eax)"); /* moves the byte from bh to the memory pointed by eax */ ● Beispiel: __asm__ ( "movl "movl "movl "movb %eax, %ebx\n\t" $56, %esi\n\t" %ecx, $label(%edx,%ebx,$4)\n\t" %ah, (%ebx)" ); Assemblernotationen Grundlegende Inlinenotation: ● Syntax einer Assemblerzeile: op-code source destination [ ;\n\t ] ● ● Registerbezeichnung: ➔ Registernamen wird Prefix % vorangestellt ➔ z.B. %eax Unmittelbare Operanden: ➔ Prefix $ bei Konstanten bzw. Literalen vorangestellt ➔ z.B. $51, $0x33 ➔ Variablen mit static Modifizierer Assemblernotationen Grundlegende Inlinenotation: ● Operandengröße: ➔ entsprechender Suffix wird Op-code nachgestellt ➢ b = byte (8 bit) ➢ s = short (16 bit integer) oder single (32-bit floating point) ➢ w = word (16 bit) ➢ l = long (32 bit integer) oder (64-bit floating point) ➢ q = quad (64 bit) ➢ t = ten bytes (80-bit floating point) Assemblernotationen Grundlegende Inlinenotation: ● ● Speicheroperanden: ● Angabe des Basisregisters in Klammern ● zusätzlich indirekte Speicherreferenzen möglich ● Synopsis des Speicheroperanden: [ displacement ] ( base register [, offset register [, scalar multiplier ] ] ) Notationsbeispiele: Intel mov mov int mov mov mov mov add lea sub eax,1 ebx,0ffh 80h ebx, eax eax,[ecx] eax,[ebx+3] eax,[ebx+20h] eax,[ebx+ecx*2h] eax,[ebx+ecx] eax,[ebx+ecx*4h-20h] AT&T movl $1,%eax movl $0xff,%ebx int $0x80 movl %eax, %ebx movl (%ecx),%eax movl 3(%ebx),%eax movl 0x20(%ebx),%eax addl (%ebx,%ecx,0x2),%eax leal (%ebx,%ecx),%eax subl -0x20(%ebx,%ecx,0x4),%eax Assemblernotationen Erweiterte Inlinenotation: ● Synopsis: asm ( assembler template [: output operands [: input operands [: list of clobbered registers ] ] ] ● ); Beispiel: int a=10, b; asm ( "movl %1, %%eax; movl %%eax, %0;" :"=r"(b) :"r"(a) :"%eax" /* output */ /* input */ /* clobbered register */ ); Assemblernotationen Erweiterte Inlinenotation: ● Semantik des Beispiels: ➔ Aus- bzw. Rückgabeoperand (b) durch %0 referenziert ➔ Eingabeoperand (a) durch %1 referenziert ➔ r → Zusicherung, dass der Operand in einem Register gehalten wird ➔ = → Modifizierer für Ausgabeoperanden (write-only) ➔ % → Prefix für Operanden, Registernamen werden %% vorangestellt ➔ ➔ ➔ vorgehaltene Register innerhalb des asm-Blocks, nur durch Operationen direkt referenziert, nicht anderweitig verwendet Operanden durchnummeriert beginnend mit 0 keine Angabe zu benutzten Registern → Vewendung durch Assembler entschieden Assemblernotationen Erweiterte Inlinenotation: ● ● ● Angabe benutzter Register: ➔ definiert Benutzung und Veränderung der Register ➔ Eingabe- sowie Ausgaberegister nicht gelistet ➔ Auflistung aller Register, die innerhalb anderer Operationen benutzt werden Nicht vorherzusagende Veränderung des Speichers: ➔ Anweisungen mit Speichermodifikationen ➔ Angabe des Schlüsselwortes memory in Liste benutzer Register Volatile Anweisungen: ➔ Anweisungen, die nicht durch Assembler verändert werden sollen; z.B. durch Optimierung ➔ in Verbindung mit Schlüsselwort memory in Liste benutzer Register ➔ Synopsis: asm volatile ( … : … : … : … ) __asm__ __volatile__ ( … : … : … : … )
© Copyright 2024 ExpyDoc