I don't know why that wouldn't work - looks okay to me. You might try:
...
mov al, 'B'
mov ah, 7 ; white-on black "attribute" (color)
mov [es:di], ax ; write both character and attribute
...
Hmmm, wait - you've got "es:[di]". Nasm wants the segment inside the "[]"s, too - other assemblers like it outside. Could that be your only problem? I don't think Nasm will assemble that, as posted - "invalid combination of opcode and operands"...
If that doesn't work, there's another possibility - it may be that "fake dos", as provided by certain Windows versions, starts screen memory at some other address than 0B800:0000. There's a "query video information" interrupt that returns the "regeneration buffer" (what I usually call "screen memory") as one of its fields. I'd have to look up how to use it. I don't think you should have to do that... Try just moving the "es:" inside the "[]"s first...
Best,
Frank