+; vi:ft=nasm:
+ bits 64
+ org 100000h
+ default rel
+
+ ; EFI_SYSTEM_TABLE offsets
+SIMPLE_TEXT_OUTPUT equ 64
+BOOT_SERVICES equ 80
+
+ ; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL function offsets
+TEXT_OUT_STRING equ 8
+TEXT_SET_ATTR equ 40
+TEXT_CLEAR_SCREEN equ 48
+
+ ; EFI_BOOT_SERVICES function offsets
+BOOT_GET_MEMORY_MAP equ 56
+BOOT_EXIT_BOOT_SERVICES equ 232
+
+
+start:
+ mov [efihandle], rcx
+ mov [systab], rdx
+
+ mov rax, [rdx + BOOT_SERVICES]
+ mov [bootsrv], rax
+ sub rsp, 32 ; leave space for shadow area
+ and rsp, 0xfffffffffffffff0 ; make sure sp is 16-byte aligned
+
+ mov rcx, [rdx + SIMPLE_TEXT_OUTPUT]
+ mov rdx, 0x0c
+ call [rcx + TEXT_SET_ATTR]
+
+ mov rax, [systab]
+ mov rcx, [rax + SIMPLE_TEXT_OUTPUT]
+ call [rcx + TEXT_CLEAR_SCREEN]
+
+ mov rax, [systab]
+ mov rcx, [rax + SIMPLE_TEXT_OUTPUT]
+ lea rdx, [str_hello]
+ call [rcx + TEXT_OUT_STRING]
+
+
+ mov rax, [systab]
+ mov rcx, [rax + SIMPLE_TEXT_OUTPUT]
+ mov rdx, 0x07
+ call [rcx + TEXT_SET_ATTR]
+
+ call get_rip
+ mov rdi, rax
+ call printhex64
+ call newline
+
+ ; retrieve memory map
+ ; args: RCX, RDX, R8, and R9.
+ lea rcx, [mmap_size]
+ lea rdx, [mmapbuf]
+ lea r8, [mmap_key]
+ lea r9, [mmap_descsz]
+ lea rax, [mmap_descver]
+ push rax
+ push rax
+ mov rax, [systab]
+ mov rbx, [rax + BOOT_SERVICES]
+ call [rbx + BOOT_GET_MEMORY_MAP]
+ add rsp, 16
+
+ mov rcx, [efihandle]
+ mov rdx, [mmap_key]
+ mov rax, [systab]
+ mov rbx, [rax + BOOT_SERVICES]
+ call [rbx + BOOT_EXIT_BOOT_SERVICES]
+
+.hang: jmp .hang
+
+get_rip:
+ mov rax, [rsp]
+ ret
+
+ ; expects number in rdi
+printhex64:
+ mov rcx, 16
+ lea rbx, [hexbuf]
+.loop: rol rdi, 4
+ mov rax, rdi
+ and rax, 0xf
+ lea rdx, [hexdig]
+ shl rax, 1
+ add rdx, rax
+ mov ax, [rdx]
+ mov [rbx], ax
+ add rbx, 2
+ dec rcx
+ jnz .loop
+ mov word [rbx], 0
+ lea rdi, [hexbuf]
+
+ ; expects string in rdi
+printstr:
+ mov rcx, [systab]
+ mov rcx, [rcx + SIMPLE_TEXT_OUTPUT]
+ mov rdx, rdi
+ sub rsp, 32
+ call [rcx + TEXT_OUT_STRING]
+ add rsp, 32
+ ret
+
+newline:
+ lea rdi, [str_hello + 18]
+ jmp printstr
+
+hexdig dw __utf16__ "0123456789abcdef"
+hexbuf: times 40 db 0
+
+ align 8
+efihandle dq 0
+systab dq 0
+bootsrv dq 0
+str_hello dw __utf16__(`qurashee!\r\n`),0
+
+ align 8
+; memory map data
+mmap_size dq 0
+mmap_key dq 0
+mmap_descsz dq 0
+mmap_descver dq 0
+
+ align 4096
+mmapbuf: times 4096 db 0