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

Speicherverwaltung

Aufgabe 1. Zu welcher Klasse gehört die unten beschriebene VM?


Aufgabe 2. Was ist der Unterschied zwischen Heap- und Stackspeicher (wo werden z.B. C Variablen abgelegt)?


Aufgabe 3. Wo sind die Speicherbereiche der Variablen vom nachfolgenden C Programm zu finden (Heap, Data, Stack)? Achtung bei Zeigern und ihren referenzierten Speicherobjekten.

int x=0;
void swap(int *a,int *b) {
  int t=*b;
  *b=*a;
  *a=t;
}
int main() {
  int y;
  int *xp;
  xp=(int*)malloc(sizeof(int));
  x=111;
  *xp=112;
  swap(&x,xp);
  y=*xp;
}
U3RhY2s6IHN3YXAuYSxzd2FwLmIsc3dhcC50LG1haW4ueSxtYWluLnhwCkRhdGE6IHgKSGVhcDogW21haW4ueHBd

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 richtige Virtuelle Maschine in C

In dieser Übung soll ein tieferer Einstieg in die C Programmierung mit einer VM erfolgen.

Es gibt folgende Elemente:

Instruktionsformat

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

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

In dieser Übung muss nun der Operand vorzeichenbehaftet sein (sonst kann der Instruktionssatz nicht vollständig implementiert werden). Dazu ist etwas Magie in der Dekodierung der Instruktionen erforderlich.

Register

Es gibt einen Akkumulator (Integer Datentyp) accu. Alle Operationen arbeiten mit diesem einen Register (d.h. erster Operand und Ergebnis). Weiterhin gibt es einen Programmzähler pc vom Datentyp int * und einen Registersatz int r[32].

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&0xFFFFFF) 
#define ENCODE0(opcode)          (opcode<<24) 
#define ENCODE(opcode,operand)   (opcode<<24 | (operand&0xFFFFFF)) 

DECODEOPERAND gibt einen vorzeichenlosen Wert zurück! Dieser muss noch durch eine Vorzeichenbiterweiterung zu einer richtigen Integer Zahl umgewandelt werden. Das kann durch nachfolgend exemplarischen Code erfolgen. Wenn der 24 Bit Wert negativ ist ist das 24. Bit eins, sonst Null. Das ist der Indikator. Lese Zweirkomplementdarstellung von Binärzahlen nach um diese "Magie" zu verstehen.

  int operandw = DECODEOPERAND(word);
  int operand;
  // Wir brauchen signed int, daher workaround
  if ((operandw & 0x800000)) operand=operandw-0x1000000;
  else operand=operandw; // Zweierkomplentlogik für 24 Bit

Instruktionsausführung


Das erste Template der VM mit TODO

 ▸ 
 ℙ 
[]
 ✗ 
 ≡ 

Aufgabe 4. Implementiere die int execute(unsigned int word, int*pc) 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 dieser noch dekodiert werden (kann auch am Anfang execute immer ausgeführt werden, 0-Op Befehle haben immer einen Operandenbereich 0). 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). Die Funktion muss nun weiterhin des pc ändern um im Programm fortzufahren.

