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
dw Zeilen sind UTF-16LE codierte Zeichen, nullterminiert.
cd C:\Users\Guido\Desktop
nasm -f win64 hello_uefi.asm -o hello_uefi.obj
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.
USB STICK
└── EFI
└── BOOT
└── BOOTX64.EFI
BOOTX64.EFI hierhin kopieren.Nach dem Boot von USB sollte der Text „Hello GOP UEFI!“ auf dem Bildschirm erscheinen.
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: