[bits 32]
; Define some constants
VIDEO_MEMORY equ 0xb8000
WHITE_ON_BLACK equ 0x0f

; prints a null - terminated string pointed to by EDX
print_string_pm:
    pusha
    mov edx, VIDEO_MEMORY ; Set edx to the start of vid mem.

print_string_pm_loop:
    mov al, [ ebx ] ; Store the char at EBX in AL
    mov ah, WHITE_ON_BLACK ; Store the attributes in AH
    cmp al, 0 ; if ( al == 0) , at end of string , so
    je print_string_pm_done ; jump to done
    mov [ edx ], ax ; Store char and attributes at current
    ; character cell.
    add ebx, 1 ; Increment EBX to the next char in string.
    add edx, 2 ; Move to next character cell in vid mem.
    jmp print_string_pm_loop ; loop around to print the next char.

print_string_pm_done:
    popa
    ret ; Return from the function