Учебная сборка

Я решил изучить язык Ассамблеи. Основная причина этого - понять разобранный код и, возможно, написать более эффективные части кода (например, с помощью С++), делать что-то вроде кодовых пещер и т.д. Я видел, что существует множество разных вариантов сборки, поэтому для целей, о которых я упоминаю, как мне начать? Какую сборку я должен изучить? Я хочу научиться, сначала сделав несколько простых программ (т.е. Калькулятор), но сама цель будет заключаться в том, чтобы приспособиться к нему, чтобы я мог понять код, показанный, например, IDA Pro.

Я использую окна (если это имеет значение).

edit: Итак, кажется, все указывают на MASM. Хотя я понимаю, что у него есть возможности высокого уровня, все хорошо для программиста для сборки кода, это не то, что я ищу. Кажется, что если, вызывают, и т.д. Инструкции не показаны в популярных деассемблерах (например, IDA). Итак, что бы я хотел услышать, если это возможно, это мнение любого, кто использует ASM для целей, которые я прошу (чтение дизассемблированного кода exe в IDA), а не только "общие" программисты сборки.

edit: ОК. Я уже изучаю сборку. Я изучаю MASM, не использую материал высокого уровня, который для меня не имеет значения. То, что я сейчас делаю, проверяет мой код на директивах __asm ​​на С++, поэтому я могу попробовать что-то быстрее, чем если бы мне пришлось делать все с нуля с помощью MASM.

Ответ 1

Начните с MASM32 и оттуда посмотрите FASM. Но вы будете получать удовольствие от MASM.

Ответ 2

Я делал это много раз и продолжаю делать это. В этом случае, когда ваша основная цель - чтение, а не сборка ассемблера, я считаю, что это применимо.

Напишите свой собственный дизассемблер. Не для того, чтобы сделать следующий величайший дизассемблер, это строго для вас. Цель состоит в том, чтобы изучить набор инструкций. Я изучаю ассемблер на новой платформе, вспоминая ассемблер для платформы, которую я когда-то знал. Начните с нескольких строк кода, добавив регистры, например, и ping pong-ing между дизассемблированием двоичного вывода и добавлением все более сложных инструкций со стороны ввода:

1) изучите набор команд для конкретного процессора

2) узнать нюансы о том, как писать код в сборке для указанного процессора, чтобы вы могли перемещать каждый бит кода операции в каждой инструкции

3) вы узнаете, что набор инструкций лучше, чем большинство инженеров, которые используют этот набор команд, чтобы зарабатывать на жизнь

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

Итак, вам нужно будет выяснить, с какого процессора вы хотите начать. Сначала я предлагаю msp430 или ARM, затем ARM сначала или второй, а затем хаос x86. Независимо от того, на какой платформе любая платформа, на которой стоит использовать, содержит листы данных или программисты, содержащие справочники без поставщика, которые включают в себя набор команд, а также кодировку кодов операций (бит и байты машинного языка). С целью изучения того, что делает компилятор и как писать код, с которым компилятор не должен бороться, хорошо знать несколько наборов инструкций и посмотреть, как один и тот же код высокого уровня реализуется в каждом наборе команд с каждым компилятором с каждой оптимизацией установка. Вы не хотите оптимизировать свой код только для того, чтобы найти, что вы сделали его лучше для одного компилятора/платформы, но намного хуже для всех остальных.

