16-bit FizzBuzz in x86 NASM assembly
Since we're doing this in assembly language, it makes sense to do it much more efficiently than is typically done in high level languages.  Otherwise, why bother with assembly language? So with that said, there are ways that this can be made much, much more efficient.
Avoid division
The div instruction in x86 is one of the slower instructions possible.  Since we already know that we're looking for numbers divisible by 3, 5 or both, what would make far more sense is to simple keep countdown counters for both.  Your initialization currently says:
    xor cx, cx

It could be easily expanded to say:
    xor cx, cx
    mov bx, 0503h  ; set bh = 5 counter, bl = 3 counter

Then instead of dividing, simply decrement:
    inc cx
    cmp cx, 100
    jg done
;  instead of this...
;    dec bh
;    dec bl
;    cmp bx, 0
; per suggestion from @Chris Jester-Young use this:
    sub bx, 0101h
    je print_fizzbuzz
    test bl, bl
    je print_fizz
    test bh, bh
    je print_buzz
print_other:

Naturally the various print_... routines would have to reset bh, bl or both as well as printing.
Improve formatting
Generally speaking, assembly language code is not indented in the way you have your code indented.  It's much more linear, with the only indentation for assembly language statements or directives.
Consider better I/O
Your output routines are not shown, but it's likely that it would be more efficient to keep the numeric output in string form, incrementing each ASCII digit and emitting the string, rather than repeatedly converting from binary register contents to a string value.