Я учил x86 и x86_64 писать ассемблер самостоятельно. Если вы не собираетесь писать ассемблер самостоятельно, то кое-что из того, что я расскажу, в значительной степени бесполезно. Я сам не знаю о MIPS.
x86 косвенная адресация - сложная вещь. В одной инструкции вы можете сделать это:
mov reg, [reg+offset]
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8.
Из-за этого их кодирование команд является сложным, но оно согласованно для каждой инструкции, кодирующей этот способ. Возможно, вы захотите прочитать это по адресу sandpile.org . Если вы хотите узнать больше о кодировании, вы всегда можете спросить об этом у меня. Другой инструкцией, кодирующей связанные раздражающие детали, являются префиксы. Они сильно меняют смысл инструкции. Например, 0x66 (если я правильно помню) впереди и некоторые инструкции делаются для 16-битных GPR вместо 32-битных.
32-битные GPR (по порядку): eax, ecx, edx, ebx, esp, ebp, esi, edi
64-битные GPR: rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15
Обратите внимание, как мало регистров общего назначения, это заставит большинство программ использовать его более или менее в манере стековой машины. Болезненная деталь. rsp используется для стека (pop, push -instructions), и rbp также имеет тенденцию быть зарезервированным. x86_64 имеет больше регистров, но потребуется время, когда люди примут его, даже если у каждого потребителя будет процессор, способный к этому.
Существует два разных набора команд для арифметики с плавающей запятой. XMM новее. В x86_64 доступно 16 128-битных регистров, а в x86 их всего 8. Более старый набор команд обрабатывает регистры как стек. У вас просто нет свопа, гнили или гнили, так что работать с ним просто умопомрачительно.
При использовании x86 имеет тенденцию превращаться в RISC-машину. Некоторые из этих сложных инструкций не дают преимуществ или даже медленнее на новых машинах. Вы будете делать с пониманием около 30-150 инструкций в зависимости от того, что вы читаете или пишете. Вы также можете полностью игнорировать некоторые старые инструкции и AL / HL-материал. Имейте в виду, что все эти происшествия возникли после 1978 года, что довольно удивительно, но не хуже: 31 год с этого момента и 24 года с момента первого внедрения IA-32. Многие вещи меняют свою актуальность в то время.
Прямые переходы и вызовы кажутся относительными из следующей инструкции в x86. Поэтому:
jmp nowhere # or call, jz, jg whatever...
nowhere:
nop
Заканчивается в кодировке 'JMP imm: 0, NOP'. Регистр-косвенный JMP, который делает абсолютные скачки. Также приятно отметить, что нет условных переходов, не связанных с регистрацией, меня это тоже беспокоило.
Здесь не все, что вы должны знать, но первое, что приходит мне в голову после вашего вопроса. Но, может быть, вы можете сейчас ужиться с ними.