О для разборки наборов инструкций переменной длины вместо простого начала с самого начала и разборки каждого четырехбайтового слова линейно через память, как и с ARM или каждые два байта, например, msp430 (msp430 имеет инструкции переменной длины, но вы можете все равно получайте линейное перемещение по памяти, если вы начнете с точек входа из таблицы векторов прерываний). Для переменной длины вы хотите найти точку входа на основе векторной таблицы или знания о том, как процессор загружается и следовать коду в порядке выполнения. Вы должны полностью декодировать каждую инструкцию, чтобы знать, сколько байтов используется, а если инструкция не является безусловной ветвью, предположим следующий байт после того, как эта инструкция является другой инструкцией. Вы также должны хранить все возможные адреса веток и считать, что это начальные байтовые адреса для получения дополнительных инструкций. Когда-то я был успешным, я сделал несколько проходов через двоичный файл. Начиная с точки входа, я отметил, что байт в качестве начала инструкции затем декодируется линейно через память до тех пор, пока не ударит безусловную ветвь. Все цели цепочки были помечены как начальные адреса инструкции. Я сделал несколько проходов через двоичный файл, пока не нашел никаких новых цепей ветвления. Если в любой момент вы найдете команду 3 байта, но по какой-то причине вы отметили второй байт как начало инструкции, у вас есть проблема. Если код был сгенерирован компилятором высокого уровня, это не должно произойти, если компилятор не делает что-то злобное, если в коде есть рукописный ассемблер (например, старая аркадная игра), вполне возможно, что будут условные ветки, которые никогда не могут произойти как r0 = 0, за которым следует скачок, если не равен нулю. Возможно, вам придется вручную отредактировать их из двоичного файла, чтобы продолжить. Для ваших ближайших целей, которые, как я полагаю, будет на x86, я не думаю, что у вас возникнут проблемы.

Я рекомендую gcc-инструменты, mingw32 - это простой способ использовать gcc-инструменты для Windows, если x86 - ваша цель. Если mingw32 plus msys - отличная платформа для генерации кросс-компилятора из binutils и gcc-источников (как правило, довольно легко). У mingw32 есть некоторые преимущества по сравнению с cygwin, например, значительно более быстрые программы, и вы избегаете адского черта cygwin. gcc и binutils позволят вам писать на C или ассемблере и дизассемблировать ваш код, и есть больше веб-страниц, чем вы можете прочитать, показывая вам, как сделать любой или все из трех. Если вы собираетесь делать это с набором инструкций переменной длины, я настоятельно рекомендую вам использовать набор инструментов, который включает дизассемблер. Например, сторонний дизассемблер для x86 будет проблемой для использования, поскольку вы никогда не знаете, правильно ли он разобрался. Некоторые из них также зависят от операционной системы, цель состоит в том, чтобы скомпилировать модули в двоичном формате, который содержит инструкции по маркировке информации из данных, чтобы дизассемблер мог выполнять более точную работу. Другой выбор для этой основной цели - иметь инструмент, который может скомпилировать непосредственно для ассемблера для вашей проверки, а затем надеяться, что когда он компилируется в двоичный формат, он создает те же инструкции.

Короткий (лучше немного короткий) ответ на ваш вопрос. Напишите дизассемблер, чтобы узнать набор инструкций. Я бы начал с чего-то RISCy и легко узнал, как ARM. После того, как вы знаете один набор инструкций, другим становится намного легче подобрать, часто через несколько часов, по третьему набору инструкций, вы можете начать писать код почти сразу, используя справочное руководство/справочное руководство для синтаксиса. Все используемые процессоры имеют техническое описание или справочное руководство, которое описывает инструкции до битов и байтов кодов операций. Изучите RISC-процессор, такой как ARM и CISC, например x86, чтобы почувствовать различия, такие вещи, как необходимость пропускать регистры для всего или возможность выполнять операции непосредственно в памяти с меньшим количеством регистров или без них. Три инструкции операнда против двух и т.д. Когда вы настраиваете свой код высокого уровня, компилируйте более одного процессора и сравнивайте вывод. Самое главное, что вы узнаете, это то, что независимо от того, насколько хорошо написано код высокого уровня, качество компилятора и сделанные варианты оптимизации делают огромную разницу в действительных инструкциях. Я рекомендую llvm и gcc (с binutils), не производят отличный код, но они многоплатформенные и многоцелевые, и у обоих есть оптимизаторы. И оба являются бесплатными, и вы можете легко создавать кросс-компиляторы из источников для разных целевых процессоров.

Ответ 3

