Самый простой/лучший способ узнать набор инструкций 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 + [смещение]
Режимы работы:
Это режимы, в которых он может работать:
- Реальный режим
- Защищенный режим
- Длинный режим
Набор инструкций:
Вы слышите, как люди говорят, что это большой набор инструкций. Ну, около 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
Есть...
Есть 32 года R & D на архитектурах x86.
И я упоминал AMD, VIA и т.д.
Нет более быстрого пути!
Ответ 6
В старых версиях руководства NASM была хорошая, краткая ссылка, хотя старые процессоры, на которые они ссылаются, являются только такими недавними. Вот случайная копия, которую я нашел. Перечисляет коды операций (организовано так, что шаблоны легко увидеть) и описывает кодировки режима адресации:
http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html
Я написал генератор машинного кода во время выполнения (таргетинг 486 или лучше), используя в основном именно эту информацию, поэтому должно быть достаточно, чтобы вы начали...