I2luY2x1ZGUgImNsaWIuaCIKZW51bSBvcGNvZGVzIHsKICBOT1AsCiAgQ09OU1QsCiAgQURELAogIFNVQiwKICBNVUwsCiAgRElWLAogIEFERFIsCiAgU1VCUiwKICBNVUxSLAogIERJVlIsCiAgQ01QLAogIEpNUCwKICBKWiwKICBKTlosCiAgSkxULAogIEpHVCwKICBSRUFELAogIFdSSVRFLAogIE9VVCwKICBFTkQKfTsKCnR5cGVkZWYgZW51bSBvcGNvZGVzIG9wY29kZV90OwoKaW50IHBjOwppbnQgYWNjdTsKaW50IHJlZ1szMl07CgojZGVmaW5lIERFQ09ERU9QQ09ERSh3b3JkKSAgICAgICAod29yZD4+MjQpIAojZGVmaW5lIERFQ09ERU9QRVJBTkQod29yZCkgICAgICAod29yZCYweEZGRkZGRikgCiNkZWZpbmUgRU5DT0RFMChvcGNvZGUpICAgICAgICAgIChvcGNvZGU8PDI0KSAKI2RlZmluZSBFTkNPREUob3Bjb2RlLG9wZXJhbmQpICAgKG9wY29kZTw8MjQgfCAob3BlcmFuZCYweEZGRkZGRikpIAoKdW5zaWduZWQgaW50IHByb2dyYW0gW109ewogIEVOQ09ERShDT05TVCwxMDApLAogIEVOQ09ERShhZGQsNSksCiAgRU5DT0RFKFNVQiw1MCksCiAgRU5DT0RFMChPVVQpLAogIEVOQ09ERTAoRU5EKSAgCn07CgoKaW50IGV4ZWN1dGUodW5zaWduZWQgaW50IHdvcmQsIGludCAqcGMpIHsKICBpbnQgb3Bjb2RlID0gREVDT0RFT1BDT0RFKHdvcmQpOwogIGludCBvcGVyYW5kdyA9IERFQ09ERU9QRVJBTkQod29yZCk7CiAgaW50IG9wZXJhbmQ7CiAgLy8gV2lyIGJyYXVjaGVuIHNpZ25lZCBpbnQsIGRhaGVyIHdvcmthcm91bmQKICBpZiAoKG9wZXJhbmR3ICYgMHg4MDAwMDApKSBvcGVyYW5kPW9wZXJhbmR3LTB4MTAwMDAwMDsKICBlbHNlIG9wZXJhbmQ9b3BlcmFuZHc7IC8vIFp3ZWllcmtvbXBsZW50bG9naWsgZsO8ciAyNCBCaXQKCiAgcHJpbnRmKCJbJWRdIE9QPSV4IG9wZXJhbmQ9JWQgYWNjdT0lZFxuIiwqcGMsd29yZCxvcGVyYW5kLGFjY3UpOwogIHN3aXRjaCAob3Bjb2RlKSB7CiAgICBjYXNlIE5PUDogYnJlYWs7CiAgICBjYXNlIENPTlNUOiBhY2N1PW9wZXJhbmQ7IGJyZWFrOwogICAgY2FzZSBBREQ6IGFjY3U9YWNjdStvcGVyYW5kOyBicmVhazsKICAgIGNhc2UgU1VCOiBhY2N1PWFjY3Utb3BlcmFuZDsgYnJlYWs7CiAgICBjYXNlIE1VTDogYWNjdT1hY2N1Km9wZXJhbmQ7IGJyZWFrOwogICAgY2FzZSBESVY6IGFjY3U9YWNjdS9vcGVyYW5kOyBicmVhazsKICAgIGNhc2UgQUREUjogYWNjdT1hY2N1K3JlZ1tvcGVyYW5kXTsgYnJlYWs7CiAgICBjYXNlIFNVQlI6IGFjY3U9YWNjdS1yZWdbb3BlcmFuZF07IGJyZWFrOwogICAgY2FzZSBNVUxSOiBhY2N1PWFjY3UqcmVnW29wZXJhbmRdOyBicmVhazsKICAgIGNhc2UgRElWUjogYWNjdT1hY2N1L3JlZ1tvcGVyYW5kXTsgYnJlYWs7CiAgICBjYXNlIFJFQUQ6IGFjY3U9cmVnW29wZXJhbmRdOyBicmVhazsKICAgIGNhc2UgV1JJVEU6IHJlZ1tvcGVyYW5kXT1hY2N1OyBicmVhazsKICAgIGNhc2UgSk1QOiAqcGM9KnBjK29wZXJhbmQ7IHJldHVybiAxOyBicmVhazsKICAgIGNhc2UgSkdUOiBpZiAoYWNjdT4wKSAgIHsgKnBjPSpwYytvcGVyYW5kOyByZXR1cm4gMTsgfTsgYnJlYWs7CiAgICBjYXNlIEpMVDogaWYgKGFjY3U8MCkgICB7ICpwYz0qcGMrb3BlcmFuZDsgcmV0dXJuIDE7IH07IGJyZWFrOwogICAgY2FzZSBKWjogIGlmIChhY2N1PT0wKSAgeyAqcGM9KnBjK29wZXJhbmQ7IHJldHVybiAxOyB9OyBicmVhazsKICAgIGNhc2UgSk5aOiAgaWYgKGFjY3UhPTApIHsgKnBjPSpwYytvcGVyYW5kOyByZXR1cm4gMTsgfTsgYnJlYWs7CiAgICBjYXNlIENNUDogaWYgKGFjY3U8b3BlcmFuZCkgYWNjdT0tMTsKICAgICAgICAgICAgICBlbHNlIGlmIChhY2N1Pm9wZXJhbmQpIGFjY3U9MTsgCiAgICAgICAgICAgICAgZWxzZSBhY2N1PTA7IGJyZWFrOwogICAgY2FzZSBPVVQ6IHByaW50ZigiJWRcbiIsYWNjdSk7IGJyZWFrOwogICAgY2FzZSBFTkQ6IHJldHVybiAwOwogIH0KICAqcGM9KnBjKzE7CiAgcmV0dXJuIDE7Cn0KCmludCBtYWluKCkgewogIGludCBlbmQ9MDsKICB1bnNpZ25lZCBpbnQgd29yZDsKICBwYz0wOwogIHdoaWxlKCFlbmQpIHsKICAgIHdvcmQ9cHJvZ3JhbVtwY107CiAgICBpbnQgbmV4dD1leGVjdXRlKHdvcmQsJnBjKTsKICAgIGlmIChuZXh0PT0wKSBlbmQ9MTsKICB9CiAgcHJpbnRmKCJBQ0NVPSVkIHJlZ3M9WyVkLCVkXVxuIixhY2N1LHJlZ1swXSxyZWdbMV0pOwp9

