Assembler
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
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:
Bei jeder Berechnung werden die Flags Z (Zero) und C (Carry) gesetzt oder gelöscht, je nach Resultat der Berechnung.
Unicode
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
SELECT score.score,USER.name FROM score,USER WHERE score.userid=USER.id ORDER BY score.score DESC, score.zeit ASC LIMIT 3;
Kann mit sqlite3 freifach.sqlite < freifach.dump (oder einfach copy-paste in sqlite) importiert werden.
- highscore.dump
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.
- freifach.dump
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;
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.