Printing to the screen without a db

From OSDev Wiki
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.

See Also