BS Übung 02 (Stefan Bosse) [11.11.2024]
Gruppe und Namen der Mitglieder
Punkte:Total/21./22./23./24./2

Einführung in Betriebssysteme

Aufgabe 1. Welche Ressourcen sind zentral und aktiv aus der Sicht des Betriebssystems?


Aufgabe 2. Was ist der Unterschied zwischen System- und Anwenderprogrammen?


C Programmierung

Hinweise

In dieser Übung wird ein eingebauter C-JS Transpiler verwendet. Die Ausführung der einzelnen Aufgaben wird unabhängig in einem eigen Kontext ausgeführt. jede teilaufgabe benötigt eine main Funktion! Es gibt nur eine C Stdlib Header Datei: clib.h. Diese muss immer eingebunden werden.

Eine einfache Virtuelle Maschine in C

In dieser Übung soll ein erster Einstieg in die C Programmierung einer VM erfolgen (Warm-up).

Es gibt nur folgende Elemente:

Die VM ist hier noch sehr einfach, und diese Übung beschäftigt sich mit dem Instruktionsdekoder und de Instruktionsuasführung. Noch gibt es kein zusammenhängendes Programm, das die VM ausführt, sondern nur einzelne Instruktionsausführungen.

Instruktionsformat

Ein Instruktiosnwort besteht aus einem Operationscode und einem (optionalen) Operanden. Die Wortbreite ist 32 Bits.

    8              24         
┌―――――――――┬――――――――――――――――――┐
│ OpCode  │     Operand      │
└―――――――――┴――――――――――――――――――┘
31        23                 0

Register

Es gibt nur einen Akkumulator (Integer Datentyp). Alle Operationen arbeiten mit diesem einen Register.

Instruktionen

Es gibt nur 0- oder 1-Operanden Befehle.

Instruktions Dekoder und Enkoder

Die Instruktionen werden mit Präprozessormakros kodiert oder dekodiert:

#define DECODEOPCODE(word)       (word>>24) 
#define DECODEOPERAND(word)      (word&65535) 
#define ENCODE0(opcode)          (opcode<<24) 
#define ENCODE(opcode,operand)   (opcode<<24 | (operand&65535)) 

Instruktionsausführung


Das erste Template der VM mit TODO

 ▸ 
 ℙ 
[]
 ✗ 
 ≡ 

Aufgabe 3. Implementiere die int execute(unsigned int word) Funktion und teste sie mit dem Programm: CONST 100 ; ADD 5 ; SUB 50 ; OUT ; END. Es muss der Wert 100+5-50 ausgegeben werden. Die execute Funktion besteht aus den drei Teilen: Dekodierung des Instruktionsopcodes, Ausführung der Instruktion in einer switch (opcode) { case NOP: .. break; usw. } Mehrfachauswahl. Bei Befehlen mit einem Operanden muss diese noch dekodiert werden. Alle Operationen laufen über den Akkumulator (s.o.), OUT gibt den Akkumulator aus (mit printf). Die Instruktionen werden durch sequenzielle Aufrufe von execute ausgeführt. Die Rückgabe muss geprüft werden und das Ende muss erkannt werden (bei Ende Rückkehr aus main mittels return 0).

