Изучить сборку - следует ли начать с 32-битного или 64-битного?

Я действительно хочу изучить ассемблер. Я довольно хорошо разбираюсь в с /c++, но хочу лучшего понимания того, что происходит на более низком уровне.

Я понимаю, что вопросы, связанные со сборкой, задавались ранее, но я просто ищу направление, специфичное для моей ситуации:

Я использую Windows 7 и не понимаю, как мне начать работать со сборкой. Должен ли я начать с 64, потому что я бегу Windows 7? Некоторые люди говорят: "Начни с 32-битной сначала" - как мне это сделать? Что моя операционная система имеет отношение к моей способности писать ассемблер для 32 или 64 бит. На самом деле, что означает "n-битная" сборка, где n - это число??


Редактировать:

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

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

  • Вики- тег (руководства для начинающих, справочные руководства, документация по ABI и т.д.)
  • www.masm32.com
  • X86 Assembly WikiBook
  • X86 Dissassembly WikiBook (отлично подходит для понимания некоторых соглашений и основ того, как код более высокого уровня переводится в сборку)
  • WinAsm IDE (прекрасно работает с masm32)
  • Введение: Сборка для Windows (все примеры кода для masm32)
  • Список прерываний
  • Руководство по сборке (отлично подходит для понимания основных концепций)
  • Руководство по сборке x86
  • Ресурсы по оптимизации программного обеспечения Agner Fog, включая некоторые полезные материалы о соглашениях о вызовах на разных платформах (Windows и Linux/OS X), а также множество примеров того, как эффективно выполнять определенные задачи. Не подходит для начинающих, но отлично подходит для средних и продвинутых читателей.

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

Ответ 1

Когда люди ссылаются на сборку 32-bit и 64-bit, они говорят о том, какой набор инструкций вы будете использовать - их также иногда называют Ia32 и x64 в корпусе Intel, что я предполагаю вы спрашиваете. В 64-битном случае происходит гораздо больше, поэтому, начиная с 32-битного, возможно, хорошо; вам просто нужно убедиться, что вы собираете свою программу с 32-разрядным ассемблером в 32-битный двоичный файл. Windows все равно будет знать, как ее запустить.

То, что я действительно рекомендую для начала работы с сборкой, было бы чем-то с более простым набором команд, чтобы получить ручку. Go learn сборник MIPS - симулятор spim и проста в использовании. Если вы действительно хотите погрузиться прямо в мир сборки Intel, напишите себе небольшую программу на C, которая вызывает ваши процедуры сборки для вас; делать все настройки и разрывы для "реальной программы" - это большой беспорядок, и вы даже не сможете туда начать. Так что просто напишите обертку C с main() в ней, а затем скомпилируйте и соедините с объектными файлами, которые вы получаете от написания кода сборки.

Пожалуйста, не привык писать встроенную сборку в свой код C - это кошмар с переносимостью кода, и нет причин для этого.

Вы можете скачать все Руководства для разработчиков программного обеспечения Intel 64 и IA-32, чтобы начать работу.

Ответ 2

Я начал писать сборку в 1977 году, пройдя длинный маршрут: сначала изучая основные операции (и, или, xor, not) и восьмеричную математику перед написанием программ для DEC PDP-8/E с OS/8 и 8k памяти, Это было в 1977 году.

С тех пор я обнаружил несколько трюков о том, как узнать сборку для архитектур, с которыми я не знаком. Это было несколько: 8080/8085/Z80, x86, 68000, VAX, 360, HC12, PowerPC и V850. Я редко пишу автономные программы, это обычно функции, которые связаны с остальной частью системы, которая обычно записывается на C.

Итак, прежде всего, я должен иметь возможность взаимодействовать с остальной частью программного обеспечения, которая требует изучения передачи параметров, компоновки стека, создания фрейма стека, позиций параметров, локальных позиций переменных, отбрасывания фрейма стека, возвращаемых значений, возврата и очистка стека. Лучший способ сделать это - написать функцию, которая вызывает другую функцию на C, и просмотреть список кодов, сгенерированный компилятором.

Чтобы выучить язык ассемблера, я пишу какой-то простой код, видя, что компилятор генерирует и выполняет однократное нажатие на него в необработанном отладчике. У меня есть инструкции по набору инструкций, чтобы я мог найти инструкции, о которых я не уверен.

Хорошая вещь, чтобы узнать (в дополнение к обработке стека, упомянутой ранее), заключается в том, как компилятор генерирует машинный код с определенной конструкцией языка высокого уровня. Одной из таких последовательностей является то, как индексированные массивы/структуры переводятся в указатели. Другим является базовая последовательность машинного кода для циклов.

