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