BS Übung 02 (Stefan Bosse) [11.11.2024] |
Punkte: | Total | /2 | 1. | /2 | 2. | /2 | 3. | /2 | 4. | /2 |
Aufgabe 1. Welche Ressourcen sind zentral und aktiv aus der Sicht des Betriebssystems?
Aufgabe 2. Was ist der Unterschied zwischen System- und Anwenderprogrammen?
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.
In dieser Übung soll ein erster Einstieg in die C Programmierung einer VM erfolgen (Warm-up).
Es gibt nur folgende Elemente:
int
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.
Ein Instruktiosnwort besteht aus einem Operationscode und einem (optionalen) Operanden. Die Wortbreite ist 32 Bits.
8 24
┌―――――――――┬――――――――――――――――――┐
│ OpCode │ Operand │
└―――――――――┴――――――――――――――――――┘
31 23 0
Es gibt nur einen Akkumulator (Integer Datentyp). Alle Operationen arbeiten mit diesem einen Register.
Es gibt nur 0- oder 1-Operanden Befehle.
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))
ENCODEXX
Macros erzeugt, und mittels der DECODEXX
Makros wieder dekodiert. Die zu erstellende execute
Funktion muss das kodierte Instruktionsword dekodieren, ggfs. den Operanden extrahieren, und die Instruktion ausführen.int execute(unsigned int word)
geschehen, eine Ausführungsschleife gibt es hier noch nicht, sonder execute wird einzeln mit kodierten Instruktionen aufgerufen.
▸
ℙ
[] |
✗
≡
|
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