bits 16 ; mode 16bits org 0x7C00 ; mbr ae loaded at 0x7C00 jmp boot display_enable: push bp mov bp, sp mov ah, 0h ; 00h Set Video Mode mov al, 07h ; Txt, monochrome, 80x25 int 10h mov sp, bp pop bp ret print: push bp mov bp, sp mov si, [bp + 4]; put first function arg in si. sp is stask pointer .loop: lodsb ; load si content into al then inc si cmp al, 0; je .end mov ah, 0eh mov bx, 0 int 10h jmp .loop .end: mov sp, bp pop bp ret println: push bp mov bp, sp push word [bp + 4] call print add sp, 2 mov ah, 03h ; read cursor position int 10h ; row number in dh. Col in dl inc dh ; goto next line mov dl, 0 mov ah, 02h ; Set Cursor Position int 10h mov sp, bp pop bp ret hello db 'Hello world', 0 name db 'This is a name', 0 boot: sti ; enable virtual interupts call display_enable push hello call println add sp, 2 push name call println add sp, 2 times 510 - ($ - $$) db 0 ; fill up to 510 with 0 dw 0xAA55 ; MBR magic number