Что я должен знать при переходе с MIPS на x86 сборку? - PullRequest
11 голосов
/ 18 января 2009

В школе мы уже некоторое время программируем на ассемблере MIPS. Мне интересно углубиться в сборку x86, и я слышал, что это немного сложнее (даже мой учебник MIPS говорит об этом).

Какую базовую информацию я должен знать как программист MIPS, прежде чем погрузиться в мир x86?

Ответы [ 4 ]

14 голосов
/ 18 января 2009

Самые важные вещи, которые нужно иметь в виду:

  • Мало регистров общего назначения, и те, которые у вас есть, не являются чисто GP - многие инструкции требуют от вас использования определенных регистров для определенной цели.
  • Инструкции x86 имеют форму с двумя операционными кодами, а не с тремя операционными кодами, что может усложнить некоторые операции. То есть вместо добавления r0, r1, r2 (r0 = r1 + r2) вы добавляете eax, ebx (eax + = ebx).
  • Сегменты в защищенном режиме (фактически весь 32-битный код вне DOS) делают вашу схему адресации памяти крайне неочевидной, которая может кусать вас в задницу, когда вы только начинаете.
  • Вы будете постоянно искать установленные / сброшенные флаги по инструкциям. Учитесь любить руководства Intel.
  • Правка, я забыл одну вещь: использование субрегистров (например, ах для доступа к старшим 8 битам младших 16 битов регистра eax) может очень усложнить манипулирование отслеживанием ваших регистров. Будьте осторожны и комментируйте свободно, пока не разберетесь.

Кроме этого, x86 довольно прост. Когда вы научитесь злоупотреблять такими инструкциями, как «ле» и «тест», вы научитесь любить их. Кроме того, protip: Intel бесплатно отправит вам копии руководств по набору инструкций, даже не нужно платить за доставку. Посмотрите на их сайте электронную почту и запросите книги у SKU.

5 голосов
/ 18 января 2009

x86 имеет очень ограниченный набор доступных регистров по сравнению с большинством других архитектур. Это на самом деле не усложняет изучение ассемблера, но иногда затрудняет реализацию кода на практике.

Кроме того, из-за сильной обратной совместимости x86, набор команд не очень симметричен (определенно, до RISC), и может быть много исключений из правил и угловых случаев, на которые следует обратить внимание.

1 голос
/ 18 января 2009

Я учил 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, который делает абсолютные скачки. Также приятно отметить, что нет условных переходов, не связанных с регистрацией, меня это тоже беспокоило.

Здесь не все, что вы должны знать, но первое, что приходит мне в голову после вашего вопроса. Но, может быть, вы можете сейчас ужиться с ними.

1 голос
/ 18 января 2009

x86 имеют более сложные инструкции, чем MIPS. Таким образом, в MIPS, вероятно, есть одна инструкция для общих последовательностей (прежде всего адресация памяти). Недостаток многочисленных регистров, безусловно, является недостатком, но в обеих архитектурах есть соглашения, которые в значительной степени ограничивают количество того, что вы можете свободно использовать, до 4-5. Просто более ярко выражен в x86. В x86 есть больше исключений для использования регистра, чем в MIPS, о которых вы должны помнить, но не стоит постоянно жаловаться.

Исходя из опыта, любой язык имеет примерно одинаковую сложность в изучении, включая условные обозначения. Возможно, x86 намного проще, учитывая обилие онлайн-ресурсов и их популярность.

Трудная часть о x86 - генерирование двоичного файла из-за его инструкций переменной длины и нескольких режимов адресации. Чаще всего вам никогда не нужно это делать.

Я, безусловно, могу порекомендовать вам изучить более сложную архитектуру команд, чем MIPS.

И, это важно, не участвуйте в религиозной войне между RISC v.s. CISC ...

...