Сборка, которую вы пишете вручную, а сборка, сгенерированная компилятором, часто очень отличается при просмотре с высокого уровня. Конечно, внутренности программы будут очень похожими (в конце концов, существует только очень много разных способов кодирования a = b + c), но это не проблема, когда вы пытаетесь каким-то образом перепроектировать. Компилятор добавит тонну кода шаблона даже к простым исполняемым файлам: последний раз, когда я сравнивал, "Hello World", скомпилированный GCC, составлял около 4 КБ, а если он был написан вручную в сборке, он составлял около 100 байт. Это хуже в Windows: в прошлый раз, когда я сравнивал (по общему признанию, это был последний век) самый маленький "Hello World", я мог бы получить свой компилятор Windows, который тогда был бы выбран для генерации, составлял 52 КБ! Обычно этот шаблон работает только один раз, если вообще, так что он не сильно влияет на скорость программы - как я уже говорил выше, ядро ​​программы, часть, на которую тратится большая часть времени выполнения, обычно очень похожа на то, скомпилировано или скомпилировано написанный от руки.

В конце дня это означает, что программист экспертной сборки и эксперт-дизассемблер - это две разные специальности. Обычно они встречаются у одного и того же человека, но они действительно раздельны, и изучение того, как быть отличным сборщиком, не поможет вам научиться обратному проектированию.

Что вы хотите сделать, это захватить руководства по архитектуре IA-32 и AMD64 (оба вместе взятые) с Intel и AMD, и просмотрите ранние разделы инструкций и кодов операций. Возможно, прочитайте учебное пособие или два на ассемблере, чтобы просто убрать основы языка ассемблера. Затем возьмите небольшую пробную программу, которую вы заинтересовали, и разобьем ее: пройдите через поток управления и попытайтесь понять, что он делает. Посмотрите, можете ли вы исправить это, чтобы сделать что-то еще. Затем повторите попытку с другой программой и повторите, пока вам не станет достаточно удобно, чтобы попытаться достичь более полезной цели. Вас могут интересовать такие вещи, как "crackmes", создаваемые реверсивным инженерным сообществом, которые являются проблемами для людей, заинтересованных в обратном проектировании, чтобы попробовать свои силы и, надеюсь, чему-то научиться на этом пути. Они варьируются от основной (начинаются здесь!) До невозможности.

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

Ответ 4

Я пойду против большинства ответов и рекомендую вариант Knuth MMIX архитектуры MIPS RISC. Это будет не так практично полезно, как x86 или ARM-ассемблеры (не то, чтобы все они были решающими в большинстве реальных задач в эти дни...;-), но он откроет для вас волшебство Кнута последние версия самого великого шедевра на глубоком низком уровне понимания алгоритмов и структур данных - TAOCP, "Искусство компьютерного программирования", Ссылки из двух URL-адресов, которые я цитировал, - отличный способ начать изучение этой возможности!

Ответ 5

(Я не знаю как вы, но я был в восторге от сборки)

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

Перейдите в Пуск menu-> Выполнить и введите debug

отладка (команда)

debug - это команда в DOS, MS-DOS, OS/2 и Microsoft Windows (только для версий x86, а не для x64), которая запускает программу debug.exe (или DEBUG.COM в более старых версиях DOS). Отладка может выступать в качестве программы на ассемблере, дизассемблере или шестнадцатеричном дампе, позволяя пользователям в интерактивном режиме исследовать содержимое памяти (на языке ассемблера, шестнадцатеричном или ASCII), вносить изменения и выборочно выполнять COM, EXE и другие типы файлов. Он также имеет несколько подкоманд, которые используются для доступа к определенным секторам диска, портам ввода-вывода и адресам памяти. Отладка MS-DOS выполняется на уровне 16-битных процессов и поэтому ограничена 16-битными компьютерными программами. FreeDOS Debug имеет версию "DEBUGX", которая также поддерживает 32-битные программы DPMI.

Учебники:


Если вы хотите понять код, который вы видите в IDA Pro (или OllyDbg), вам нужно узнать, как структурирован код. Я рекомендую книгу "Реверс: секреты обратного проектирования"

Я экспериментировал пару недель с debug когда начал изучать ассемблер (15 лет назад).
Обратите внимание, что debug работает на уровне базовой машины, нет высокоуровневых команд сборки.

А теперь простой пример:

