lehrkraefte:blc:informatik:efi-2023:exam4

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:efi-2023:exam4 [2024/04/26 09:51] Ivo Blöchligerlehrkraefte:blc:informatik:efi-2023:exam4 [2024/04/30 06:58] (current) – [Assembler] Ivo Blöchliger
Line 1: Line 1:
 +====== 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.
 +<code asm>
 +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
 +</code>
 +  * Folgende Information ist gegeben:
 +<WRAP info>
 +Die Ausgabe auf die drei 7-Segment Anzeigen erfolgt auf die Adressen 253 bis 255.
 +
 +Die Bits auf der Anzeige sind wie folgt nummeriert:
 +<code txt>
 ++--0--+
 +5     1
 +:--6--:
 +4     2
 ++--3--+
 +</code>
 +</WRAP>
 +  * 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'' ?
 +<code asm>
 +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
 +</code>
 +
 +
 +  * 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:
 +<code sql>
 +.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));
 +</code>
 +Die Tabellen sind mit folgendem Inhalt gefüllt:
 +<code txt>
 +sqlite> select * from user;
 +id  name      
 +--  ----------
 +1   vreni     
 +2   hans      
 +3   ueli      
 +4   margarethe
 +
 +sqlite> select * from score;
 +id  userid  zeit                 score
 +--  ------  -------------------  -----
 +1         2024-04-30 05:41:37  120  
 +2         2024-04-30 05:41:47  104  
 +3         2024-04-30 05:41:53  84   
 +4         2024-04-30 05:42:00  120  
 +5         2024-04-30 05:42:39  144  
 +6         2024-04-30 05:42:50  110  
 +
 +</code>
 +  * Was liefert folgende Abfrage? Kommentieren Sie die einzelnen Teil der Abfrage.
 +<code sql>
 +SELECT score.score,user.name FROM score,user WHERE score.userid=user.id ORDER BY score.score DESC, score.zeit ASC LIMIT 3;
 +</code>
 +
 +  * Geben Sie eine Anfrage an, die alle Scores mit Zeitstempel von ''margarethe'' in absteigender Reihenfolge ausgibt. 
 +
 +<hidden Dump der Datenbank>
 +Kann mit ''sqlite3 freifach.sqlite < freifach.dump'' (oder einfach copy-paste in sqlite) importiert werden.
 +<code sql 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;
 +</code>
 +</hidden>
 +
 +===== Freifächer =====
 +Folgendes Schema ist definiert:
 +<code sql>
 +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));
 +</code>
 +Folgende Daten sind eingetragen:
 +<code txt>
 +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                    
 +2                    
 +3                    
 +4                    
 +5                    
 +6                    
 +</code>
 +
 +<hidden Dump der Datenbank>
 +Kann mit ''sqlite3 freifach.sqlite < freifach.dump'' (oder einfach copy-paste in sqlite) importiert werden.
 +<code sql 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;
 +</code>
 +</hidden>
 +
 +  * Erklären Sie folgende Anfrage und deren Ausgabe:
 +<code txt>
 +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                        
 +</code>
 +
 +  * 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.
 +