Think of it this way. A single byte that is an opcode can possibly define only 256 different operations (maximum). The parameters to those opcodes could be absolute values, references to memory locations, references to registers, etc... Not counting that these absolutes/referenced-tos could be byte-sized, word-sized, etc...
One way this could be done is to make the parameters do some work to by saying "this parameter is an absolute/reference-to-absolute/reference-to-register/etc, of size byte/word/double-word/etc", and that's what the assembler tends to do (straight values, something like "@loc" and keyword references such as "eax", depending on the particular assembler). But in machine code on all but the simplest chips (that might have only <=256 instruction forms anyway[1]) from the early days you work with multi-byte opcodes which gives the microcode part of the chip the expectation that this to be a move into a register of an absolute value, or of a value from another register, or of a specific memory location... each of these by a different opcode, and many more available, despite being "mov <foo>, <bar>" in the 'human readable' assembler.
That's probably a badly compressed explanation. and is this Programming Help Thread (For Dummies) any more?
[1] I think I already mentioned that I have a conceptual language which needs just four different instructions. Even at the binary level, it's just two bits. (All params are references, no need to differentiate any further.) However, this isn't a 'real' chip's internal language, that I'm aware.