Эту идею мы вынашивали долго. Наверное, несколько лет мы штурмовали ее со всех сторон, и всякий раз нам что-нибудь мешало. С одной стороны, ассемблер — это круто настолько, насколько вообще может быть круто для нашего читателя-хакера (крякера, реверсера) умение общаться с компьютером на его языке. С другой стороны — актуальных руководств по асму, в том числе издания этого века, достаточно, а времена нынче либеральные, веб-хакеры и любители JS могут нас не понять и не одобрить. 🙂 Точку в споре физиков, лириков, старообрядцев, никониан, веб-хакеров и тру-крякеров поставил успех цикла статей по реверсу малвари. Оказалось, что сейчас, в XXI веке, тру-крякеры все еще не сдали своих позиций и нашим читателям это интересно!

INFO

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

Но что такое программирование само по себе по своей сути, вне зависимости от какого-либо языка? Разнообразие ответов поражает. Наиболее часто можно услышать такое определение: программирование — это составление инструкций или команд для последовательного исполнения их машиной с целью решить ту или иную задачу. Такой ответ вполне справедлив, но, на мой взгляд, не отражает всей полноты, как если бы мы назвали литературу составлением из слов предложений для последовательного прочтения их читателем. Я склонен полагать, что программирование ближе к творчеству, к искусству. Как любой вид искусства — выражение творческой мысли, идеи, программирование представляет собой отражение человеческой мысли. Мысль же бывает и гениальная, и совершенно посредственная.

Но, каким бы видом программирования мы ни занимались, успех зависит от практических навыков вкупе со знанием фундаментальных основ и теории. Теория и практика, изучение и труд — вот краеугольные камни, на которых основывается успех.

В последнее время ассемблер незаслуженно находится в тени других языков. Обусловлено это глобальной коммерциализацией, направленной на то, чтобы в максимально короткие сроки получить как можно большую прибыль от продукта. Иными словами, массовость взяла верх над элитарностью. А ассемблер, по моему мнению, ближе к последнему. Гораздо выгоднее в сравнительно небольшие сроки поднатаскать ученика в таких, например, языках, как С++, С#, PHP, Java, JavaScript, Python, чтобы он был более-менее способен создавать ширпотребный софт, не задаваясь вопросами, зачем и почему он так делает, чем выпустить хорошего специалиста по ассемблеру. Примером тому служит обширнейший рынок всевозможных курсов по программированию на любом языке, за исключением ассемблера. Та же тенденция прослеживается как в преподавании в вузах, так и в учебной литературе. В обоих случаях вплоть до сегодняшнего дня большая часть материала базируется на ранних процессорах серии 8086, на так называемом «реальном» 16-битном режиме работы, операционной среде MS-DOS! Возможно, что одна из причин в том, что, с одной стороны, с появлением компьютеров IBM PC преподавателям пришлось перейти именно на эту платформу из-за недоступности других. А с другой стороны, по мере развития линейки 80х86 возможность запуска программ в режиме DOS сохранялась, что позволяло сэкономить деньги на приобретение новых учебных компьютеров и составление учебников для изучения архитектуры новых процессоров. Однако сейчас такой выбор платформы для изучения совершенно неприемлем. MS-DOS как среда выполнения программ безнадежно устарела уже к середине девяностых годов, а с переходом к 32-битным процессорам, начиная с процессора 80386, сама система команд стала намного более логичной. Так что бессмысленно тратить время на изучение и объяснение странностей архитектуры реального режима, которые заведомо никогда уже не появятся ни на одном процессоре.

Что касается выбора операционной среды для изучения ассемблера, то, если говорить о 32-битной системе команд, выбор сравнительно невелик. Это либо операционные системы Windows, либо представители семейства UNIX.

Также следует сказать несколько слов о том, какой именно ассемблер выбрать для той или другой операционной среды. Как известно, для работы с процессорами х86 используются два типа синтаксиса ассемблера — это синтаксис AT&T и синтаксис Intel. Эти синтаксисы представляют одни и те же команды совершенно по-разному. Например, команда в синтаксисе Intel выглядит так:

mov eax,ebx

В синтаксисе же AT&T уже будет иной вид:

movl %eax,%ebx

В среде ОС UNIX более популярен синтаксис типа AT&T, однако учебных пособий по нему нет, он описывается исключительно в справочной и технической литературе. Поэтому логично выбрать ассемблер на основе синтаксиса Intel. Для UNIX-систем есть два основных ассемблера — это NASM (Netwide Assembler) и FASM (Flat Assembler). Для линейки Windows популярностью пользуются FASM и MASM (Macro Assembler) от фирмы Microsoft, и также существовал еще TASM (Turbo Assembler) фирмы Borland, которая уже довольно давно отказалась от поддержки собственного детища.

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

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

 

Что такое ассемблер?

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

