Чтобы изучить сборку - я должен начать с 32-разрядной или 64-разрядной?
Я действительно хочу изучить ассемблер. Я довольно хорошо разбираюсь в c/ C++, но хочу лучше понять, что происходит на более низком уровне.
Я понимаю, что вопросы, связанные со сборкой, задавались ранее, но я просто ищу направление, специфичное для моей ситуации:
Я использую Windows 7 и не понимаю, как мне начать работать со сборкой. Нужно ли начинать с x64, потому что я использую Windows 7? Некоторые люди говорят: "Начни с 32-битной сначала" - как мне это сделать? Что моя операционная система имеет отношение к моей способности писать ассемблер для 32 или 64 бит. На самом деле, что означает "n-битная" сборка, где n - это число??
Редактировать:
Вот несколько ссылок, которые помогли мне начать сборку; другие, которые только начинают, могут найти их полезными. Я буду продолжать обновлять этот список, поскольку я продолжу свой сборочный путь:)
Примечание: поскольку я учился, я решил сосредоточиться на программировании с masm32. Поэтому большинство из перечисленных ниже ресурсов сосредоточены на этом.
- x86 tag wiki (руководства для начинающих, справочные руководства, документация ABI и т. д.)
- http://www.masm32.com/
- X86 Assembly WikiBook
- X86 Dissassembly WikiBook(отлично подходит для понимания некоторых соглашений и основ того, как код более высокого уровня преобразуется в сборку)
- WinAsm IDE (прекрасно работает с masm32)
- Введение: сборка для Windows (все примеры кода для masm32)
- Список прерываний
- Руководство по сборке (отлично подходит для понимания основных концепций)
- Руководство по сборке x86
Ресурсы Agner Fog по оптимизации программного обеспечения, включая некоторые полезные сведения о соглашениях о вызовах на разных платформах (Windows и Linux/OS X), а также множество примеров того, как эффективно выполнять определенные задачи. Не подходит для начинающих, но отлично подходит для средних и продвинутых читателей.
(У него также есть подробная информация о производительности для каждой инструкции для процессоров Intel и AMD, отлично подходящая для серьезной микрооптимизации производительности. Некоторые новички могут захотеть взглянуть на некоторые из них, чтобы начать думать о том, как работают процессоры, и почему вы можете сделать что-то одно путь вместо другого.)
4 ответа
Когда люди обращаются к 32-bit
а также 64-bit
сборка, они говорят о том, какой набор инструкций вы будете использовать - их также иногда называют Ia32
а также x64
в случае с Intel, о котором, я полагаю, вы спрашиваете. В 64-битном случае происходит гораздо больше, поэтому начинать с 32-битного, вероятно, хорошо; вам просто нужно убедиться, что вы собираете свою программу с 32-битным ассемблером в 32-битный бинарный файл. Windows по-прежнему будет знать, как его запустить.
То, что я действительно рекомендую для начала сборки, - это что-то с более простым набором инструкций, чтобы справиться с ним. Иди учись MIPS сборке - spim
Симулятор отличный и простой в использовании. Если вы действительно хотите погрузиться в мир сборки Intel, напишите себе небольшую программу на C, которая вызывает ваши процедуры сборки; выполнение всей установки и демонтажа "настоящей программы" - большой беспорядок, и вы даже не сможете начать там. Так что просто напишите обертку C с main()
в нем, и скомпилируйте и свяжите это с объектными файлами, которые вы получите от написания вашего кода сборки.
Пожалуйста, не заводите встроенную сборку в вашем C-коде - это кошмар переносимости кода, и для этого нет никаких причин.
Вы можете загрузить все Руководства разработчика программного обеспечения для архитектуры Intel 64 и IA-32.
Я начал писать ассемблер в 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 или что-то еще)) От другого.
Когда вы зайдете так далеко и познакомитесь с новой архитектурой, вы сможете потратить час или два, глядя на сгенерированный список, и после этого в значительной степени узнаете, на какую другую архитектуру он похож. Если конструкции индекса и цикла выглядят странно, вы можете просмотреть исходный код, который их генерирует, и, возможно, также уровень оптимизации компилятора.
Я думаю, я должен предупредить вас, что, как только вы освоитесь, вы заметите, что на столах рядом, у кофемашины, на собраниях, на форумах и во многих других местах будут люди, которые ждут, чтобы насмехаться над вами, высмеивать Вы бросаете в вас неполные кавычки и даете неосведомленные / некомпетентные советы из-за вашей заинтересованности в сборке. Почему они это делают, я не знаю. Возможно, они сами являются неудачными программистами на ассемблере, возможно, они знают только ОО (C++, C# и Java) и просто не знают, что такое ассемблер. Возможно, кто-то, кого они "знают" (или кого знает их друг), кто "действительно хорош", возможно, прочитал что-то на форуме или услышал что-то на конференции и, следовательно, может передать абсолютную правду о том, почему сборка - это пустая трата времени. время. Здесь их много в stackru.
Получить IDA Pro. Это колени пчел для работы со сборкой.
Лично я не вижу большой разницы между 32-битной и 64-битной. Речь идет не о битах, а о наборе инструкций. Когда вы говорите о сборке, вы говорите о наборах команд. Возможно, они намекают на то, что 32-битный набор инструкций лучше изучать. Однако, если это ваша цель, я предлагаю книги Дональда Кнутса по алгоритмам - они обучают алгоритмам с точки зрения сборки 7-битного набора команд:D
Что касается проблем переносимости, я предлагаю вместо встроенной сборки научиться использовать встроенные функции компилятора - это будет наилучшей оптимизацией для не встроенных оптимизаций.:D
но хочу лучшего понимания того, что происходит на более низком уровне
Если вы действительно хотите знать все, что происходит на процессорах / системах x86/x64 на более низком уровне, я действительно рекомендую начать с основ, то есть с кодами реального режима 286/386. Например, в 16-битном коде вы вынуждены использовать сегментацию памяти, что является важным понятием для понимания. Современные 32-разрядные и 64-разрядные операционные системы по-прежнему запускаются в реальном режиме, а затем переключаются в / между соответствующими режимами.
Но если вы заинтересованы в разработке приложений / алгоритмов, вы, возможно, не захотите изучать все низкоуровневые ОС. Вместо этого вы можете начать сразу с кода x86/x64, в зависимости от вашей платформы. Обратите внимание, что 32-битный код также будет работать в 64-битной Windows, но не наоборот.
Начало программирования на C (а не на C++ или C#) поможет вам получить базовое представление о том, что необходимо "сделать все самостоятельно", например о регистрах, кадрах стека и обработке данных. Я получил степень магистра по информатике, и одна из моих любимых тем - создание компиляторов (да, yacc и lex!), Которые действительно помогли мне понять все языки высокого уровня на глубоком интимном уровне. Я до сих пор ценю те моменты, когда определяю свой собственный язык и компилирую его в конструкции низкого уровня. На самом деле я разработал объектно-ориентированный язык, который будет выполняться на виртуальном процессоре.
Итак: нет никаких ярлыков для изучения ассемблера. Это может быть утомительно. Но очень сытно.