Дайте a для начала написания ассемблерного кода - введите приведенную ниже программу - и, наконец, дайте g для ее запуска.

alt text


(INT 21 отображает на экране символ ASCII, сохраненный в регистре DL если регистр AH установлен на 2 - INT 20 завершает программу)

Ответ 6

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

Не стоит откладывать на звание. Большая часть первой части книги - "Взлом" в смысле слова Эрика Рэймонда: творческие, удивительные, почти хитрые способы решения сложных проблем. Я (и, возможно, вы) были гораздо меньше заинтересованы в аспектах безопасности.

Ответ 7

Я бы не стал сосредотачиваться на попытке писать программы в сборке, по крайней мере, не поначалу. Если вы находитесь на x86 (как я полагаю, вы, с тех пор как используете Windows), есть множество странных особых случаев, которые бессмысленно изучать. Например, многие инструкции предполагают, что вы работаете в регистре, который явно не указан, а другие инструкции работают с некоторыми регистрами, но не с другими.

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

Я бы рассмотрел основы:

  • регистрирует: сколько их есть, каковы их имена и каковы их размеры?
  • порядок операндов: add eax, ebx означает "Добавить ebx в eax и сохранить результат в eax".
  • FPU: изучите основы стека с плавающей запятой и как вы конвертируете в/из fp.
  • : [base + offset * multiplier], но множитель может быть только 1, 2 или 4 (или, может быть, 8?)
  • вызывающие соглашения: как параметры передаются функции?

В большинстве случаев это будет удивительно, что испускает компилятор. Сделайте это загадкой для выяснения того, почему компилятор думал, что это будет хорошей идеей. Это научит вас много.

Это, вероятно, также поможет вооружить себя руководствами Agner Fog, особенно инструкцию, перечисляющую ее. Он расскажет вам примерно о том, насколько дорогой является каждая инструкция, хотя это сложнее напрямую оценивать на современных процессорах. Но это поможет объяснить, почему, например, компилятор идет настолько далеко от своего пути, чтобы избежать выдачи инструкции idiv.

Мой единственный совет - всегда использовать синтаксис Intel вместо AT & T, когда у вас есть выбор. Раньше я был довольно нейтральным в этом вопросе, до того дня, когда понял, что некоторые инструкции совершенно разные между ними (например, movslq в синтаксисе AT & T movsxd в синтаксисе Intel). Поскольку все инструкции написаны с использованием синтаксиса Intel, просто придерживайтесь этого.

Удачи!

Ответ 9

Я начал изучать MIPS, которая представляет собой очень компактную 32-битную архитектуру. Это сокращенный набор команд, но это то, что легко понять для новичков. Вы все равно сможете понять, как работает сборка, не усложняя ее. Вы даже можете скачать красивую небольшую среду IDE, которая позволит вам скомпилировать ваш код MIPS: clicky Как только вы получите это, я думаю, было бы намного легче перейти к более сложным архитектурам. По крайней мере, то, что я думал:) На этом этапе у вас будут необходимые знания распределения и управления памятью, логического потока, отладки, тестирования и т.д.

Ответ 10

Предложение об использовании отладки - забавное, с этим можно сделать много опрятных трюков. Однако для современной операционной системы изучение 16-битной сборки может быть немного менее полезным. Вместо этого используйте ntsd.exe. Он был встроен в Windows XP (к сожалению, он был захвачен сервером 2003 и выше), что делает его удобным инструментом для изучения, поскольку он настолько широко доступен.

Тем не менее, оригинальная версия в XP страдает от множества ошибок. Если вы действительно хотите использовать его (или cdb или windbg, которые по существу представляют собой разные интерфейсы с тем же синтаксисом команд и отладкой back-end), вы должны установить бесплатный инструменты отладки Windows.

Файл debugger.chm, включенный в этот пакет, особенно полезен при попытке выяснить необычный синтаксис.

Самое замечательное в ntsd - вы можете вытащить его на любую машину XP, где вы находитесь, и использовать ее для сборки или демонтажа. Он делает учебный инструмент для сборки/большого/X86. Например (используя cdb, поскольку он встроен в приглашение dos, в противном случае он идентичен):

