Printing to the screen without a db

From OSDev.wiki
Revision as of 03:55, 11 November 2008 by osdev>Troy martin (added to Video category)
Jump to navigation Jump to search

NASM gives you the ability to create useful macros that have a calling convention similar to BASIC statements. Macros can be used for many purposes, and here one is used to emulate BASIC's PRINT statement.

Note: this macro is designed to be used in real mode only, since it uses BIOS functions.

print_string:      ; Null terminated string in SI.
    pusha          ; Push all registers
    mov ah, 0Eh    ; INT 10h teletype.

.loop:
    lodsb        ; Get byte from string.
    cmp al, 0    ; Null terminator reached?
    je .done     ; Yes, end printing.

    int 10h      ; No, print the character.
    jmp .loop    ; Loop!

.done:
    popa    ; Pop all registers.
    ret     ; Return.


%macro print 1+
    section .data    ; At the end of the binary.
%%string:
    db %1,0
    section .text    ; Back to where we were.

    mov si,%%string
    call print_string    ; Print it out using the print_string function.
%endmacro

Now you can use print as if it were a function or instruction in your OS like so (note, you don't want to use this in a bootloader, it messes with the data section and I don't know how to place the boot signature at the end of the data section and still pad out to 512 bytes):

print 'Printing without a db in NASM!',0Dh,0Ah    ; Print out a little message!

By the way, a little feature of NASM is the usage of the ` (back quote) character to contain a string that can use C-style escape codes like \n. It's nice and helpful.