Что я должен знать при переключении с MIPS на сборку x86?

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

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

4 ответов


самые большие вещи, чтобы иметь в виду:

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

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


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

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


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

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

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

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

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


Я изучал 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 (если я правильно помню) спереди и некоторые инструкции становятся для 16bit GPRs вместо 32bit.

32бит через GPRS(по порядку): еах, Екб, регистр edx, ebx потенциально ЭСП, эбп Эси эод

64бит Гпрс: Ракс, РКС, рдкс, РБС, РСП, РБП, РСИ, rdi, r8, r9, r10, r11, r12, r13, r14, r15

обратите внимание, как мало регистров общего назначения, это заставит большинство программ использовать его более или менее в стиле стека. Болезненная деталь. rsp используется для стека (pop, push-инструкции), и rbp, как правило, зарезервирован. x86_64 имеет больше регистров, но потребуется время, когда люди примут его, даже если каждый из потребителей имел процессор, способный к этому.

существует две разные инструкции наборы для арифметики с плавающей запятой. XMM является новым. В x86_64 доступно 16 128-битных регистров, а в x86 их всего 8. Более старый набор инструкций обрабатывает регистры как стек. У вас просто нет swap, nip или rot, поэтому работа с ним является умопомрачительной.

в использовании x86 имеет тенденцию уменьшаться до машины RISC. Некоторые из этих сложных инструкций не дают преимуществ или даже медленнее на новых машинах. Вы будете делать с пониманием о 30-150 инструкции о том, что Вы читаете или пишете. Вы также можете полностью игнорировать некоторые старые инструкции и AL / HL-вещи. Имейте в виду, что весь этот беспорядок берет свое начало за 1978 год, что довольно удивительно, что это не хуже, 31 год от этого и 24 года от первого введения ИА-32. За это время многое изменилось.

прямые прыжки и вызовы кажутся относительными от следующей инструкции в x86. Таким образом:

    jmp nowhere  # or call, jz, jg whatever...
nowhere:
    nop

заканчивается кодировкой "jmp imm: 0, NOP". Этот register-косвенный jmp, который выполняет абсолютные прыжки. Также приятно отметить, что нет регистрации-косвенные условные прыжки, это тоже беспокоило меня.

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