====== Assembler ====== * Erklären Sie, was jeder einzelne der folgenden Befehle tut und was passieren würde, wenn man die Zeile ''POP A'' (befehl6) löschen würde. befehl1: MOV A, [42] befehl2: MOV A, 42 befehl3: CALL blabla befehl4: JMP befehl1 blabla: PUSH A befehl5: INC A befehl6: POP A befehl7: RET * Folgende Information ist gegeben: Die Ausgabe auf die drei 7-Segment Anzeigen erfolgt auf die Adressen 253 bis 255. Die Bits auf der Anzeige sind wie folgt nummeriert: +--0--+ 5 1 :--6--: 4 2 +--3--+ * Schreiben Sie eine Zeile Code, die die Ziffer 4 auf die erste der drei 7-Segment Anzeigen erscheinen lässt. * Erklären Sie, was folgendes Programm tut (0xe8 ist die Startadresse der Textausgabe). Insbesondere, was ist der Zweck der letzten Zeile ''DB 0'' ? start: MOV A, 0xe8 MOV B, hello loop: MOV C, [B] CMP C,0 JZ ende ; JUMP if Zero MOV [A], C INC A INC B JMP loop ende: HLT hello: DB "Hallo" DB 0 * Erklären Sie Sinn und Zweck der folgenden Registern: * IP (Instruction Pointer), wird oft auf PC (Programm Counter) genannt. * SP (Stack Pointer) * allgemeine Verwendung * speziell im Zusammenhang mit den Instruktionen ''CALL'' und ''RET'' * Bei jeder Berechnung werden die Flags Z (Zero) und C (Carry) gesetzt oder gelöscht, je nach Resultat der Berechnung. * Welche «Befehlsfamilie» nutzt diese Flags und welchem Programmierbefehl entspricht das am ehesten in Python? * Was genau macht der Befehl ''CMP'' mit den beiden Operanden? ====== Unicode ====== * Was ist Unicode? * Was sind die konzeptuellen Unterschiede zwischen Unicode und UTF-8? * Was ist der Vorteil von der Verwendung von Start- und Folgebytes? ====== SQL ====== ===== Highscores ===== Gegeben ist eine sqlite-Datenbank mit folgenden Schema: .schema CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL); CREATE TABLE score (id INTEGER PRIMARY KEY AUTOINCREMENT, userid INT NOT NULL, zeit TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, score INT, FOREIGN KEY(userid) REFERENCES USER(id)); Die Tabellen sind mit folgendem Inhalt gefüllt: sqlite> select * from user; id name -- ---------- 1 vreni 2 hans 3 ueli 4 margarethe sqlite> select * from score; id userid zeit score -- ------ ------------------- ----- 1 1 2024-04-30 05:41:37 120 2 3 2024-04-30 05:41:47 104 3 4 2024-04-30 05:41:53 84 4 2 2024-04-30 05:42:00 120 5 4 2024-04-30 05:42:39 144 6 2 2024-04-30 05:42:50 110 * Was liefert folgende Abfrage? Kommentieren Sie die einzelnen Teil der Abfrage. SELECT score.score,user.name FROM score,user WHERE score.userid=user.id ORDER BY score.score DESC, score.zeit ASC LIMIT 3; * Geben Sie eine Anfrage an, die alle Scores mit Zeitstempel von ''margarethe'' in absteigender Reihenfolge ausgibt. Kann mit ''sqlite3 freifach.sqlite < freifach.dump'' (oder einfach copy-paste in sqlite) importiert werden. PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE user (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL); INSERT INTO user VALUES(1,'vreni'); INSERT INTO user VALUES(2,'hans'); INSERT INTO user VALUES(3,'ueli'); INSERT INTO user VALUES(4,'margarethe'); CREATE TABLE score (id INTEGER PRIMARY KEY AUTOINCREMENT, userid INT NOT NULL, zeit TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, score INT, FOREIGN KEY(userid) REFERENCES USER(id)); INSERT INTO score VALUES(1,1,'2024-04-30 05:41:37',120); INSERT INTO score VALUES(2,3,'2024-04-30 05:41:47',104); INSERT INTO score VALUES(3,4,'2024-04-30 05:41:53',84); INSERT INTO score VALUES(4,2,'2024-04-30 05:42:00',120); INSERT INTO score VALUES(5,4,'2024-04-30 05:42:39',144); INSERT INTO score VALUES(6,2,'2024-04-30 05:42:50',110); DELETE FROM sqlite_sequence; INSERT INTO sqlite_sequence VALUES('user',4); INSERT INTO sqlite_sequence VALUES('score',6); COMMIT; ===== Freifächer ===== Folgendes Schema ist definiert: CREATE TABLE student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL); CREATE TABLE freifach (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL); CREATE TABLE wahl (id INTEGER PRIMARY KEY AUTOINCREMENT, freifachid INTEGER NOT NULL, studentid INTEGER NOT NULL, FOREIGN KEY(freifachid) REFERENCES freifach(id), FOREIGN KEY(studentid) REFERENCES student(id)); Folgende Daten sind eingetragen: sqlite> select * from student; id name -- ---------- 1 vreni 2 hans 3 ueli 4 margarethe sqlite> select * from freifach; id name -- ---------- 1 python 2 javascript 3 sql sqlite> select * from wahl; id freifachid studentid -- ---------- --------- 1 1 1 2 1 3 3 2 3 4 1 4 5 2 4 6 3 4 Kann mit ''sqlite3 freifach.sqlite < freifach.dump'' (oder einfach copy-paste in sqlite) importiert werden. PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL); INSERT INTO student VALUES(1,'vreni'); INSERT INTO student VALUES(2,'hans'); INSERT INTO student VALUES(3,'ueli'); INSERT INTO student VALUES(4,'margarethe'); CREATE TABLE freifach (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL); INSERT INTO freifach VALUES(1,'python'); INSERT INTO freifach VALUES(2,'javascript'); INSERT INTO freifach VALUES(3,'sql'); CREATE TABLE wahl (id INTEGER PRIMARY KEY AUTOINCREMENT, freifachid INTEGER NOT NULL, studentid INTEGER NOT NULL, FOREIGN KEY(freifachid) REFERENCES freifach(id), FOREIGN KEY(studentid) REFERENCES student(id)); INSERT INTO wahl VALUES(1,1,1); INSERT INTO wahl VALUES(2,1,3); INSERT INTO wahl VALUES(3,2,3); INSERT INTO wahl VALUES(4,1,4); INSERT INTO wahl VALUES(5,2,4); INSERT INTO wahl VALUES(6,3,4); DELETE FROM sqlite_sequence; INSERT INTO sqlite_sequence VALUES('student',4); INSERT INTO sqlite_sequence VALUES('freifach',3); INSERT INTO sqlite_sequence VALUES('wahl',6); COMMIT; * Erklären Sie folgende Anfrage und deren Ausgabe: sqlite> select freifach.name, count(freifachid) from wahl,freifach where freifach.id=wahl.freifachid group by freifachid; name count(freifachid) ---------- ----------------- python 3 javascript 2 sql 1 * Schreiben Sie eine Abfrage, die die Namen aller Freifächer auflistet, die von ''ueli'' gewählt wurden. * Erklären Sie, warum eine dritte Tabelle ''wahl'' nötig ist, insbesondere warum diese Information nicht sinnvoll in den Tabellen ''student'' und ''freifach'' gespeichert werden kann.