Steve Woods' post gave me the impression he thinks & is a dereference operator. & is C's reference operator. * is C's dereference operator. The OP has a valid concern. [] can seem to function as both depending on the context. It is neither a dereference or reference operator. It is the "This is a memory address!!!" operator.
https://nasm.us/doc/nasmdoc3.html#section-3.3
An effective address is any operand to an instruction which references memory. Effective addresses, in NASM, have a very simple syntax: they consist of an expression evaluating to the desired address, enclosed in square brackets.
; assume wordvar was used as a label, and the linker gave it address 6291668
; or mostly equivalently, you used wordvar equ 6291668
mov eax,wordvar ; eax = 6291668. Move value 6291668 to eax.
mov eax,[wordvar] ; eax = 12. Move contents of address 6291668 to eax.
mov eax,13
; mov wordvar,eax ; Move eax to value 6291668. syntax error.
mov [wordvar],eax ; mem(6291668) = 13. Move eax to address 6291668.
When an operand is a memory address, it has to be enclosed in square brackets to tell nasm that is the case. It's not dereferencing it, it's just letting nasm know what's up. If it was equivalent to the dereference operator,
mov [wordvar], eax
would set memory location 12 to 13.
It's not the dereference operator. It's the "this is a memory address" operator. This appears to be both dereferencing and referencing in different cases because x86 and x86_64 instructions behave differently based on whether its operands are memory locations or values. I am teaching myself assembly and I had to explain this to figure it out myself.