6. Assemblerebene

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__ ( … : … : … : … )