(ошибки символов пропущены, поскольку они неактуальны - также, надеюсь, это форматирование работает, это мой первый пост)

C:\Documents and Settings\User>cdb calc

Microsoft (R) Windows Debugger Version 6.10.0003.233 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: calc
Symbol search path is: *** Invalid ***
Executable search path is:
ModLoad: 01000000 0101f000   calc.exe
ModLoad: 7c900000 7c9b2000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 7c9c0000 7d1d7000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f02000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 77f10000 77f59000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
(f2c.208): Break instruction exception - code 80000003 (first chance)
eax=001a1eb4 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c90120e esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c90120e cc              int     3
0:000> r eax
eax=001a1eb4
0:000> r eax=0
0:000> a eip
7c90120e add eax,0x100
7c901213
0:000> u eip
ntdll!DbgBreakPoint:
7c90120e 0500010000      add     eax,100h
7c901213 c3              ret
7c901214 8bff            mov     edi,edi
7c901216 8b442404        mov     eax,dword ptr [esp+4]
7c90121a cc              int     3
7c90121b c20400          ret     4
ntdll!NtCurrentTeb:
7c90121e 64a118000000    mov     eax,dword ptr fs:[00000018h]
7c901224 c3              ret
0:000> t
eax=00000100 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c901213 esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
ntdll!DbgUserBreakPoint+0x1:
7c901213 c3              ret
0:000>`

Кроме того, пока вы играете с IDA, обязательно ознакомьтесь с книгой IDA Pro от Chris Eagle (отсоединенной, поскольку StackOverflow не хочет позволять мне размещать более двух ссылок для моего первого сообщения). Он передает лучшие рекомендации там.

Ответ 11

Я думаю, что вы хотите узнать мнемосхемы кодов опционов ASCII (и их параметры), которые выводятся дизассемблером и которые понимаются ассемблером (могут использоваться как входные данные).

Любой ассемблер (например, MASM) будет делать.

И/или вам может быть лучше прочитать книгу об этом (были книги, рекомендованные для SO, я не помню, какой).

Ответ 12

Вы делаете другие разработки для Windows? На какой IDE? Если это VS, тогда нет необходимости в дополнительной IDE просто для чтения дизассемблированного кода: отладьте ваше приложение (или присоедините к внешнему приложению), затем откройте окно разборки (в настройках по умолчанию это Alt + 8). Шаг и смотреть память/регистры, как вы бы через обычный код. Возможно, вы также захотите оставить окно регистров открытым (по умолчанию Alt + 5).

Корпорация Intel предоставляет бесплатные руководства, которые дают обзор основной архитектуры (регистры, процессорные блоки и т.д.) И полный справочник инструкций. По мере взросления и усложнения архитектуры руководства по базовой архитектуре становятся все менее и менее читабельными. Если вам удастся достать более старую версию, вам, вероятно, лучше начать (даже руководства P3 - они лучше объясняют ту же базовую среду выполнения).

Если вы хотите инвестировать в книгу, вот хороший вводный текст. Ищите amazon для "x86", и вы получите много других. Вы можете получить несколько других направлений из другого вопроса здесь.

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

Ответ 13

Это не обязательно поможет вам написать эффективный код!

i86 op-коды более или менее являются "старыми" форматами, которые сохраняются из-за огромного объема кода и исполняемых двоичных файлов для Windows и Linux.

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

Таким образом, компиляторы генерируют код x86 по умолчанию, а современные чипы читают коды Opce Anceint и транслируют то, что они видят, в параллельные инструкции risc, с переупорядоченным исполнением, спекулятивным исполнением, конвейерной обработкой и т.д., а также в полной мере используют 32 или 64 регистрирует процессор на самом деле (в отличие от жалкого 8, который вы видите в инструкциях x86).

Теперь все оптимизирующие компиляторы знают, что это действительно так, поэтому они кодируют последовательности OP-кодов, которые они знают, что чип может оптимизировать эффективно - хотя некоторые из этих последовательностей выглядели бы неэффективными примерно к программисту 1990.asm.

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

Самый простой и простой способ получить более эффективную рабочую среду - купить компилятор Intel C/С++. У них есть нишевой рынок для компиляторов efficeint, и они имеют то преимущество, что могут спросить разработчиков чипов о том, что происходит внутри.

Ответ 14

Чтобы сделать то, что вы хотите, я просто взял Intel Instruction Set Reference (может быть, не тот, который я использовал, но выглядит достаточно) и некоторые простые программы, которые я написал в Visual Studio, и начал бросать их в IDAPro/Windbg., Когда я вырастил свои собственные программы, программное обеспечение в crackmes было полезным.

Я предполагаю, что у вас есть общее представление о том, как программы выполняются в Windows. Но на самом деле, для чтения ассемблера, есть только несколько инструкций, которые нужно выучить, и несколько разновидностей этих инструкций (например, там есть инструкция перехода, в прыжке есть несколько разновидностей, таких как jump-if-equal, jump-if-ecx-is-zero, так далее). Как только вы изучите основные инструкции, довольно просто понять суть выполнения программы. Помогает представление графика IDA, и если вы отслеживаете программу с помощью Windbg, довольно просто выяснить, что делают инструкции, если вы не уверены.

Немного поиграв таким образом, я купил Hacker Disassembly Uncovered. Вообще, я держусь подальше от книг со словом "хакер" в названии, но мне очень понравилось, как этот действительно углубился в то, как скомпилированный код выглядит дизассемблированным. Он также занимается оптимизацией компилятора и некоторыми интересными вопросами эффективности.

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

Ответ 15

Я недавно взял класс компьютерных систем. Одной из тем была сборка как инструмент для связи с оборудованием.

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

Учитывая это, я склонен рекомендовать мой учебник:

Компьютерные системы: взгляд программиста.

Computer Systems:A programmer's perspective
(источник: cmu.edu)

Он охватывает сборку x86, но книга гораздо шире. Он охватывает процессорные конвейеры процессора и память в качестве кеша, систему виртуальной памяти и многое другое. Все это может повлиять на то, как сборка может быть оптимизирована для данных функций.

Ответ 16

Один из стандартных языков обучения в области педагогики - это MIPS. Вы можете получить имитаторы MIPS (spim) и различные учебные материалы для него.

Лично я не поклонник. Мне нравится IA32.

Ответ 17

Мой личный фаворит - NASM, в основном потому, что он многоплатформен, и он компилирует MMX, SSE, 64-бит...

Я начал компилировать некоторый простой исходный файл C с gcc и "перекодировать" инструкцию ассемблера из gcc-формата в формат NASM. Затем вы можете изменить небольшие части кода и проверить улучшение производительности, которое оно приносит.

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

Ответ 19

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

Ответ 20

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

Рассмотрение неоптимизированного кода c/С++ поможет создать ссылку на тип кода, который генерирует компилятор для ваших источников. Некоторые компиляторы имеют какое-то зарезервированное слово ASM который позволяет вставлять машинные инструкции в ваш код.

Моим советом было бы немного поиграть с такими инструментами и намочить ноги, затем поднять? вниз? к прямому ассемблерному коду на той платформе, на которой вы работаете.

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

Ответ 21

Мы изучили сборку с комплектом для разработки микроконтроллеров (Motorola HC12) и толстым листом данных.

Ответ 22

Отключить тему, которую я знаю, но так как вы программист Windows, я не могу не думать, что это может быть более подходящим и/или лучше использовать ваше время для изучения MSIL. Нет, это не сборка, но это, вероятно, более актуально в эту эпоху .NET.

Ответ 23

Знание сборки может быть полезно для отладки, но я бы не стал слишком волноваться об использовании его для оптимизации вашего кода. Современные компиляторы обычно намного лучше оптимизируют человека в наши дни.

Ответ 24

Вы можете проверить xorpd x86 Сборочный видеокурс. (Я написал это). Сам курс оплачивается, но упражнения открыты на github. Если у вас есть какой-то опыт программирования, я думаю, вы должны работать с упражнениями и понимать все.

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