In addition to what "the_mart" mentions, there's a subtler problem which might trouble you, though probably not. Bios int 10h/0Eh might print to the "video page" in bh (you want zero). My video bios apparently doesn't care what's in bh or bl, but bh is "supposed" to be the video page, and bl might control the color (I've heard of this, but never seen it). I do "mov bx, 7" for that interrupt, "just to be sure". If this is a problem, you'll need to use a different register to point to your string. If you used si (di is about the only other possibility), you could use "lodsb", a one-byte instruction which does:
mov al, [si] ; note that this is implicitly [ds:si], ds still needs to be right!
inc si
Strictly speaking, it could decrement si instead, if the "direction flag" were set. This isn't likely in a bootsector, but to be sure... "cld". The "direction flag" is "up" if it's clear, and "down" if it's set - affects the "string instructions". If "lodsb" seems confusing, just use si exactly like you've done with bx.
That probably isn't your problem anyway (but might be, on "some" machine). Far more common is what "the_mart" describes - a failure to get your "org" and your "ds" synchonized. If you write "org 0", or no "org" at all (Nasm defaults to "org 0" in "-f bin mode), you can still get a perfectly good bootsector out of it... if you put 7C0h in ds. More common (it seems) is to write "org 7C00h" and put zero in ds (and perhaps other segment registers). Either combination, 0000:7C00 or 07C0:0000 address the same memory location - other combinations would, too, but don't make much sense. (this "segmented addressing" is a little weird, until you get used to it!).
If one of those ideas doesn't fix it, let us know!
Best,
Frank