MenuetOS The Assembly Language Programmers OS!


Home | Das Wiki | Screenshots | Dokumente | Downloads | Foren | Kontakt

Tutorials - Hello World

Als erstes kommt der Header-Bereich

1; Der Header
2use64; Compiler-Anweisung um 64Bit Instruktionen anzuwenden
3org 0x0; Die Basisadresse des Codes ist immer 0x0
4
5db 'MENUET64'; Header ID
6dq 0x1; Header Version
7dq START; Start der Ausführung
8dq image_end; Größe des Images
9dq 0x100000; zu benutzende Speichermenge
10dq 0xffff0; Esp - Stack Position im Speicherbereich
11dq 0x0; Parameter
12dq 0x0; Reserviert für Icon

Die ersten 12 Zeilen können bis auf weiteres immer so übernommen werden.
Die Werte sind dabei in den Kommentaren grob erläutert, was sie bedeuten und sind erstmal uninteressant.

In den folgenden 2 Zeilen passiert folgendes:
- in Zeile 14 ist der Startpunkt markiert, wie er in Zeile 7 angegeben worden ist.
- in Zeile 15 wird die "Funktion" draw_window aufgerufen.

14START:
15call draw_window; Als erstes soll das Fenster gezeichnet werden

Nachdem das Fenster gezeichnet wurde, sollte man eine Hauptschleife definieren, die Ereignisse abfragt und entsprechend weiterleitet.
- in Zeile 17 wird das Label "main_loop" festgelegt. - in Zeile 18 und 19

17main_loop:
18mov rax, 0xA; Warte auf Ereignis
19int 0x60
20; Ereignistyp wird in rax zurückgegeben
21test rax, 0x1; Fenster neuzeichnen?
22jnz window_event
23test rax, 0x4; wurde ein Button gedrückt?
24jnz button_event
25
26jmp main_loop

Wenn einfach nur das Fenster neu gezeichnet werden muss, dann wird die Funktion zum zeichnen aufgerufen und danach wird wieder in die Hauptschleife gesprungen

28window_event:
29call draw_window
30jmp main_loop

Wenn ein Button angeklickt wurde, muss zuerst abgefragt, werden, welche Button-Id angeklickt wurde

32button_event:
33mov rax, 0x11
34int 0x60
35
36; rax = status
37; rbx = button id
38
39cmp rbx, 0x10000001; Schließen-Button (Kreuz oben rechts)
40jne not_terminate_button
41mov rax, 0x200; Programm wird beendet
42int 0x60
43
44not_terminate_button:
45jmp main_loop

Das eigentlich erstellen und zeichnen des Fensters und dessen Inhalt

47draw_window:
48mov rax, 0xC; Einleitung des Fenster zeichnens
49mov rbx, 0x1; 1 - zeichnen starten
50int 0x60
51
52mov rax, 0x0; 0 - Fenster definieren und zeichnen
53mov rbx, 0x00000100000000B0; x Start & Größe
54mov rcx, 0x0000008000000050; y Start & Größe
55mov rdx, 0x0000000000FFFFFF; Typ & Rahmenfarbe
56mov r8, 0x0000000000000001; Zeichnen-Bits
57mov r9, window_label; 0 oder Fensterlabel
58int 0x60
59
60mov rax, 0x4; Text im Fenster anzeigen
61mov rbx, text; Textlabel
62mov rcx, 0x10; X-Position im Hexadezimalsystem
63mov rdx, 0x20; Y-Position im Hexadezimalsystem
64int 0x60
65
66mov rax, 0xC; Ende des Fenster zeichnens
67mov rbx, 0x2
68int 0x60
69
70ret

Am Ende kommt der Datenbereich

72; Datenbereich
73
74window_label:
75db 'Hello World', 0; Fensterbezeichnung
76
77text:
78db 'Hello World', 0; Der Text, der im Fenster angezeigt wird
79
80image_end: