Systemprogrammierung (37-023) Assemblerprogrammierung Betriebssystemgrundlagen Maschinenmodelle Dozent: Prof. Thomas Stricker krankheitshalber vertreten durch: Felix Rauch WebSite: http://www.cs.inf.ethz.ch/37-023/ Begleit-/Textbuch: R. Paul: SPARC Architecture, Assembly Language Programming and C --- B. Kernigham, D. Richie: The C Programming Language Heute: Erste Schritte mit der SPARC-Assemblersprache 20.11.00-1 37-023 Systemprogrammierung Stricker Assembler-Programme Die Assemblersprache ist gemäss Definition eine Metasprache, welche zwischen einer höheren Programmiersprache und dem Maschinencode vermittelt. Compiler: Programm zur Übersetzung eines Programmes aus einer höheren Programmiersprache in eine Assemblersprache. Assembler: Programm zur Übersetzung eines Assemblerprogramms in eine Maschinensprache. Beispiel: C-Programm 30 main() 31 { 32 int a = 1; 33 int b = 2; 34 int c; 35 c = a + b; 36 printf( %d\n,c); 37 } 20.11.00-2 37-023 Systemprogrammierung Stricker Assembler-Code: 1.data 2 a:.word 1 3 b:.word 2 4 5 start:.text 6 set a, %r1 7 ld [%r1], %r1 8 set b, %r2 9 ld [%r2], %r2 10 add %r1, %r2, %r3 11 end: ta 0 Maschinen-Code (Binärdatei): ^A^C^A^K \234 ^C^P\202^P`^DÂ@^E^P\204^P Ä\200\206X@^B\221D ^Oÿ^Oÿ^D^C^N^D ^U^F@^X^F@^D^[^D!^D <%^E @-^E @4 @^H:^G@^HB @^HN Elementare Komponenten eines Assembler-Programmes Allgemeines: Assemblersprache ist zeilenbasiert Assemblersprache ist vom Prozessor abhängig Jedes Statement spezifiziert eine Instruktion (Anweisung) oder ein Datenelement Assembler-Programme sind i. A. schlecht lesbar Kommentare sind von grosser Bedeutung! ld [%r1], %r1! a -> r1 ld [% fp+ 96], %l0! y1 in %l0 /* auch C-style ist erlaubt */ 20.11.00-3 37-023 Systemprogrammierung Stricker 20.11.00-4 37-023 Systemprogrammierung Stricker
Organisation in Segmente Text: Programcode Data: Konstanten und vorgegebene Daten BSS: Block Storage Segment oder Block Started by Symbol: Speicherung dynamischer Daten und nicht initialisierter globaler Variablen. Text und Data-Segmente werden im Programm gespeichert, BSS ist dynamisch. Verwendung verschiedener Zahlensysteme. x:.word 23 y:.word 0x3fce Verarbeitung in der CPU jedoch immer binär. Anweisungen an den Assembler Labels <name>: Beispiel: start: Dienen zur Markierung bzw. Addressierung von Speicheradressen Dienen der Übersichtlichkeit des Programmes (erhöhen Lesbarkeit) Können Variablen darstellen (x:.word 42) Insbesondere im Kontext von Kontrollstrukturen und Subroutines Elementares Label ist die Startadresse des Programmes: _main 20.11.00-5 37-023 Systemprogrammierung Stricker 20.11.00-6 37-023 Systemprogrammierung Stricker Assembler Direktiven.<name>.data.word.global Geben Anweisungen an den Assembler Werden nicht von der CPU ausgeführt Sind als Pseudo-Operationen zu interpretieren Wählen aktuelles Segment aus (Text, Daten, BSS): Label in Datensegment: Variable Label in Textsegment: Sprungadresse Instruktionen <name> <operand1>,<operand2>,... add %r1, %r1, %r2 ld [%r1], %r2 Spezifizieren eine Anweisung, welche von der CPU decodiert und ausgeführt werden kann Operanden sind typischerweise Register oder Konstanten (vgl. Load/Store Architektur) Operanden können nicht direkt in Speicheradressen stehen. (vgl. fetch im v. Neumann Zyklus) Geben Variablengrösse an:.word.byte 20.11.00-7 37-023 Systemprogrammierung Stricker 20.11.00-8 37-023 Systemprogrammierung Stricker
Synthetische Instruktionen dienen der kompakteren Programmierung, werden jedoch in Folgen von elementaren Instruktionen zerlegt. clr regd or %r0, %r0, regd mov regs, regd or %r0, regs, regd dec regd sub regd, 1, regd set val, regd sethi %hi(val), regd or regd, %lo(val), regd Wobei val links eine volle 32 Bits Zahl ist und %hi() und %lo() Assemblerdirektiven sind, welche die oberen 22 respektive die unteren 13 Bits aus ihrem Argument extrahieren. set small, regd or %r0, small, regd Wobei small maximal eine 13 Bit grosse Zahl sein darf. 20.11.00-9 37-023 Systemprogrammierung Stricker SPARC Prozessoren: Übersicht Allgmeines: SPARC = Scalable Processor Architecture SPARC Prozessoren von der Firma Sun microsystems als Weiter-/Seitentwicklung der RISC I und II Architektur angeboten (RISC: Reduced Instruction Set Computer). Aktuell: UltraSPARC-III. Prozessor unterstützt nur wenige, einfache, dafür schnelle Befehle. Kompaktere Architektur und schnellere Programmausführung Sparc ist eine offene Architektur Vorlesung ist an V8 angelehnt (aktuell V9) Rechner in den Übungsräumen sind mit Sun UltraSPARC ausgerüstet 20.11.00-10 37-023 Systemprogrammierung Stricker Vorführungen und Übungen mit einem SPARC Simulator (tkisem) 32 Bit tiefe Register (Integer Unit bis 540 Register) Insgesamt 32 sichtbare Integer Register Signed Integer Wertebereich von -2 31 <= n < 2 31 Big Endian: Wortadresse = Adresse des MSB SPARC Assembler Besonderheit: Registernamen treten zweifach auf 20.11.00-11 37-023 Systemprogrammierung Stricker 20.11.00-12 37-023 Systemprogrammierung Stricker
Elementare Assembler-Direktiven.word x:.word 0x1f3 Generiert ein initialisiertes Wort im aktuellen Speichersegment. Wortgrösse bei SPARC 32 Bit.halfword x:.halfword 0x1f3 Generiert ein initialisiertes Halbwort im aktuellen Speichersegment. Grösse bei SPARC 16 Bit.byte x:.byte 0x1f Generiert ein initialisiertes Byte im aktuellen Speichersegment 8 Bit 20.11.00-13 37-023 Systemprogrammierung Stricker.text.text Deklariert das folgende Segment als Text und setzt den Adresszähler auf das folgende Byte..data.data Deklariert das folgende Segment als Data und setzt den Adresszähler auf das folgende Byte..ascii x:.ascii hello Generiert einen String von ASCII Zeichen. (.asciz beendet String zusätzlich mit 0-Byte)..global.global _main Markiert ein Symbol (Label) als global sichtbar.include.include gx.h Schliesst die folgende Datei mit ein. Sinnvoll bei Header-Dateien zur Definition von Variablen und Datenstrukturen. (Vgl. C-Anweisung: #include) 20.11.00-14 37-023 Systemprogrammierung Stricker Elementare Instruktionen Löschen einer Speicheradresse (synthetisch) clr [address] Kopieren von Register-Inhalten (synthetisch) mov register1, register2 Addition und Subtraktion add src_r1, src_r2, dst_r sub src_r1, src_r2, dst_r signed und unsigned Multiplikation smul src_r1, src_r2, dst_r umul src_r1, src_r2, dst_r Führt eine Multiplikation von zwei 32 Bit Zahlen durch. Die Operanden können dabei mit oder ohne Vorzeichen (Zweierkomplement) interpretiert werden. Das Ergebnis ist 64 Bit lang, die oberen 32 Bit (most significant bits) stehen im register %y (delayed write). signed und unsigned Division sdiv src_r1, src_r2, dst_r 20.11.00-15 37-023 Systemprogrammierung Stricker udiv src_r1, src_r2, dst_r Führt eine Division von zwei 32 Bit Zahlen durch. Die Operanden können dabei mit oder ohne Vorzeichen (Zweierkomplement) interpretiert werden. Operand 1 ist 64 lang, die oberen 32 Bit (most significant bits) stehen im register %y. Anmerkung: Erst ab SPARC V8 implementiert Null-Operation nop store Instruktion speichert Registerinhalt in Adresse st register, [address] load Instruktion lädt Speicherinhalt in Register ld [address], register Trap always ruft das Betriebssystem auf mit einem Request, der in register %g1 codiert ist. ta 0 20.11.00-16 37-023 Systemprogrammierung Stricker
Assembler-Programm 1.data 2 a2:.word 1 3 a1:.word 5 4 a0:.word 7 /* bsp6.s */ 5 x:.word 9 /* y=(x-a2)*(x-a1)/(x-a0) */ 6 y:.word 0 7 8.text 9 start: set x, %r1 10 ld [%r1], %r1 11 set a2, %r2 12 ld [%r2], %r2 13 set a1, %r3 14 ld [%r3], %r3 15 set a0, %r4 16 ld [%r4], %r4 17 set y, %r7 18 sub %r1, %r2, %r5 19 sub %r1, %r3, %r6 20 smul %r6, %r5, %r5 21 sub %r1, %r4, %r6 22 sdiv %r5, %r6, %r5 23! / (x - a0) 24 st %r5, [%r7] 25 end: ta 0 20.11.00-17 37-023 Systemprogrammierung Stricker Der SPARC Simulator TKISEM C++ Programm zur Simulation der SPARC Architektur (V8) Von University of New Mexico entwickelt Ist interaktiv bedienbar Erleichtert den Zugang zur Assemblersprache Gibt Einsicht in Register, Programmund Datenspeicher Eigenes Betriebssystem (ROM) Läuft unter UNIX Betriebssystem Ist mit einem Assembler und Linker ausgestattet Objektdatei erzeugen: isem-as bsp6.s -o bsp6.o Programm erzeugen: isem-ld bsp6.o -o bsp6 20.11.00-18 37-023 Systemprogrammierung Stricker Wesentliche Komponenten Load und Run button Step modus User und Supervisor Modi Statusregister User Text Breakpoints User Data Register Übersicht PC und NPC Y und Status-Register Set Register-Funktion Next Instruction Repräsentation im hexadezimal-format Beispiel: Multiplikation von 32 Bit Zahlen 1! 32 bit Multiplikation 2 3.data 4 a2:.word 0x0fffffff 5 a1:.word 0x0fffffff 6 7.text 8 start: set a1, %r1 9 ld [%r1], %r1 10 set a2, %r2 11 ld [%r2], %r2 12 smul %r1, %r2, %r3 13 end: ta 0 Bemerkung: %Y-Register muss bei Division getrennt initialisiert werden -> delayed write 20.11.00-19 37-023 Systemprogrammierung Stricker 20.11.00-20 37-023 Systemprogrammierung Stricker