--- title: Hence version: 1.0.0 theme: uncover class: - invert marp: true size: 4K --- # Hence Ein Ausflug in die Welt einer virtuellen CPU _Dominic Grimm_ ![bg left](./assets/brian-kostiuk-S4jSvcHYcOs-unsplash.jpg) --- # Inhalt - Was ist eine CPU? - Überblick Assembler - Hence - (Hence-)Forth => _Workshop_ --- # Was ist eine CPU? - Herzstück eines Computers - Kleiner Chip auf Hauptplatine - Verarbeitung Arithmetik und Logik - Zugriff auf Speicher und Peripherie ![bg right](./assets/harrison-broadbent-VOz0gV9HC0I-unsplash.jpg) --- ## Aufbau ![bg right:35% fit](./assets/was-ist-cpu-darstellung.png) - _Steuerwerk, Rechenwerk, Cache, Register_ - Cache: schneller Speicher für oft benötigte Daten - CPU kommuniziert über Bus-Systeme - Leistung abhängig von Kernzahl, Taktfrequenz, Cache und Architektur --- ## Machine code - Niedrigste Ebene der Programmierung. - Binäre Instruktionen, direkt von der CPU ausgeführt - Jede CPU-Architektur hat ihre eigene Maschinensprache, die spezifisch für diese Architektur ist - Sehr effizient, da direkt von CPU ausgeführt - Meist in höherer Programmiersprache geschrieben => _Assembler_ --- ### Beispiel _hexadezimal kodiert (`hexdump`)_ ``` 00000000 03 7f fc 86 03 a0 00 06 00 06 03 c0 02 8b 06 00 |................| 00000010 05 03 c0 01 8c 04 00 06 8c 03 00 01 06 00 05 03 |................| * ``` | Code | Opcode | Argument | | ---------- | -------------- | ---------------- | | `03 7f fc` | `0x03` (`ts`) | `0x7ffc` (32764) | | `86` | `0x06` (`tlr`) | | | `03 a0 00` | `0x03` (`ts`) | `0xa000` (40960) | --- # Überblick Assembler ![width:30cm](./assets/assembler.png) --- # Hence - Virtuelle "CPU" (eher SBC) - Single core - 16-bit Architektur => **_maximal 64kb Speicher_** --- ## Assembly ```assembly .include "$lib/core.asm" .include "$lib/std.asm" .include "$lib/main.asm" data: ; ... .jump_main main: .main main ts 40 ; tmp = 40 tlr CORE_REG_A ; reg_a = 40 ts 2 ; tmp = 2 tlr CORE_REG_B ; reg_a = 40 ; reg_b = 2 ts CORE_ALU_ADD ; tmp = 6 ; reg_a = 40 ; reg_b = 2 alu ; tmp = 42 tls ; stack = [42] dbg ; => DEBUG: [42] pop ; stack = [] .std_stop ```