В какой-то момент вам придется справиться с небольшой сложностью. Набор инструкций x86 большой.
Но вы можете существенно упростить задачу, прочитав документацию по старому процессору. Intel и AMD, кажется, добавляют к каждой подмодели десятки новых инструкций. Попробуйте прочитать руководство Intel для 80386 , которое значительно меньше по размеру, но охватывает большую часть того, что вы будете использовать.
Я знаю одну хорошую (старую) книгу, но она на французском языке. Она называется «Программирование 80386» Ж.-М. и М. Трио. Я не уверен, что он до сих пор редактируется (я купил свой почти 20 лет назад).
Я бы сказал прыгнуть в глубокую воду и начать оттуда.
Начните с написания простого (C / ++) приложения. Затем используйте эпический отладчик OllyDbg ( http://www.ollydbg.de/ ). Отладьте приложение и посмотрите, как компилятор реализовал ваш код. Проверить петли. Проверить вызовы функций. Проверить вызовы API. Проверить манипуляции с памятью.
Поступая так, вы получите реальное представление о том, как что-то делать.
Я отлаживал приложение таким образом и изучил сборку. Вы говорите, что хотите ПОНИМАТЬ машинный код, и, на мой взгляд, нет лучшего способа.
Вы также можете проверить с помощью так называемого "crackme" (погуглить). Это бросит вам вызов, чтобы проверить свои навыки. Как только вы получите контроль, вы увидите что все, что вы хотите знать, - это просто покопаться в руководстве по набору инструкций. вникнуть в суть? Бросьте вызов себе с конкретными целями.
Удачи. Это непросто, но очень возможно.
I думаю, что вы нереалистичны. You sed:
Я знаю, что есть руководства Intel и руководства AMD, которые охватывают набор инструкций x86. Но они очень большие и плотные.
...
Я бы хотел все это узнать. Возможно, мне следует начать с самого простого и легкого в освоении.
Вы спрашивали себя, почему бывают большие и плотные? Ответ прост! Если мы просто ищем продукты Intel x86
- Это 16-битные процессоры 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, Prescott
- Есть: Intel Core 2, Intel Core i7
- Есть: Intel Atom
Есть: Sandy Bridge
Есть 16-, 32- и 64-битные архитектуры
- Есть несколько разных математических расчетов с плавающей точечные единицы.
- Существует несколько потоковых расширений SIMD.
- Существует несколько защищенных моделей ЦП.
Есть ...
Есть 32 года исследований и разработок по архитектуре x86. И я не упомянул AMD, VIA и так далее!
Нет более быстрого пути!
Если вы просто хотите понять числа и некоторые сложности, такие как байты Mod R / M и другие странности, стоящие за этим, вы можете попробовать реализовать простой эмулятор 8086. (только ЦП). Я нашел это забавным и интересным опытом.
http://www.ousob.com/ng/iapx86/ - действительно хороший справочник, который я использовал при написании эмулятора, и дает очень хороший список кодов операций вместе с версией процессора, которая появилась, и шестнадцатеричным кодом. код операции для каждого варианта кода операции.
Ну, я с вами не согласен. Сложность x86 неправильно понимают и поэтому преувеличивают. Я не говорю, что он не сложен. Она, конечно, сложна, но это только в том случае, если вы хотите написать полноценный компилятор или ассемблер. Если вы просто хотите изучить Ассемблер. Это не так сложно.
Давайте разберем архитектуру x86-64, чтобы доказать мою точку зрения.
Регистры:
x86-64 определяет мало регистров. Сколько именно? Давайте перечислим их
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 могут быть обобщены этой формулой:
Режимы адресации для 64-битного кода на 64-битных процессорах x86 могут быть обобщены этими формулами:
и
RIP + [смещение]
Режимы работы:
Вот режимы, в которых он может работать:
Набор инструкций:
Вы слышите, как люди говорят, что у него большой набор инструкций. На самом деле, здесь около 500-600 инструкций. Но некоторые из них - это одни и те же инструкции с очень небольшими вариациями, например CMPS/CMPSB/CMPSW/CMPSD/CMPSQ. Если сгруппировать их таким образом, то число инструкций сократится до 400.
Вы считаете, что это очень много? Тогда у меня есть несколько вопросов. Сколько функций имеет стандартная библиотека C? Сколько функций имеет библиотека POSIX? Что насчет .NET и Java? Сколько у них классов и методов? Должны ли мы знать все функции/методы/классы? Какой подход мы должны использовать для изучения этих библиотек?
Просто выучите несколько из каждой. Примерно пройдитесь по всем из них. Получите представление об их существовании и используйте ссылки, когда это необходимо.
Мы можем логически разделить эти инструкции на следующие категории:
Вот и все!!! Это все, что вам нужно знать. Теперь честно скажите мне. Это так сложно?
Просто возьмите любую хорошую книгу по языку ассемблера, охватывающую архитектуру x86. Я бы лично предложил "Программирование на языке ассемблера в GNU/Linux для архитектур IA32" Раджата Муны, потому что она короткая и в точку. Не нужно тратить много времени. Но он не охватывает X86-64.
После ознакомления с IA32 для x86-64 читайте http://csapp.cs.cmu.edu/public/1e/public/docs/asm64-handout.pdf
В старых версиях руководства NASM была хорошая, краткая справка, хотя, будучи старыми, процессоры, на которые они ссылаются, появились совсем недавно. Вот случайная копия, которую я нашел. Перечисляет опкоды (расположенные так, чтобы паттерны было легко увидеть), и описывает кодировки режима адресации:
http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html
Я написал генератор машинного кода (ориентированный на 486 или лучше), используя практически только эту информацию, так что ее должно быть достаточно для начала работы...