Изучить сборку - начинать с 32-х или 64-х битных? - PullRequest
51 голосов
/ 28 февраля 2010

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

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

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


Edit:

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

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

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

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

Ответы [ 5 ]

35 голосов
/ 28 февраля 2010

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

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

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

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

22 голосов
/ 16 февраля 2011

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

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

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

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

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

Так что же такое "сырой отладчик"? Для меня это отладчик, который является частью простого пакета разработки и не пытается защитить меня от аппаратного обеспечения, такого как визуальный отладчик. В нем я могу легко переключаться между отладкой исходного кода и сборки. Он также быстро запускается из среды разработки. В нем нет трех тысяч функций, скорее всего тридцати, и именно они будут использоваться вами в 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). Он написан и поддерживается одним Pelle Orinius в Швеции, и по нескольким часам, проведенным с ним, я могу сказать, что ему суждено стать моим фаворитом на x86-64. Я пробовал пакеты Visual Express (они устанавливают столько мусора - знаете ли вы, сколько деинсталляций вам нужно сделать потом? Более 20), а также пытался получить gcc из одного места для работы с IDE (eclipse или что-то еще) ) от другого.

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

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

3 голосов
/ 28 февраля 2010

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

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

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

0 голосов
/ 23 июня 2019

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

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

0 голосов
/ 28 февраля 2010

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

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

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

...