I2luY2x1ZGUgImNsaWIuaCIKZW51bSBvcGNvZGVzIHsKICBOT1AsCiAgQ09OU1QsCiAgQURELAogIFNVQiwKICBNVUwsCiAgRElWLAogIENNUCwKICBPVVQsCiAgRU5ECn07CgppbnQgYWNjdTsKCiNkZWZpbmUgREVDT0RFT1BDT0RFKHdvcmQpICAgICAgICh3b3JkPj4yNCkgCiNkZWZpbmUgREVDT0RFT1BFUkFORCh3b3JkKSAgICAgICh3b3JkJjY1NTM1KSAKI2RlZmluZSBFTkNPREUwKG9wY29kZSkgICAgICAgICAgKG9wY29kZTw8MjQpIAojZGVmaW5lIEVOQ09ERShvcGNvZGUsb3BlcmFuZCkgICAob3Bjb2RlPDwyNCB8IChvcGVyYW5kJjY1NTM1KSkgCgp1bnNpZ25lZCBpbnQgcHJvZ3JhbSBbNF09ewogIEVOQ09ERTAoTk9QKSwKICBFTkNPREUwKE5PUCksCiAgRU5DT0RFKENPTlNULDExKSwKICBFTkNPREUoU1VCLDIpLAogIEVOQ09ERShDTVAsMiksCiAgRU5DT0RFMChFTkQpCn07CgppbnQgZXhlY3V0ZSh1bnNpZ25lZCBpbnQgd29yZCkgewogIGludCBvcGNvZGUgPSBERUNPREVPUENPREUod29yZCk7CiAgaW50IG9wZXJhbmQgPSBERUNPREVPUEVSQU5EKHdvcmQpOwogIHN3aXRjaCAob3Bjb2RlKSB7CiAgICBjYXNlIE5PUDogYnJlYWs7CiAgICBjYXNlIENPTlNUOiBhY2N1PW9wZXJhbmQ7IGJyZWFrOwogICAgY2FzZSBBREQ6IGFjY3U9YWNjdStvcGVyYW5kOyBicmVhazsKICAgIGNhc2UgU1VCOiBhY2N1PWFjY3Utb3BlcmFuZDsgYnJlYWs7CiAgICBjYXNlIE1VTDogYWNjdT1hY2N1Km9wZXJhbmQ7IGJyZWFrOwogICAgY2FzZSBESVY6IGFjY3U9YWNjdS9vcGVyYW5kOyBicmVhazsKICAgIGNhc2UgQ01QOiBpZiAoYWNjdTxvcGVyYW5kKSBhY2N1PS0xOwogICAgICAgICAgICAgIGVsc2UgaWYgKGFjY3U+b3BlcmFuZCkgYWNjdT0xOyAKICAgICAgICAgICAgICBlbHNlIGFjY3U9MDsgYnJlYWs7CiAgICBjYXNlIE9VVDogcHJpbnRmKCIlZFxuIixhY2N1KTsgYnJlYWs7CiAgICBjYXNlIEVORDogcmV0dXJuIDA7CiAgfQogIHJldHVybiAxOwp9CgppbnQgbWFpbigpIHsKICBpbnQgbmV4dDsKICBhY2N1PTA7CiAgbmV4dD1leGVjdXRlKEVOQ09ERShDT05TVCwxMDApKTsKICBpZiAobmV4dD09MCkgcmV0dXJuIDA7CiAgbmV4dD1leGVjdXRlKEVOQ09ERShBREQsNSkpOwogIGlmIChuZXh0PT0wKSByZXR1cm4gMDsKICBuZXh0PWV4ZWN1dGUoRU5DT0RFKFNVQiw1MCkpOwogIGlmIChuZXh0PT0wKSByZXR1cm4gMDsKICBuZXh0PWV4ZWN1dGUoRU5DT0RFMChPVVQpKTsKICBpZiAobmV4dD09MCkgcmV0dXJuIDA7CiAgbmV4dD1leGVjdXRlKEVOQ09ERTAoRU5EKSk7CiAgaWYgKG5leHQ9PTApIHJldHVybiAwOwogIHJldHVybiAtMTsKfQ==

Aufgabe 4. Erzeuge ein Programm was die Fakultät n! mit n=5 berechnet und das Ergebnis ausgibt. Nachdem n! berechnet und ausgegeben wurde soll das Ergebnis (im Akkumulator) mittels CMP(100) getestet werden und das Ergebnis (-1/0/1) ebenfalls ausgegeben werden. Ersetze dazu im obigen Template das erste Testprogramm mit diesem Programm.

ICBuZXh0PWV4ZWN1dGUoRU5DT0RFKENPTlNULDEpKTsKICBpZiAobmV4dD09MCkgcmV0dXJuIDA7CiAgbmV4dD1leGVjdXRlKEVOQ09ERShNVUwsMikpOwogIGlmIChuZXh0PT0wKSByZXR1cm4gMDsKICBuZXh0PWV4ZWN1dGUoRU5DT0RFKE1VTCwzKSk7CiAgaWYgKG5leHQ9PTApIHJldHVybiAwOwogIG5leHQ9ZXhlY3V0ZShFTkNPREUoTVVMLDQpKTsKICBpZiAobmV4dD09MCkgcmV0dXJuIDA7CiAgbmV4dD1leGVjdXRlKEVOQ09ERShNVUwsNSkpOwogIGlmIChuZXh0PT0wKSByZXR1cm4gMDsKICBuZXh0PWV4ZWN1dGUoRU5DT0RFMChPVVQpKTsKICBpZiAobmV4dD09MCkgcmV0dXJuIDA7CiAgbmV4dD1leGVjdXRlKEVOQ09ERShDTVAsMTAwKSk7CiAgaWYgKG5leHQ9PTApIHJldHVybiAwOwogIG5leHQ9ZXhlY3V0ZShFTkNPREUwKE9VVCkpOwogIGlmIChuZXh0PT0wKSByZXR1cm4gMDsKICBuZXh0PWV4ZWN1dGUoRU5DT0RFMChFTkQpKTsKICBpZiAobmV4dD09MCkgcmV0dXJuIDA7


Created by the NoteBook Compiler Ver. 1.32.3 (c) Dr. Stefan Bosse (Wed Nov 13 2024 13:31:11 GMT+0100 (Central European Standard Time))