UEFI Hello World mit NASM auf Windows 11 (Dell OptiPlex 7060)

Inhaltsverzeichnis

1. Voraussetzungen

2. NASM Code erstellen

Speichere den folgenden Code als hello_uefi.asm:

bits 64
default rel

global efi_main

section .text

efi_main:
    ; rdx = SystemTable
    mov rbx,rdx

    mov  r8,[rdx + 64]       ; ConOut
    mov  rax,[r8 + 8]        ; OutputString
    mov  rcx,r8
    lea  rdx,[rel message]
    call rax

    xor  rax, rax
    ret

section .data
message:
        dw 'H','e','l','l','o',' ','G','O','P',' ','U','E','F','I','!',0
Die dw Zeilen sind UTF-16LE codierte Zeichen, nullterminiert.

3. NASM kompilieren

cd C:\Users\Guido\Desktop
nasm -f win64 hello_uefi.asm -o hello_uefi.obj

4. Linken mit Visual Studio

link hello_uefi.obj /subsystem:efi_application /entry:efi_main /out:BOOTX64.EFI
/subsystem:efi_application sagt dem Linker, dass es eine UEFI-Applikation ist.
/entry:efi_main definiert den EntryPoint.
/out:BOOTX64.EFI ist der Name der ausführbaren EFI-Datei.

5. USB-Stick vorbereiten

  1. FAT32 formatieren.
  2. Ordnerstruktur erstellen:
  3. USB STICK
    └── EFI
        └── BOOT
            └── BOOTX64.EFI
  4. Datei BOOTX64.EFI hierhin kopieren.

6. BIOS / UEFI Einstellungen (Dell OptiPlex 7060)

7. Testen

Nach dem Boot von USB sollte der Text „Hello GOP UEFI!“ auf dem Bildschirm erscheinen.

Wenn schwarz bleibt:
- FAT32 + Ordnerstruktur prüfen
- Secure Boot wirklich deaktiviert
- USB Eintrag muss UEFI sein, nicht Legacy

8. Hinweise

Code Beispiel 1: Textausgabe in verschiedenen Farben und Positionen

BITS 64
GLOBAL efi_main

section .text
efi_main:
    ; Stack alignment
    sub     rsp,20h
    mov     rsi,rdx                  ; SystemTable

    ; ConOut = SystemTable->ConOut
    mov     rbx,[rsi + 0x40]         ; ConOut

    ; clear screen
    mov     rcx,rbx
    mov     rax,[rbx + 0x30]         ; ClearScreen
    call    rax

    ; Text1 gelb auf blau, Cursor(10,5)
    mov     rcx,rbx
    mov     edx,10
    mov     r8d,5
    mov     rax,[rbx + 0x38]         ; SetCursorPosition
    call    rax

    mov     rcx,rbx
    lea     rdx,[rel text1]
    mov     rax,[rbx + 0x08]         ; OutputString
    call    rax

    ; Text2 grün auf schwarz, Cursor(10,7)
    mov     rcx,rbx
    mov     edx,0x0A                 ; FG=LightGreen
    mov     rax,[rbx + 0x28]         ; SetAttribute
    call    rax

    mov     rcx,rbx
    mov     edx,10
    mov     r8d,7
    mov     rax,[rbx + 0x38]         ; SetCursorPosition
    call    rax

    mov     rcx,rbx
    lea     rdx,[rel text2]
    mov     rax,[rbx + 0x08]         ; OutputString
    call    rax
	
	
    ; Text3 grün auf schwarz, Cursor(10,9)
    mov     rcx,rbx
    mov     edx,0x03                 ; FG=LightGreen
    mov     rax,[rbx + 0x28]         ; SetAttribute
    call    rax

    mov     rcx,rbx
    mov     edx,10
    mov     r8d,9
    mov     rax,[rbx + 0x38]         ; SetCursorPosition
    call    rax

    mov     rcx,rbx
    lea     rdx,[rel text3]
    mov     rax,[rbx + 0x08]         ; OutputString
    call    rax
	
    ; Text4 grün auf schwarz, Cursor(8,12)
    mov     rcx,rbx
    mov     edx,0x36                 ; FG=LightGreen
    mov     rax,[rbx + 0x28]         ; SetAttribute
    call    rax

    mov     rcx,rbx
    mov     edx,8
    mov     r8d,12
    mov     rax,[rbx + 0x38]         ; SetCursorPosition
    call    rax

    mov     rcx,rbx
    lea     rdx,[rel text4]
    mov     rax,[rbx + 0x08]         ; OutputString
    call    rax

    ; Pause über einfache Schleife
pause_6s:
    ; Register sichern
    push    rcx
    push    rdx

    mov     rcx,9000                 ; äußere Schleife
.outer:
    mov     rdx,6000000              ; innere Schleife
.inner:
    dec     rdx
    jnz    .inner
    dec     rcx
    jnz    .outer

    ; Register wiederherstellen
    pop     rdx
    pop     rcx

    ; Farbe zurück auf weiß/schwarz
    mov     rbx,[rsi + 0x40]         ; ConOut
    mov     rcx,rbx
    mov     edx,0x07                 ; FG=White, BG=Black
    mov     rax,[rbx + 0x28]         ; SetAttribute
    call    rax

    ; EFI_SUCCESS return
    add     rsp,20h
    mov     eax,0
    ret

section .data
text1:  dw 'H','a','l','l','o',' ','U','E','F','I','!',0
text2:  dw 'A','s','s','e','m','b','l','e','r',' ','B','e','i','s','p','i','e','l',0
text3:  dw 'U','E','F','I',' ','S','c','r','e','e','n',' ','T','e','x','t',0
text4:  dw 'B','u','s','y',' ','W','a','i','t',' ','D','e','m','o',0

keybuf:
    dw 0       ; ScanCode
    dw 0       ; UnicodeChar

Hier sind einige nützliche Downloads und Links, die dir bei der Arbeit mit UEFI und NASM helfen können: