0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>3 авг 2021</li>
2
<ul><li>3 авг 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><h2>Что такое ассемблер и нужно ли его изучать</h2>
4
</ul><h2>Что такое ассемблер и нужно ли его изучать</h2>
5
<p>Этому языку уже за 70, но на пенсию он пока не собирается.</p>
5
<p>Этому языку уже за 70, но на пенсию он пока не собирается.</p>
6
<p>Полина Суворова для Skillbox Media</p>
6
<p>Полина Суворова для Skillbox Media</p>
7
<p>Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.</p>
7
<p>Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.</p>
8
<p>Есть традиция начинать изучение программирования с вывода на экран строки "Hello world!". На языке Python, например, это всего одна команда:</p>
8
<p>Есть традиция начинать изучение программирования с вывода на экран строки "Hello world!". На языке Python, например, это всего одна команда:</p>
9
<p>Всё просто, понятно и красиво! Но есть язык программирования, в котором, чтобы получить тот же результат, нужно написать солидный кусок кода:</p>
9
<p>Всё просто, понятно и красиво! Но есть язык программирования, в котором, чтобы получить тот же результат, нужно написать солидный кусок кода:</p>
10
.MODEL SMALL .STACK 100h .DATA HelloMessage DB 'Hello, World!',13,10,'$' .CODE START: mov ax,@data mov ds,ax mov ah,9 mov dx,OFFSET HelloMessage int 21h mov ah,4ch int 21h END START<p>Это ассемблер. Только не нужно думать, что он плох. Просто Python - это язык высокого уровня, а ассемблер - низкого. Одна команда Python при выполнении вызывает сразу несколько операций процессора, а каждая команда ассемблера - всего одну операцию.</p>
10
.MODEL SMALL .STACK 100h .DATA HelloMessage DB 'Hello, World!',13,10,'$' .CODE START: mov ax,@data mov ds,ax mov ah,9 mov dx,OFFSET HelloMessage int 21h mov ah,4ch int 21h END START<p>Это ассемблер. Только не нужно думать, что он плох. Просто Python - это язык высокого уровня, а ассемблер - низкого. Одна команда Python при выполнении вызывает сразу несколько операций процессора, а каждая команда ассемблера - всего одну операцию.</p>
11
<p>Сложно? Давайте разбираться.</p>
11
<p>Сложно? Давайте разбираться.</p>
12
<p>Чтобы объяснить, что такое язык ассемблера, начнём с того, как вообще работает процессор и на каком языке с ним можно "разговаривать".</p>
12
<p>Чтобы объяснить, что такое язык ассемблера, начнём с того, как вообще работает процессор и на каком языке с ним можно "разговаривать".</p>
13
<p>Процессор - это электронное устройство (сейчас крошечная микросхема, а раньше процессоры занимали целые залы), не понимающее слов и цифр. Он реагирует только на два уровня напряжения: высокий - единица, низкий - ноль. Поэтому каждая процессорная команда - это последовательность нулей и единиц: 1 - есть импульс, 0 - нет.</p>
13
<p>Процессор - это электронное устройство (сейчас крошечная микросхема, а раньше процессоры занимали целые залы), не понимающее слов и цифр. Он реагирует только на два уровня напряжения: высокий - единица, низкий - ноль. Поэтому каждая процессорная команда - это последовательность нулей и единиц: 1 - есть импульс, 0 - нет.</p>
14
<p>Для работы с процессором используется машинный язык. Он состоит из инструкций, записанных в двоичном коде. Каждая инструкция определяет одну простую машинную операцию: арифметическую над числами, логическую (поразрядную), ввода-вывода и так далее.</p>
14
<p>Для работы с процессором используется машинный язык. Он состоит из инструкций, записанных в двоичном коде. Каждая инструкция определяет одну простую машинную операцию: арифметическую над числами, логическую (поразрядную), ввода-вывода и так далее.</p>
15
<p>Например, для Intel 8088 инструкция<strong>0000001111000011B</strong> - это операция сложения двух чисел, а <strong>0010101111000011B</strong> - вычитания.</p>
15
<p>Например, для Intel 8088 инструкция<strong>0000001111000011B</strong> - это операция сложения двух чисел, а <strong>0010101111000011B</strong> - вычитания.</p>
16
<p>Программировать на машинном языке нелегко - приходится работать с огромными цепочками нулей и единиц. Трудно написать или проверить такую программу, а уж тем более разобраться в чужом коде.</p>
16
<p>Программировать на машинном языке нелегко - приходится работать с огромными цепочками нулей и единиц. Трудно написать или проверить такую программу, а уж тем более разобраться в чужом коде.</p>
17
<p>Поэтому много лет назад был создан язык ассемблера, в котором коды операций обозначались буквами и сокращениями английских слов, отражающих суть команды. Например, команда<strong>mov ax, 6</strong>означает: "переместить число 6 в ячейку памяти AX".</p>
17
<p>Поэтому много лет назад был создан язык ассемблера, в котором коды операций обозначались буквами и сокращениями английских слов, отражающих суть команды. Например, команда<strong>mov ax, 6</strong>означает: "переместить число 6 в ячейку памяти AX".</p>
18
<p>Это произошло ещё в сороковых годах прошлого века. Ассемблер был создан для первых ЭВМ на электронных лампах, программы для которых писали на машинном языке. А так как памяти у компьютеров было мало, то команды вводили, переключая тумблеры и нажимая кнопки. Даже несложные вычисления занимали много времени.</p>
18
<p>Это произошло ещё в сороковых годах прошлого века. Ассемблер был создан для первых ЭВМ на электронных лампах, программы для которых писали на машинном языке. А так как памяти у компьютеров было мало, то команды вводили, переключая тумблеры и нажимая кнопки. Даже несложные вычисления занимали много времени.</p>
19
<p>Проблему решили, когда ЭВМ научились хранить программы в памяти. Уже в 1950 году была разработана первая программа-транслятор, которая переводила в машинный код программы, написанные на понятном человеку языке. Эту программу назвали программой-сборщиком, а язык - языком ассемблера (от англ. assembler - сборщик).</p>
19
<p>Проблему решили, когда ЭВМ научились хранить программы в памяти. Уже в 1950 году была разработана первая программа-транслятор, которая переводила в машинный код программы, написанные на понятном человеку языке. Эту программу назвали программой-сборщиком, а язык - языком ассемблера (от англ. assembler - сборщик).</p>
20
<p>Появление ассемблера сильно облегчило жизнь программистов. Они смогли вместо двоичных кодов использовать команды, состоящие из близких к обычному языку условных обозначений. Кроме того, ассемблер позволил уменьшить размеры программ - для машин того времени это было важно.</p>
20
<p>Появление ассемблера сильно облегчило жизнь программистов. Они смогли вместо двоичных кодов использовать команды, состоящие из близких к обычному языку условных обозначений. Кроме того, ассемблер позволил уменьшить размеры программ - для машин того времени это было важно.</p>
21
<p>Ассемблер можно считать языком второго поколения, если за первый принять машинный язык. Он работает непосредственно с процессором, и каждая его команда - это инструкция процессора, а не операционной или файловой системы. Перевод языка ассемблера в машинный код называется ассемблированием.</p>
21
<p>Ассемблер можно считать языком второго поколения, если за первый принять машинный язык. Он работает непосредственно с процессором, и каждая его команда - это инструкция процессора, а не операционной или файловой системы. Перевод языка ассемблера в машинный код называется ассемблированием.</p>
22
<p>Команды ассемблера состоят из кодов операций и операндов. Операнды - это адреса, из которых процессор будет брать данные для вычислений и в которые будет помещать результат. Адресами могут быть ячейки оперативной памяти и регистры - память внутри процессора. Процессор работает с регистрами гораздо быстрее, чем с оперативной памятью.</p>
22
<p>Команды ассемблера состоят из кодов операций и операндов. Операнды - это адреса, из которых процессор будет брать данные для вычислений и в которые будет помещать результат. Адресами могут быть ячейки оперативной памяти и регистры - память внутри процессора. Процессор работает с регистрами гораздо быстрее, чем с оперативной памятью.</p>
23
<p>Коды операций в языке ассемблера мнемонические, то есть удобные для запоминания:</p>
23
<p>Коды операций в языке ассемблера мнемонические, то есть удобные для запоминания:</p>
24
<ul><li>ADD - сложение (от англ. addition);</li>
24
<ul><li>ADD - сложение (от англ. addition);</li>
25
<li>SUB - вычитание (от англ. subtraction);</li>
25
<li>SUB - вычитание (от англ. subtraction);</li>
26
<li>MUL - умножение (от англ. multiplication) и так далее.</li>
26
<li>MUL - умножение (от англ. multiplication) и так далее.</li>
27
</ul><p>Регистрам и ячейкам памяти присваиваются символические имена, например:</p>
27
</ul><p>Регистрам и ячейкам памяти присваиваются символические имена, например:</p>
28
<p><strong>EAX</strong>, EBX, AX, AH - имена для регистров;</p>
28
<p><strong>EAX</strong>, EBX, AX, AH - имена для регистров;</p>
29
<p><strong>meml</strong> - имя для ячейки памяти.</p>
29
<p><strong>meml</strong> - имя для ячейки памяти.</p>
30
<p>Например, так выглядит команда сложения чисел из регистров AX и BX:</p>
30
<p>Например, так выглядит команда сложения чисел из регистров AX и BX:</p>
31
<p>add ax, bx</p>
31
<p>add ax, bx</p>
32
<p>А это команда вычитания чисел из регистров AX и BX:</p>
32
<p>А это команда вычитания чисел из регистров AX и BX:</p>
33
<p>sub ax, bx</p>
33
<p>sub ax, bx</p>
34
<p>Кроме инструкций, в языке ассемблера есть директивы - команды управления компилятором, то есть программой-ассемблером.</p>
34
<p>Кроме инструкций, в языке ассемблера есть директивы - команды управления компилятором, то есть программой-ассемблером.</p>
35
<p>Вот некоторые из них:</p>
35
<p>Вот некоторые из них:</p>
36
<ul><li><strong>INCLUDE</strong> - открыть файл и начать его компиляцию;</li>
36
<ul><li><strong>INCLUDE</strong> - открыть файл и начать его компиляцию;</li>
37
<li><strong>EXIT</strong> - прекратить компиляцию файла;.</li>
37
<li><strong>EXIT</strong> - прекратить компиляцию файла;.</li>
38
<li><strong>DEF</strong> - назначить регистру символическое имя и т. д.</li>
38
<li><strong>DEF</strong> - назначить регистру символическое имя и т. д.</li>
39
</ul><p>Не думайте, что ассемблер - всего лишь набор инструкций процессора с удобной для программиста записью. Это полноценный язык программирования, на котором можно организовать циклы, условные переходы, процедуры и функции.</p>
39
</ul><p>Не думайте, что ассемблер - всего лишь набор инструкций процессора с удобной для программиста записью. Это полноценный язык программирования, на котором можно организовать циклы, условные переходы, процедуры и функции.</p>
40
<p>Вот, например, код, на ассемблере, выводящий на экран цифры от 1 до 10:</p>
40
<p>Вот, например, код, на ассемблере, выводящий на экран цифры от 1 до 10:</p>
41
section .text global _start _start: mov ecx,10 mov eax, '1' l1: mov [num], eax mov eax, 4 mov ebx, 1 push ecx mov ecx, num mov edx, 1 int 0x80 mov eax, [num] sub eax, '0' inc eax add eax, '0' pop ecx loop l1 mov eax,1 int 0x80 section .bss num resb 1<p>Здесь действие будет выполняться в цикле - как, например, в циклах<strong>for</strong>или<strong>do while</strong>в языках высокого уровня.</p>
41
section .text global _start _start: mov ecx,10 mov eax, '1' l1: mov [num], eax mov eax, 4 mov ebx, 1 push ecx mov ecx, num mov edx, 1 int 0x80 mov eax, [num] sub eax, '0' inc eax add eax, '0' pop ecx loop l1 mov eax,1 int 0x80 section .bss num resb 1<p>Здесь действие будет выполняться в цикле - как, например, в циклах<strong>for</strong>или<strong>do while</strong>в языках высокого уровня.</p>
42
<p>Единого стандарта для языков ассемблера нет. В работе с процессорами Intel разработчики придерживаются двух синтаксисов:<a>Intel</a>и <a>AT&T</a>. Ни у того ни у другого нет особых преимуществ: AT&T - стандартный синтаксис в Linux, а Intel используется в мире Microsoft.</p>
42
<p>Единого стандарта для языков ассемблера нет. В работе с процессорами Intel разработчики придерживаются двух синтаксисов:<a>Intel</a>и <a>AT&T</a>. Ни у того ни у другого нет особых преимуществ: AT&T - стандартный синтаксис в Linux, а Intel используется в мире Microsoft.</p>
43
<p>Одна и та же команда в них выглядит по-разному.</p>
43
<p>Одна и та же команда в них выглядит по-разному.</p>
44
<p>Например, в синтаксисе Intel:</p>
44
<p>Например, в синтаксисе Intel:</p>
45
<p><strong>mov eax, ebx</strong> - команда перемещает данные из регистра<strong>eax</strong>в регистр<strong>ebx</strong>.</p>
45
<p><strong>mov eax, ebx</strong> - команда перемещает данные из регистра<strong>eax</strong>в регистр<strong>ebx</strong>.</p>
46
<p>В синтаксисе AT&T эта команда выглядит так:</p>
46
<p>В синтаксисе AT&T эта команда выглядит так:</p>
47
<p><strong>movl %eax, %ebx</strong></p>
47
<p><strong>movl %eax, %ebx</strong></p>
48
<p>Дело в том, что у каждого процессора есть набор характеристик - архитектура. Это его конструкция и принцип работы, а также регистры, адресация памяти и используемый набор команд. Если у процессоров одинаковая архитектура, то говорят, что они из одного семейства.</p>
48
<p>Дело в том, что у каждого процессора есть набор характеристик - архитектура. Это его конструкция и принцип работы, а также регистры, адресация памяти и используемый набор команд. Если у процессоров одинаковая архитектура, то говорят, что они из одного семейства.</p>
49
<p>Так как наборы команд для разных архитектур процессоров отличаются друг от друга, то и программы на ассемблере, написанные для одних семейств, не будут работать на процессорах из других семейств. Поэтому ассемблер называют машинно-ориентированным языком.</p>
49
<p>Так как наборы команд для разных архитектур процессоров отличаются друг от друга, то и программы на ассемблере, написанные для одних семейств, не будут работать на процессорах из других семейств. Поэтому ассемблер называют машинно-ориентированным языком.</p>
50
<p>Даже из нашего примера "Hello, World!" видно, что ассемблер не так удобен в разработке, как языки высокого уровня. Больших программ на этом языке сейчас никто не пишет, но есть области, где он незаменим:</p>
50
<p>Даже из нашего примера "Hello, World!" видно, что ассемблер не так удобен в разработке, как языки высокого уровня. Больших программ на этом языке сейчас никто не пишет, но есть области, где он незаменим:</p>
51
<ul><li>На ассемблере разрабатывают встроенные программы для микроконтроллеров. Это миниатюрные компьютеры, установленные в системах сигнализации, пультах управления, датчиках, бытовой технике, модемах и во многих других устройствах. Микроконтроллеры используются даже в робототехнике и спутниковых навигационных системах. Объём памяти у этих мини-компьютеров ограничен, а ассемблер удобен для их программирования тем, что одна его команда транслируется в одну команду в двоичном коде. По исходному тексту программы можно определить время её исполнения и объём памяти для её хранения.</li>
51
<ul><li>На ассемблере разрабатывают встроенные программы для микроконтроллеров. Это миниатюрные компьютеры, установленные в системах сигнализации, пультах управления, датчиках, бытовой технике, модемах и во многих других устройствах. Микроконтроллеры используются даже в робототехнике и спутниковых навигационных системах. Объём памяти у этих мини-компьютеров ограничен, а ассемблер удобен для их программирования тем, что одна его команда транслируется в одну команду в двоичном коде. По исходному тексту программы можно определить время её исполнения и объём памяти для её хранения.</li>
52
<li>На ассемблере пишут драйверы устройств и некоторые компоненты операционных систем - например, ядро или загрузчик. Любительские операционные системы<a>MenuetOS</a>и <a>KolibriOS</a>полностью написаны на ассемблере. Ассемблерный код есть в программах для игровых приставок и мультимедийных кодеков.</li>
52
<li>На ассемблере пишут драйверы устройств и некоторые компоненты операционных систем - например, ядро или загрузчик. Любительские операционные системы<a>MenuetOS</a>и <a>KolibriOS</a>полностью написаны на ассемблере. Ассемблерный код есть в программах для игровых приставок и мультимедийных кодеков.</li>
53
<li>Ассемблер применяется в реверс-инжиниринге - обратной разработке программ. Реверс-инжиниринг используют, чтобы понять, как работают программы, какой у них алгоритм. Это нужно в тех случаях, когда создатель по каким-то причинам не хочет публиковать исходный код. Обратной разработкой занимаются антивирусные компании, исследующие вирусы и трояны, создатели драйверов и операционных систем, а также просто любопытные. Ещё её активно применяют компьютерные злоумышленники всех мастей: взламывают программы, ищут уязвимости, пишут вирусы, генераторы ключей и тому подобное.</li>
53
<li>Ассемблер применяется в реверс-инжиниринге - обратной разработке программ. Реверс-инжиниринг используют, чтобы понять, как работают программы, какой у них алгоритм. Это нужно в тех случаях, когда создатель по каким-то причинам не хочет публиковать исходный код. Обратной разработкой занимаются антивирусные компании, исследующие вирусы и трояны, создатели драйверов и операционных систем, а также просто любопытные. Ещё её активно применяют компьютерные злоумышленники всех мастей: взламывают программы, ищут уязвимости, пишут вирусы, генераторы ключей и тому подобное.</li>
54
</ul><p>Если вы хотите разрабатывать новые микропроцессоры или стать реверс-инженером, то есть смысл серьёзно заняться изучением языка ассемблера.</p>
54
</ul><p>Если вы хотите разрабатывать новые микропроцессоры или стать реверс-инженером, то есть смысл серьёзно заняться изучением языка ассемблера.</p>
55
<p>Конечно. Хотя на сайтах по поиску работу вы вряд ли найдёте заявки от работодателей с заголовками: "Нужен программист на ассемблере", зато там много таких, где требуется знание ассемблера дополнительно к языкам высокого уровня: C, C++ или Python. Это вакансии реверс-инженеров, специалистов по компьютерной безопасности, разработчиков драйверов и программ для микроконтроллеров/микропроцессоров, системных программистов и другие.</p>
55
<p>Конечно. Хотя на сайтах по поиску работу вы вряд ли найдёте заявки от работодателей с заголовками: "Нужен программист на ассемблере", зато там много таких, где требуется знание ассемблера дополнительно к языкам высокого уровня: C, C++ или Python. Это вакансии реверс-инженеров, специалистов по компьютерной безопасности, разработчиков драйверов и программ для микроконтроллеров/микропроцессоров, системных программистов и другие.</p>
56
<p>Предлагаемая зарплата - обычная в сфере IT: 80-300 тысяч рублей в зависимости от квалификации и опыта. Вот, например, вакансия реверс-инженера на <strong>HeadHunter</strong>, где требуется знание ассемблера:</p>
56
<p>Предлагаемая зарплата - обычная в сфере IT: 80-300 тысяч рублей в зависимости от квалификации и опыта. Вот, например, вакансия реверс-инженера на <strong>HeadHunter</strong>, где требуется знание ассемблера:</p>
57
Скриншот: сайт HeadHunterСкриншот: сайт HeadHunterСкриншот: сайт HeadHunter<p>Нет, так делать не нужно. Для этого есть несколько причин:</p>
57
Скриншот: сайт HeadHunterСкриншот: сайт HeadHunterСкриншот: сайт HeadHunter<p>Нет, так делать не нужно. Для этого есть несколько причин:</p>
58
<ul><li>Ассемблер слишком сильно отличается от языков высокого уровня, и переходить с него на другой язык будет сложно.</li>
58
<ul><li>Ассемблер слишком сильно отличается от языков высокого уровня, и переходить с него на другой язык будет сложно.</li>
59
<li>Опыт, полученный при изучении ассемблера, в другом языке вам не пригодится. Изучение высокоуровневых языков после ассемблера придётся начинать с чистого листа.</li>
59
<li>Опыт, полученный при изучении ассемблера, в другом языке вам не пригодится. Изучение высокоуровневых языков после ассемблера придётся начинать с чистого листа.</li>
60
<li>Ассемблер - слишком подробный язык. Все рутинные действия, которые в других языках берёт на себя транслятор, в ассемблере приходится описывать программисту. Это может быстро наскучить.</li>
60
<li>Ассемблер - слишком подробный язык. Все рутинные действия, которые в других языках берёт на себя транслятор, в ассемблере приходится описывать программисту. Это может быстро наскучить.</li>
61
</ul><p>Поэтому, даже если вы решили заняться профессией, связанной с ассемблером, изучение программирования вам лучше начинать с языка высокого уровня. А уж ассемблер после него будет выучить несложно.</p>
61
</ul><p>Поэтому, даже если вы решили заняться профессией, связанной с ассемблером, изучение программирования вам лучше начинать с языка высокого уровня. А уж ассемблер после него будет выучить несложно.</p>
62
<a>Научитесь: Карьера разработчика: трудоустройство и развитие Узнать больше</a>
62
<a>Научитесь: Карьера разработчика: трудоустройство и развитие Узнать больше</a>