HTML Diff
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&amp;T</a>. Ни у того ни у другого нет особых преимуществ: AT&amp;T - стандартный синтаксис в Linux, а Intel используется в мире Microsoft.</p>
42 <p>Единого стандарта для языков ассемблера нет. В работе с процессорами Intel разработчики придерживаются двух синтаксисов:<a>Intel</a>и <a>AT&amp;T</a>. Ни у того ни у другого нет особых преимуществ: AT&amp;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&amp;T эта команда выглядит так:</p>
46 <p>В синтаксисе AT&amp;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>