====== 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.