I've been learning x86 and x86_64 to write an assembler myself. If you aren't going to write an assembler yourself then some of what I will tell is pretty much useless. I don't know about MIPS myself though.
x86 indirect addressing is a complex thing. In a single instruction, you can do these:
mov reg, [reg+offset]
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8.
Their instruction encoding is complex because of this, but it's consistent for every instruction that encodes this way. You might be wanting to read this from sandpile.org. If you want to know more about encoding, you can always ask about it from me. Another instruction encoding related annoying detail are the prefixes. They change the meaning of the instruction a lot. For instance, 0x66 (if I remember right) in front and some instructions become for 16bit GPRs instead of 32bit ones.
32bit GPRs(in order): eax, ecx, edx, ebx, esp, ebp, esi, edi
64bit GPRs: rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15
Notice how few general purpose registers there are, this will force most software to use it more or less in a stack-machine mannered way. A painful detail. rsp is used for the stack (pop, push -instructions), and rbp tends to be reserved as well. x86_64 has more registers, but it'll take time when people will adopt it, even if every single of consumers had a processor capable to it.
There's two different instruction sets for floating point arithmetic. XMM being the newer. In x86_64 there's 16 128bit registers available and in x86 there's only 8 of them. The older instruction set handles registers as a stack. You just don't have swap, nip or rot, so working with it is mind-bending.
In use x86 tends to reduce into a RISC machine. Some of those complex instructions do not give benefits or are even slower on newer machines. You will do with understanding about 30-150 instructions depending about what you are reading or writing. You can also completely ignore some old instructions and AL/HL -stuff. Keep in mind this all clutter origins behind 1978, which is quite surprising it's not worse, 31 years from that and 24 years from first introduction of IA-32. Lots of things change their relevance in that time.
Direct jumps and calls seem to be relative from the next instruction in x86. Therefore:
jmp nowhere # or call, jz, jg whatever...
nowhere:
nop
Ends up encoded to 'JMP imm:0, NOP'. The register-indirect jmp that does do absolute jumps. It's also good to notice there aren't register-indirect conditional jumps, it bothered me too.
Here's not everything possible you should know but first stuff that comes into my mind from your question. But perhaps you can get along with these for now.