На заре компьютерной эры первые ЭВМ занимали целые комнаты и весили не одну тонну, имея объем памяти с воробьиный мозг, а то и того меньше. Единственным способом программирования в те времена было вбивать программу в память компьютера непосредственно в цифровом виде, переключая тумблеры, проводки и кнопочки. Число таких переключений могло достигать нескольких сотен и росло по мере усложнения программ. Встал вопрос об экономии времени и денег. Поэтому следующим шагом в развитии стало появление в конце сороковых годов прошлого века первого транслятора-ассемблера, позволяющего удобно и просто писать машинные команды на человеческом языке и в результате автоматизировать весь процесс программирования, упростить, ускорить разработку программ и их отладку. Затем появились языки высокого уровня и компиляторы (более интеллектуальные генераторы кода с более понятного человеку языка) и интерпретаторы (исполнители написанной человеком программы на лету). Они совершенствовались, совершенствовались — и, наконец, дошло до того, что можно просто программировать мышкой.

Таким образом, ассемблер — это машинно ориентированный язык программирования, позволяющий работать с компьютером напрямую, один на один. Отсюда и его полная формулировка — язык программирования низкого уровня второго поколения (после машинного кода). Команды ассемблера один в один соответствуют командам процессора, но поскольку существуют различные модели процессоров со своим собственным набором команд, то, соответственно, существуют и разновидности, или диалекты, языка ассемблера. Поэтому использование термина «язык ассемблера» может вызвать ошибочное мнение о существовании единого языка низкого уровня или хотя бы стандарта на такие языки. Его не существует. Поэтому при именовании языка, на котором написана конкретная программа, необходимо уточнять, для какой архитектуры она предназначена и на каком диалекте языка написана. Поскольку ассемблер привязан к устройству процессора, а тип процессора жестко определяет набор доступных команд машинного языка, то программы на ассемблере не переносимы на иную компьютерную архитектуру.

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

 

Синтаксис

Общепринятого стандарта для синтаксиса языков ассемблера не существует. Однако большинство разработчиков языков ассемблера придерживаются общих традиционных подходов. Основные такие стандарты — Intel-синтаксис и AT&T-синтаксис.

Общий формат записи инструкций одинаков для обоих стандартов:

[метка:] опкод [операнды] [;комментарий]

Опкод — это и есть собственно ассемблерная команда, мнемоника инструкции процессору. К ней могут быть добавлены префиксы (например, повторения, изменения типа адресации). В качестве операндов могут выступать константы, названия регистров, адреса в оперативной памяти и так далее. Различия между стандартами Intel и AT&T касаются в основном порядка перечисления операндов и их синтаксиса при разных методах адресации.

Используемые команды обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — команды процессоров и контроллеров Motorola, ARM, x86). Они описываются в спецификации процессоров.

Например, процессор Zilog Z80 наследовал систему команд Intel i8080, расширил ее и поменял некоторые команды (и обозначения регистров) на свой лад. Например, сменил Intel-команду mov на ld. Процессоры Motorola Fireball наследовали систему команд Z80, несколько ее урезав. Вместе с тем Motorola официально вернулась к Intel-командам, и в данный момент половина ассемблеров для Fireball работает с Intel-командами, а половина — с командами Zilog.

 

Директивы

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

  • определение данных (констант и переменных);
  • управление организацией программы в памяти и параметрами выходного файла;
  • задание режима работы компилятора;
  • всевозможные абстракции (то есть элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации передачи параметров) до условных конструкций и циклов;
  • макросы.

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

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

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


