Я начал писать ассемблер в 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.