; data in dx
print_hex:
    pusha

    mov cx, 0 ; index var

hex_loop:
    cmp cx, 4 ; loop 4 times
    je end

    ; 1) convert last char of 'dx' to ascii
    mov ax, dx ; ax is working register
    and ax, 0x000f ; 0x1234 -> 0x0004
    add al, 0x30 ; add 0x30 to N to convert it to ascii "n"
    cmp al, 0x39 ; if > 9, add extra 8 to represent a-f
    jle step2
    add al, 7 ; A is ascii 64 instead of 58, 65-58 = 7

step2:
    ; 2) get correct pos of string to place char
    ; bx <- base address + string length - index
    mov bx, HEX_OUT + 5
    sub bx, cx ; cx: index
    mov [bx], al ; copy ascii char on al to pos pointed by bx
    ror dx, 4 ; 1234 - 4123 - 3412 - 2341 - 1234

    add cx, 1
    jmp hex_loop

end:
    mov bx, HEX_OUT
    call print

    popa
    ret

HEX_OUT:
    db '0x0000', 0 ; reserve memory for string