Do give it a try.
To illustrate, here's a description of a case of mov instruction in x86 architecture. This is a transfer between register and register or register and memory in either direction. Note that I myself have only dealt with 8086 so my knowledge of modern expansions is limited.
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
1 0 0 0 1 0 d w| mod reg r/m | offset |
w is a bit that indicates the size of operands. If w = 0, the size is byte. In 16 bit architectures if w = 1, the size is word*.
reg is a value of 3 bits indicating which register is one of the operands. Depending on w, same number indicates different registers (0 could be al, ax or eax)
mod is a value of 2 bits indicating the type of the second operand.
r/m is a value of 3 bits indicating what is the second operand. If mod = 11, this is the same as reg. In other cases the second operand is memory. The address in memory is built from a sum of several registers and the offset**. Then r/m indicates what registers to add up and mod indicates how many bytes of offset there are (could be 0, 1 or 2). Also, there is a thing called a segment override prefix, which needs to be handled too.
d is a bit that indicates the direction. If d = 0, reg contains the source operand and if d = 1, the destination.
* In 32 bit architectures, normally if w = 1, size is double word, but, I think, if there is a prefix, the size can be word too. No idea what 64 bits do. Probably more prefixes.
** It was like that in 8086. More modern architectures have more complex rules.