Итак, что такое "сырой отладчик"? Для меня это отладчик, который является частью простого пакета разработки и который не пытается защитить меня от оборудования, такого как Visual debugger (s). В нем я могу легко переключаться между отладкой источника и сборки. Он также быстро запускается изнутри IDE разработки. У него нет трех тысяч функций, более вероятно тридцать, и это будут те, которые вы используете в 99,9% случаев. Пакет разработки, как правило, будет частью установщика, когда вы нажимаете один раз для утверждения лицензии, один раз для утверждения настройки по умолчанию (разве вам не нравится, когда кто-то задумался и сделал это для вас?) И последний раз для установки.

У меня есть одна любимая простая среда разработки для x86-32 (IA-32), и это OpenWatcom. Вы можете найти его на openwatcom.org.

Я новичок в x86-64 (AMD64), но переход кажется простым (как при переходе с x86-16 на x86-32) с некоторыми дополнительными трюками, такими как дополнительные регистры от r8 до r15, и что основные регистры имеют ширину 64 бит. Недавно я столкнулся со средой разработки для XP/64, Vista/64 и 7/64 (вероятно, работает и для ОС сервера), и она называется Pelles C (pellesc.org). Он написан и поддерживается одной Пелле Ориниусом в Швеции и с нескольких часов, проведенных мной, и я могу сказать, что ей суждено стать моим фаворитом для x86-64. Я пробовал пакеты Visual Express (они устанавливают столько мусора - знаете ли вы, сколько удалений вам нужно сделать потом? Более 20), а также попытались получить gcc из одного места для работы с IDE (затмение или что-то еще ) из другого.

Как только вы зашли так далеко, и вы столкнетесь с новой архитектурой, вы сможете потратить час или два, глядя на сгенерированный список, и после этого в значительной степени знаете, какая другая архитектура похожа. Если конструкторы индекса и цикла кажутся странными, вы можете просмотреть исходный код, генерирующий их, а также, возможно, уровень оптимизации компилятора.

Думаю, я должен предупредить вас, что, как только вы это почувствуете, вы заметите, что на столах рядом, на кофе-машине, на встречах, в форумах и в других местах будут люди, ожидающие презрения к вам, высмеивать вас, бросать неполные цитаты на вас и давать неосведомленные/некомпетентные советы из-за вашего интереса к сборке. Почему они это делают, я не знаю. Возможно, они сами неудачные программисты сборки, возможно, они знают только OO (С++, С# и Java) и просто не имеют понятия о том, что такое ассемблер. Возможно, кто-то, кого они знают (или которого знает их друг), который "действительно хорош", возможно, что-то читал на форуме или слышал что-то на конференции, и поэтому может дать абсолютную правду о том, почему сборка является полной тратой время. Их много здесь, в stackoverflow.

Ответ 3

Получить IDA pro. Это пчелиные колени для работы с сборкой.

Я лично не вижу большой разницы между 32-битными и 64-битными. Речь идет не о битах, а о наборе инструкций. Когда вы говорите об ассамблее, вы говорите о наборах инструкций. Возможно, они подразумевают, что 32-битный набор инструкций лучше изучить. Однако, если это ваша цель, я предлагаю книги Дональда Кнутса по алгоритмам - они учат алгоритмы с точки зрения сборки набора из 7 бит: D

Для проблем с переносимостью я предлагаю, чтобы вместо встроенной сборки вы узнали, как использовать встроенные функции компилятора - это будет лучшая оптимизация для не встроенных оптимизаций.: D

Ответ 4

но лучше понять, что происходит на более низком уровне

Если вы действительно хотите знать все, что происходит на более низком уровне на процессорах/системах x86/x64, я бы рекомендовал начать с основ, то есть с кодом реального режима 286/386. Например, в 16-битном коде вы вынуждены использовать сегментацию памяти, которая является важной концепцией для понимания. Сегодня 32-разрядные и 64-разрядные операционные системы все еще запускаются в реальном режиме, затем переключаются между соответствующими режимами.

Но если вы заинтересованы в разработке приложений/алгоритмов, возможно, вам не захочется изучать все низкоуровневые файлы ОС. Вместо этого вы можете сразу начать с кода x86/x64, в зависимости от вашей платформы. Обратите внимание, что 32-разрядный код также будет работать в 64-битной Windows, но не наоборот.

Ответ 5

Начните программировать на C (а не на C++ или С#), чтобы получить общее представление о том, что необходимо для того, чтобы "сделать все самому", например, регистр, фрейм стека и обработка данных. Я получил степень магистра по информатике, и одна из моих любимых тем - сборка компиляторов (да, yacc и lex!), Которые помогли мне понять все языки более высокого уровня на глубоком интимном уровне. Я до сих пор дорожу этими моментами, определяя свой собственный язык и компилируя его в низкоуровневые конструкции. Действительно, я разработал объектно-ориентированный язык, который будет выполняться на виртуальном процессоре.

Итак: нет ярлыков обучения ассемблеру. Это может быть утомительно. Но очень приятно.