The first part of your question (why this is not an ADD instruction) and the second part (the *
) have the same answer. The instruction here is trying to use the registers to form an index. This allows indexed access to the memory and is extremely useful in accessing logical arrays defined in the memory.
Two important points - the multiplicand cannot be any arbitrary value, it has to be one of 1, 2, 4 or 8 - this limits the direct array access only to elements up to 64 bits (qword) size. Had it allowed 16 or 32, a direct memory array of xmmword or ymmword would have been possible. The immediate offset that can be used is restricted to a maximum of 32-bit long number even in native 64-bit code - though usually, that should not cause so much a problem.
The second point is that this addition happens significantly faster than usual instruction based additions - so an instruction sequence like
shl rbx,1
mov rax, qword ptr [rsi+rbx]
is significantly slower than
mov rax,qword ptr [rsi+2*rbx]