Aufgabe 5. Erzeuge ein Programm was die Fakultät n! universell berechnet (n wird zu Anfang in das Register 0 geladen und dient auch als Zähler) und mit n=5 getestet wird. 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. Nachfolgend ein Pseudoprogramm.

r0=n
accu=1
while(r0>0) {
  accu=accu*r0
  r0=r0-1
}
I2luY2x1ZGUgImNsaWIuaCIKZW51bSBvcGNvZGVzIHsKICBOT1AsCiAgQ09OU1QsCiAgQURELAogIFNVQiwKICBNVUwsCiAgRElWLAogIEFERFIsCiAgU1VCUiwKICBNVUxSLAogIERJVlIsCiAgQ01QLAogIEpNUCwKICBKWiwKICBKTlosCiAgSkxULAogIEpHVCwKICBSRUFELAogIFdSSVRFLAogIE9VVCwKICBFTkQKfTsKCnR5cGVkZWYgZW51bSBvcGNvZGVzIG9wY29kZV90OwoKaW50IHBjOwppbnQgYWNjdTsKaW50IHJlZ1szMl07CgojZGVmaW5lIERFQ09ERU9QQ09ERSh3b3JkKSAgICAgICAod29yZD4+MjQpIAojZGVmaW5lIERFQ09ERU9QRVJBTkQod29yZCkgICAgICAod29yZCYweEZGRkZGRikgCiNkZWZpbmUgRU5DT0RFMChvcGNvZGUpICAgICAgICAgIChvcGNvZGU8PDI0KSAKI2RlZmluZSBFTkNPREUob3Bjb2RlLG9wZXJhbmQpICAgKG9wY29kZTw8MjQgfCAob3BlcmFuZCYweEZGRkZGRikpIAoKdW5zaWduZWQgaW50IHByb2dyYW0xIFtdPXsKICBFTkNPREUoQ09OU1QsNSksCiAgRU5DT0RFKFdSSVRFLDApLAogIEVOQ09ERShDT05TVCwxMSksCiAgRU5DT0RFKFNVQiw3KSwKICBFTkNPREUoQ01QLDUpLAogIEVOQ09ERShKR1QsMyksCiAgRU5DT0RFKENPTlNULDI0KSwgIAogIEVOQ09ERShKTVAsMiksCiAgRU5DT0RFKENPTlNULDQyKSwKICBFTkNPREUoV1JJVEUsMSksCiAgRU5DT0RFMChPVVQpLAogIEVOQ09ERTAoRU5EKSAgCn07Cgp1bnNpZ25lZCBpbnQgcHJvZ3JhbSBbXT17CiAgRU5DT0RFKENPTlNULDUpLCAgICAKICBFTkNPREUoV1JJVEUsMCksICAgIC8vIFIwPW4KICBFTkNPREUoQ09OU1QsMSksICAgIAogIEVOQ09ERShXUklURSwxKSwgICAgLy8gUjE9eQoKICBFTkNPREUoUkVBRCwxKSwKICBFTkNPREUoTVVMUiwwKSwKICBFTkNPREUoV1JJVEUsMSksCiAgRU5DT0RFKFJFQUQsMCksCiAgRU5DT0RFKFNVQiwxKSwKICBFTkNPREUoV1JJVEUsMCksCiAgRU5DT0RFKENNUCwxKSwKICBFTkNPREUoSk5aLC03KSwKCiAgRU5DT0RFKFJFQUQsMSksCiAgRU5DT0RFMChPVVQpLAoKICBFTkNPREUwKEVORCkgIAp9OwppbnQgZXhlY3V0ZSh1bnNpZ25lZCBpbnQgd29yZCwgaW50ICpwYykgewogIGludCBvcGNvZGUgPSBERUNPREVPUENPREUod29yZCk7CiAgaW50IG9wZXJhbmR3ID0gREVDT0RFT1BFUkFORCh3b3JkKTsKICBpbnQgb3BlcmFuZDsKICAvLyBXaXIgYnJhdWNoZW4gc2lnbmVkIGludCwgZGFoZXIgd29ya2Fyb3VuZAogIGlmICgob3BlcmFuZHcgJiAweDgwMDAwMCkpIG9wZXJhbmQ9b3BlcmFuZHctMHgxMDAwMDAwOwogIGVsc2Ugb3BlcmFuZD1vcGVyYW5kdzsgLy8gWndlaWVya29tcGxlbnRsb2dpayBmw7xyIDI0IEJpdAoKICBwcmludGYoIlslZF0gT1A9JXggb3BlcmFuZD0lZCBhY2N1PSVkXG4iLCpwYyx3b3JkLG9wZXJhbmQsYWNjdSk7CiAgc3dpdGNoIChvcGNvZGUpIHsKICAgIGNhc2UgTk9QOiBicmVhazsKICAgIGNhc2UgQ09OU1Q6IGFjY3U9b3BlcmFuZDsgYnJlYWs7CiAgICBjYXNlIEFERDogYWNjdT1hY2N1K29wZXJhbmQ7IGJyZWFrOwogICAgY2FzZSBTVUI6IGFjY3U9YWNjdS1vcGVyYW5kOyBicmVhazsKICAgIGNhc2UgTVVMOiBhY2N1PWFjY3Uqb3BlcmFuZDsgYnJlYWs7CiAgICBjYXNlIERJVjogYWNjdT1hY2N1L29wZXJhbmQ7IGJyZWFrOwogICAgY2FzZSBBRERSOiBhY2N1PWFjY3UrcmVnW29wZXJhbmRdOyBicmVhazsKICAgIGNhc2UgU1VCUjogYWNjdT1hY2N1LXJlZ1tvcGVyYW5kXTsgYnJlYWs7CiAgICBjYXNlIE1VTFI6IGFjY3U9YWNjdSpyZWdbb3BlcmFuZF07IGJyZWFrOwogICAgY2FzZSBESVZSOiBhY2N1PWFjY3UvcmVnW29wZXJhbmRdOyBicmVhazsKICAgIGNhc2UgUkVBRDogYWNjdT1yZWdbb3BlcmFuZF07IGJyZWFrOwogICAgY2FzZSBXUklURTogcmVnW29wZXJhbmRdPWFjY3U7IGJyZWFrOwogICAgY2FzZSBKTVA6ICpwYz0qcGMrb3BlcmFuZDsgcmV0dXJuIDE7IGJyZWFrOwogICAgY2FzZSBKR1Q6IGlmIChhY2N1PjApICAgeyAqcGM9KnBjK29wZXJhbmQ7IHJldHVybiAxOyB9OyBicmVhazsKICAgIGNhc2UgSkxUOiBpZiAoYWNjdTwwKSAgIHsgKnBjPSpwYytvcGVyYW5kOyByZXR1cm4gMTsgfTsgYnJlYWs7CiAgICBjYXNlIEpaOiAgaWYgKGFjY3U9PTApICB7ICpwYz0qcGMrb3BlcmFuZDsgcmV0dXJuIDE7IH07IGJyZWFrOwogICAgY2FzZSBKTlo6ICBpZiAoYWNjdSE9MCkgeyAqcGM9KnBjK29wZXJhbmQ7IHJldHVybiAxOyB9OyBicmVhazsKICAgIGNhc2UgQ01QOiBpZiAoYWNjdTxvcGVyYW5kKSBhY2N1PS0xOwogICAgICAgICAgICAgIGVsc2UgaWYgKGFjY3U+b3BlcmFuZCkgYWNjdT0xOyAKICAgICAgICAgICAgICBlbHNlIGFjY3U9MDsgYnJlYWs7CiAgICBjYXNlIE9VVDogcHJpbnRmKCIlZFxuIixhY2N1KTsgYnJlYWs7CiAgICBjYXNlIEVORDogcmV0dXJuIDA7CiAgfQogICpwYz0qcGMrMTsKICByZXR1cm4gMTsKfQoKaW50IG1haW4oKSB7CiAgaW50IGVuZD0wOwogIHVuc2lnbmVkIGludCB3b3JkOwogIHBjPTA7CiAgd2hpbGUoIWVuZCkgewogICAgd29yZD1wcm9ncmFtW3BjXTsKICAgIGludCBuZXh0PWV4ZWN1dGUod29yZCwmcGMpOwogICAgaWYgKG5leHQ9PTApIGVuZD0xOwogIH0KICBwcmludGYoIkFDQ1U9JWQgcmVncz1bJWQsJWRdXG4iLGFjY3UscmVnWzBdLHJlZ1sxXSk7Cn0=


Created by the NoteBook Compiler Ver. 1.32.5 (c) Dr. Stefan Bosse (Mon Dec 09 2024 08:35:04 GMT+0100 (Central European Standard Time))