Самый легкий / Лучший способ Изучить x86 Систему команд? [закрытый]

12
задан starblue 5 May 2010 в 20:24
поделиться

6 ответов

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

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

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

5
ответ дан 2 December 2019 в 05:03
поделиться

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

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

Поступая так, вы получите реальное представление о том, как что-то делать.

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

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

Удачи. Это непросто, но очень возможно.

2
ответ дан 2 December 2019 в 05:03
поделиться

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 и так далее!

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

0
ответ дан 2 December 2019 в 05:03
поделиться

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

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

1
ответ дан 2 December 2019 в 05:03
поделиться

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

Давайте разберем архитектуру 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 + [смещение]


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

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

  1. Реальный режим
  2. Защищенный режим
    • Виртуальный режим 8086
  3. Длинный режим

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

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

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

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

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

  1. Инструкции общего назначения
    • Основные манипуляции с данными (перемещение и копирование)
    • Передача управления (переходы, вызовы, прерывания)
    • Арифметические и логические инструкции (сложение, вычитание, и, xor и т.д.)
    • Строковые и битовые инструкции
    • Системные вызовы
  2. Системные инструкции
  3. Инструкции x87 с плавающей точкой
  4. Инструкции 64-разрядных носителей (MMX)
  5. Инструкции 128-разрядных носителей (SSE)

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

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

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

21
ответ дан 2 December 2019 в 05:03
поделиться

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

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

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

1
ответ дан 2 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: