lehrkraefte:blc:informatik:efi-2023:exam4

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

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.

Dump der Datenbank

Dump der Datenbank

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;

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        

Dump der Datenbank

Dump der Datenbank

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;
  • 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.
  • lehrkraefte/blc/informatik/efi-2023/exam4.txt
  • Last modified: 2024/04/30 08:58
  • by Ivo Blöchliger