You cannot use a variable's value in an index expression. So mov dx,[bx + i] is invalid. See Volume 2, Section 2.1.5 on page 509 of the current Intel 64 and IA-32 Architectures Software Development Manual for valid addressing modes of the ModR/M byte (addressing modes) for 16-bit assembly.
That's where I'm confused, assembler does not give any severe error and assembles successfully. What happens instead of putting value of 'i' it puts address of i
Yes. That is the correct (but unwanted) behaviour. The addressing mode of this instruction is [BX]+disp16 = [BX + disp16] with mode 10111b (See in the table mentioned in the Instruction Manual). So here disp16 is the address of the variable and not its value. So the instruction is using the address as an index. There is no addressing mode for what you want to achieve. You'd have to put the index into a register first, and then use the appropriate addressing mode from the table.
So change the line
mov dx, [bx + i] ; this line is having problem
to
mov si, i ; i is a WORD variable
mov dx, [bx+si] ; correct addressing mode
This would generate one correct addressing mode [BX+SI] = 00000b and 010b for the register DX. And according to Figure 2.2 on page 508, the ModR/M byte would be
Mod 00......
R/M .....000
Reg ..010...
=== 00010000 = 10h