Самый простой/лучший способ узнать набор инструкций x86?

Я хотел бы узнать архитектуру набора команд x86. Я не хочу изучать сборку для x86. Я хочу понять ребенка машинного кода.

Причина в том, что я хотел бы написать ассемблер для x86. Затем я хочу написать компилятор, который компилируется на эту сборку.

Я знаю, что есть руководства Intel и руководства AMD, которые охватывают набор инструкций x86. Но они очень большие и плотные.

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

Ответ 1

В какой-то момент вам придется справляться с некоторой сложностью. Набор команд x86 большой.

Но вы можете сделать вещи значительно проще, прочитав документацию для более старого процессора. Intel и AMD, похоже, добавили десятки новых инструкций для каждой подмодели. Попытайтесь прочитать руководство Intel для 80386, которое существенно меньше и все же покрывает большую часть того, что вы будете использовать.

Я знаю хорошую (старую) книгу, но она по-французски. Он называется "Программирование дю 80386" Ж.-М. и М. Трио. Я не уверен, что он до сих пор редактируется (я купил мои почти 20 лет назад).

Ответ 2

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

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


Регистры

x86-64 указывает несколько регистров. Сколько именно? Позволяет перечислить их

  • 16 Регистры общего назначения (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP + R8, R9, R10, R11, R12, R13, R14, R15)
  • 6 Регистры сегрегации (CS, DS, SS, ES, FS, GS)
  • 64-разрядные RFlags и 64-битные RIP
  • 8 80-битных регистров с плавающей точкой (x87) (FPR0-FPR7) с псевдонимом в 64-разрядные регистры MMX (MM0-MM7)
  • 16 128-разрядных расширенных медиарегистраторов (XMM0-XMM7 + XMM8-XMM16)
  • некоторые специальные/разные регистры, такие как регистры управления (CR0-4), регистры отладки (от DR0 до 3, плюс 6 и 7), тестовые регистры (TR4-7), регистры дескрипторов (GDTR, LDTR, IDTR) и (TR), который нам практически не нужно заботиться.

alt text http://www.viva64.com/content/articles/64-bit-development/amd64_em64t/01-big.png


Режимы адресации:

Как ссылаться на любую ячейку памяти?

Источник: http://en.wikipedia.org/wiki/X86#Addressing_modes

Режимы адресации для 32-разрядного размера адреса для 32-разрядных или 64-разрядных процессоров x86 можно суммировать по этой формуле:

alt text

Режимы адресации для 64-битного кода на 64-разрядных процессорах x86 можно суммировать по следующим формулам:

alt text

и

RIP + [смещение]


Режимы работы:

Это режимы, в которых он может работать:

  • Реальный режим
  • Защищенный режим
    • Режим виртуального 8086
  • Длинный режим

Набор инструкций:

Вы слышите, как люди говорят, что это большой набор инструкций. Ну, около 500-600 инструкций. Но некоторые из них - одни и те же инструкции с очень небольшими вариациями, такими как CMPS/CMPSB/CMPSW/CMPSD/CMPSQ. Если вы группируете их, как этот номер, вы можете записать до 400 инструкций.

Считаете ли вы, что он очень большой? Тогда у меня мало вопросов. Сколько функций имеет библиотека C Standard? сколько функций имеет библиотека POSIX? Что относительно .NET и Java? Сколько классов и методов у них есть? Должны ли мы знать все функции/методы/классы? Какой подход мы берем для изучения этих библиотек?

Просто узнайте немного от каждого. Грубо пройти через все из них. Почувствуйте их существование и используйте ссылку, когда вам нужно.

Мы можем логически разделить эти инструкции на следующие категории:

  • Инструкции общего назначения
    • Манипуляция основными данными (перемещение и копирование)
    • Передача управления (переходы, вызовы, прерывания)
    • Арифметические и логические инструкции (add, sub, and, xor и т.д.)
    • Строковые и бит-ориентированные инструкции
    • Системные вызовы
  • Системные инструкции
  • x87 Инструкции по плавающей запятой
  • Инструкции 64-битного носителя (MMX)
  • Инструкции 128-битного носителя (SSE)

