BS Übung 04 (Stefan Bosse) [09.12.2024] |
Punkte: | Total | /2 | 1. | /2 | 2. | /2 | 3. | /2 | 4. | /2 | 5. | /2 |
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
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 tieferer Einstieg in die C Programmierung mit einer VM erfolgen.
Es gibt folgende Elemente:
int
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.
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]
.
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&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
ENCODEXX
Macros erzeugt, und mittels der DECODEXX
Makros wieder dekodiert. Die zu erstellende execute
Funktion muss das kodierte Instruktionsword dekodieren, den Operanden extrahieren, und die Instruktion ausführen.unsigned int program[]={ ... };
int execute(unsigned int word, int *pc)
geschehen, aufgerufen in einer Ausführungsschleife in der main Funktion.
▸
ℙ
[] |
✗
≡
|
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=