48 комментариев

  1. Антон Карев

    Антон Карев

    11.09.2017 at 12:53

    Автору респект. Хорошая задумка. Ностальгия для программистов старой школы. Как насчёт микрокода, который ещё ниже уровнем, чем ассемблер. Планируете описывать? Было бы интересно.

    • Дмитрий Андриенко

      12.09.2017 at 12:16

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

      • owl_34

        26.09.2017 at 14:16

        Приветствую! Продолжение будет? Если да, то когда ждать?

      • Lanka_L

        17.11.2017 at 21:47

        Дмитрий, скажите пожалуйста, будет ли продолжение? Очень интересно вас читать! (А что если нет? Может вы где-то пишете про асм?)

    • blackfin

      02.10.2017 at 12:04

      «микрокод» использовался для специфической организации процессоров в 1970-е годы, сейчас его не используют. Есть микрооперации в интеловских процессорах, которые перекодируется x86 в RISC

  2. Maxim Elchugin

    11.09.2017 at 13:30

    Пораньше бы такой курс, было бы очень круто….
    Но с другой стороны, лучше поздно, чем никогда!

  3. rcall

    11.09.2017 at 15:29

    Афтор пеши ищо! Крайне интересная тема, жду продолжения!

  4. 0ri0n

    11.09.2017 at 17:05

    Я возможно был не внимателен. А где программа Hello World

  5. divided

    11.09.2017 at 18:39

    Жду продолжения 🙂 Когда писал много чего на ассемблере, но подзабыл. Интересно вспомнить и понастальгировать.

  6. Xolod

    11.09.2017 at 19:29

    Крайний раз использовал asm в далеком 98 году… Что-то уже подзабыл, что вполне естественно. Автору большой респект и jmp продолжение.

  7. RedFlag

    11.09.2017 at 19:53

    Держи, друг

    SECTION .data
    msg db «Hello, world!»,0xa
    len equ $ — msg
    SECTION .text
    global _start
    _start:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, len
    int 0x80
    mov eax, 1
    mov ebx, 0
    int 0x80

  8. 0ri0n

    11.09.2017 at 20:49

    RedFlag +1
    Тема Си** раскрыта полностью )
    10/10 статья. Мне понравилась.

  9. baragoz

    11.09.2017 at 22:27

    Хотелось бы гайд по книгам еще, с чего начинать СЕЙЧАС, если начинать. Раньше Питер Абель, помню, был но это же ДОС

    • Дмитрий Андриенко

      17.09.2017 at 03:25

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

  10. baragoz

    11.09.2017 at 22:27

    А так респект, асм всегда плюсуем)

  11. SpyBull

    12.09.2017 at 12:06

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

  12. mrkhesin

    12.09.2017 at 22:31

    Присоединяюсь к комментарию @baragoz

  13. keeper-volok

    12.09.2017 at 23:30

    О, годнота, очень ждём развитие цикла!

  14. robotobor

    13.09.2017 at 04:43

    Ностальгия. Хочу вспомнить и расширить знания по asm. Ждем статей. Терминатор с тремя регистрами порадовал )

  15. beck

    13.09.2017 at 10:24

    Весьма! Отличное начинание! Было бы также неплохо сделать серию статей про написание ПЕРЕНОСИМОГО кода на С.

  16. istepan

    14.09.2017 at 09:46

    Вот после таких статей ничуть не жалеешь о подписке!

  17. Dgromov

    16.09.2017 at 13:01

    Лепота-то какая! Годнота!

  18. crabovwik

    20.09.2017 at 12:18

  19. robotobor

    29.09.2017 at 10:18

    Где продолжение?

  20. Snevar

    30.09.2017 at 23:49

    Да, где продолжение? Хотим становиться умнее!

  21. andr.sml

    01.10.2017 at 13:24

    Продлеваю подписку и жду продолжения!

  22. gorec323

    01.10.2017 at 22:49

    Действительно хорошая затея. Буду ждать продолжения.

  23. WhiteW0lf

    02.10.2017 at 23:32

    Уоу-уоу-уоу! Жду в нетерпении! Отличная идея. Хотелось бы разбора интересных алгоритмов на асме

  24. 84ckf1r3

    03.10.2017 at 00:09

    Спасибо, Дмитрий! До слёз, и это не метафора.
    «… программы которые мы создаем, чистый продукт творчества. Именно поэтому они столь привлекательны. Не нужно ни молотка, ни зубила, ни кистей и красок, что бы выразить в ней главное — _себя_! И это неважно, что может быть понять красоту ваших кодов сможет не так уж и много людей. Если написав свою программу мы стали лучше, то это правильная и хорошая программа! Но если вы думаете, что нужно меньше труда, то вы ошибаетесь. И если вы не готовы, или не хотите в своем творении оставить часть своей души и любви, не готовы к тому чтобы изменить себя, то лучше.. не пишите программ». // История одного байта
    http://vitmar.h10.ru/onebyte.htm

  25. v12aml

    13.10.2017 at 23:28

    Не затягивайте с продолжением!

  26. andr.sml

    17.10.2017 at 19:12

    Уважаемая редакция, что с курсом, будет ли продолжение?

  27. Александр Ерыгин

    30.10.2017 at 16:24

    Пора писать продолжение

  28. ahmarat

    18.11.2017 at 18:17

    Увидев Вашу статью, оформил подписку (впервые). Жду продолжения.

  29. vkolesnikov

    05.01.2018 at 00:17

    Оформил подписку после выхода статьи. Выглядит, как развод, к сожалению.

  30. owl_34

    12.01.2018 at 14:22

    Уважаемая редакция, выпросил/выждал у вас скидку на годовую подписку, жду продолжение с самого выхода статьи, а продолжения нет, не красиво как-то получается, ну раз в месяц-то можно публиковать небольшие статьи, думаю автор осилит. А так получается разрывы в 3-… месяцев не очень хорошо, я вот захожу к вам — захожу, а потом перестану и всё, а жаль, материал-то годный. Обратите внимание на комментарий, ибо не я один такой здесь. Народ ждёт и требует! Автор, пиши ещё!

  31. Antony

    26.01.2018 at 17:12

    Действительно продолжение задерживается …
    3 месяца — долговато.

  32. Anon

    01.03.2018 at 00:47

    Оформил подписку ради этого курса.

  33. intrud3r

    09.10.2018 at 15:32

    Всем привет! Продолжение будет, в конце то концов? Безобразие, ёпта!

  34. mikle

    07.11.2018 at 19:32

    Надвигался 2019.. Но я продолжал ждать. Автор, не верь в себя, верь в мою веру в тебя
    и продолжай, пожалуйста!

Оставить мнение

Check Also

Пишем стилер. Как вытащить пароли Chrome и Firefox своими руками

Ты наверняка слышал о таком классе зловредных приложений, как стилеры. Их задача — вытащит…