Вот оно! Это все, что вам нужно знать. Теперь откровенно скажите мне. Это сложно?

Просто получите любую хорошую книгу на ассемблере, охватывающую архитектуру x86. Я бы лично предложил "" Программирование языка программирования в GNU/Linux для архитектур IA32 "." Раджат Муна потому, что его коротко и точно. Не тратит много времени. Но он не распространяется на X86-64.

После ознакомления с IA32 для x86-64 прочитайте http://csapp.cs.cmu.edu/public/1e/public/docs/asm64-handout.pdf

Ответ 3

Я бы сказал, прыгните в глубокую воду и начните оттуда.

Начните с написания простого (C/++) приложения. Затем используйте эпический отладчик под названием OllyDbg (http://www.ollydbg.de/). Отлаживайте приложение и смотрите, как компилятор реализовал ваш код. Проверьте петли. Проверьте вызовы функций. Проверьте API-вызовы. Проверьте работу с памятью.

Сделав это, вы получите реальное представление о том, как делать вещи.

Я отлаживал приложение таким образом и изучал сборку. Вы говорите, что хотите ПОНИМАТЬ машинный код, и нет лучшего способа, на мой взгляд.

Вы также можете проверить что-то под названием "crackme" (google it). Это поставит вас в задачу проверить свои навыки. После того, как вы будете контролировать, вы увидите, что все, что вы хотите знать, - это просто вопрос копания руководства по настройке инструкций. вникнуть в суть? Задайте себе конкретные цели.

Удачи. Это нелегко, но очень возможно.

Ответ 4

Если вы просто хотите понять числа и некоторые из таких сложностей, как байты Mod R/M и другие странности, вы можете попробовать реализовать простой эмулятор 8086. (только процессор). Я нашел это интересным и интересным.

http://www.ousob.com/ng/iapx86/ - действительно хорошая ссылка, которую я использовал при написании эмулятора, и дает очень хороший список кодов операций вместе с версией процессора, которая он появился, и шестнадцатеричный код операции для каждого варианта кода операции.

Ответ 5

Я думаю, что вы не реалистичны. Вы sed:

Я знаю, что есть Intel руководства и руководства AMD, которые охватывают набор инструкций x86. Но это очень большой и плотный.

...

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

Вы спрашивали себя, почему существуют большие и плотные? Ответ прост! Если мы просто смотрим продукты Intel x86

  • Существуют 1686-разрядные процессоры 8086, 8088, 80186, 80188 и 80286.
  • Есть: 80386 и 80486 с сопроцессором с плавающей запятой 32 разрядных ЦП.
  • Есть: Pentium и Pentium MMX
  • Есть: Pentium Pro, Pentium II и Pentium III
  • Есть: Pentium 4 Pentium M, Pentium 5, Pentium 6, Celleron, Прескотт
  • Есть: Intel Core 2, Intel Core i7
  • Существует: Intel Atom
  • Есть: Sandy Bridge

  • Существуют 16, 32 и 64-разрядные архитектуры

  • Существует несколько разных математических вычислений с единицами с плавающей запятой.
  • Существует несколько потоковых SIMD-расширений.
  • Существует несколько защищенных моделей процессора.

Есть...

Есть 32 года R & D на архитектурах x86. И я упоминал AMD, VIA и т.д.

Нет более быстрого пути!

Ответ 6

В старых версиях руководства NASM была хорошая, краткая ссылка, хотя старые процессоры, на которые они ссылаются, являются только такими недавними. Вот случайная копия, которую я нашел. Перечисляет коды операций (организовано так, что шаблоны легко увидеть) и описывает кодировки режима адресации:

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html

Я написал генератор машинного кода во время выполнения (таргетинг 486 или лучше), используя в основном именно эту информацию, поэтому должно быть достаточно, чтобы вы начали...