0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Процессоры и машинный язык</a></li>
1
<ul><li><a>Процессоры и машинный язык</a></li>
2
<li><a>История создания</a></li>
2
<li><a>История создания</a></li>
3
<li><a>Определение</a></li>
3
<li><a>Определение</a></li>
4
<li><a>Синтаксис</a><ul><li><a>Мнемоники</a></li>
4
<li><a>Синтаксис</a><ul><li><a>Мнемоники</a></li>
5
<li><a>Операнды</a></li>
5
<li><a>Операнды</a></li>
6
<li><a>Литералы</a></li>
6
<li><a>Литералы</a></li>
7
<li><a>Компоненты выразительности</a></li>
7
<li><a>Компоненты выразительности</a></li>
8
</ul></li>
8
</ul></li>
9
<li><a>Как оформить код - кратко о стандартах</a></li>
9
<li><a>Как оформить код - кратко о стандартах</a></li>
10
<li><a>Что нужно помнить о директивах</a></li>
10
<li><a>Что нужно помнить о директивах</a></li>
11
<li><a>Преимущества и недостатки</a></li>
11
<li><a>Преимущества и недостатки</a></li>
12
<li><a>Отрасли применения</a></li>
12
<li><a>Отрасли применения</a></li>
13
<li><a>Устройство языка</a></li>
13
<li><a>Устройство языка</a></li>
14
<li><a>Востребованность ассемблера</a></li>
14
<li><a>Востребованность ассемблера</a></li>
15
<li><a>Целесообразность изучения новичками</a></li>
15
<li><a>Целесообразность изучения новичками</a></li>
16
<li><a>Основные инструкции</a></li>
16
<li><a>Основные инструкции</a></li>
17
</ul><p>Изучение языков программирования традиционно осуществляется на примере строки "Hello World". Обычно она используется для вывода информации на экран. В большинстве языков программирования для этого достаточно написать всего одну строку кода. Пример - Python. В нем для вывода упомянутой фразы требуется написать print(“Hello, World!”). Но есть язык, в котором для получения аналогичного результата требуется написать целый блок кода:</p>
17
</ul><p>Изучение языков программирования традиционно осуществляется на примере строки "Hello World". Обычно она используется для вывода информации на экран. В большинстве языков программирования для этого достаточно написать всего одну строку кода. Пример - Python. В нем для вывода упомянутой фразы требуется написать print(“Hello, World!”). Но есть язык, в котором для получения аналогичного результата требуется написать целый блок кода:</p>
18
<p>Это - Ассемблер. Он относится к низкоуровневым языкам разработки, а Python - к высокоуровневым. В нем каждая команда будет вызывать всего одну операцию процессора. Этот язык входит в ТОП самых популярных и изучаемых разработчиками. Новичкам на первых порах будет проблематично освоить его из-за сложности синтаксиса.</p>
18
<p>Это - Ассемблер. Он относится к низкоуровневым языкам разработки, а Python - к высокоуровневым. В нем каждая команда будет вызывать всего одну операцию процессора. Этот язык входит в ТОП самых популярных и изучаемых разработчиками. Новичкам на первых порах будет проблематично освоить его из-за сложности синтаксиса.</p>
19
<p>Далее предстоит выяснить, как работает ассемблер. Необходимо не только изучить определение этого инструмента, но и его ключевые особенности, сферы применения и базовые элементы. Предложенная информация рассчитана на широкую публику. Она пригодится и программистам-новичкам, и уже их более опытным коллегам.</p>
19
<p>Далее предстоит выяснить, как работает ассемблер. Необходимо не только изучить определение этого инструмента, но и его ключевые особенности, сферы применения и базовые элементы. Предложенная информация рассчитана на широкую публику. Она пригодится и программистам-новичкам, и уже их более опытным коллегам.</p>
20
<h2>Процессоры и машинный язык</h2>
20
<h2>Процессоры и машинный язык</h2>
21
<p>Чтобы понять, что собой представляет язык ассемблера, необходимо сначала разобраться в принципах функционирования процессора, а также в том, как с ним "контактировать" разработчикам и обычным пользователям.</p>
21
<p>Чтобы понять, что собой представляет язык ассемблера, необходимо сначала разобраться в принципах функционирования процессора, а также в том, как с ним "контактировать" разработчикам и обычным пользователям.</p>
22
<p>Процессор - это электронное устройство (сейчас оно представлено очень маленькой микросхемой, а раньше такое оборудование занимало целые комнаты), которое не понимает слов и цифр. Оно реагирует на два уровня напряжения:</p>
22
<p>Процессор - это электронное устройство (сейчас оно представлено очень маленькой микросхемой, а раньше такое оборудование занимало целые комнаты), которое не понимает слов и цифр. Оно реагирует на два уровня напряжения:</p>
23
<ul><li>высокий - единица;</li>
23
<ul><li>высокий - единица;</li>
24
<li>низкий - ноль.</li>
24
<li>низкий - ноль.</li>
25
</ul><p>Из-за этого каждая процессорная команда представлена последовательностью единиц и нулей, где 1 - это "импульс есть", а 0 - импульс отсутствует.</p>
25
</ul><p>Из-за этого каждая процессорная команда представлена последовательностью единиц и нулей, где 1 - это "импульс есть", а 0 - импульс отсутствует.</p>
26
<p>Для того, чтобы работать с процессором, программисты используют машинный язык. Он включает в себя инструкции, написанные в двоичном коде. Каждая такая инструкция определяет одну операцию: логическую (поразрядную), арифметическую над числами, ввод-вывод и так далее.</p>
26
<p>Для того, чтобы работать с процессором, программисты используют машинный язык. Он включает в себя инструкции, написанные в двоичном коде. Каждая такая инструкция определяет одну операцию: логическую (поразрядную), арифметическую над числами, ввод-вывод и так далее.</p>
27
<p>Писать программы с помощью машинного кода - непростая задача. Для этого придется работать с огромными цепочками, состоящими из единиц и нулей. Создать или произвести проверку подобного приложения проблематично, а разобраться в чужом коде - и подавно.</p>
27
<p>Писать программы с помощью машинного кода - непростая задача. Для этого придется работать с огромными цепочками, состоящими из единиц и нулей. Создать или произвести проверку подобного приложения проблематично, а разобраться в чужом коде - и подавно.</p>
28
<p>Именно поэтому много лет назад появился язык ассемблера. В нем коды операций обозначались буквами и сокращениями английских слов, отражающих суть команды. Пример - команда mov ax 6 указывает на необходимость перемещения числа 6 в ячейку памяти AX.</p>
28
<p>Именно поэтому много лет назад появился язык ассемблера. В нем коды операций обозначались буквами и сокращениями английских слов, отражающих суть команды. Пример - команда mov ax 6 указывает на необходимость перемещения числа 6 в ячейку памяти AX.</p>
29
<h2>История создания</h2>
29
<h2>История создания</h2>
30
<p>Создан ассемблер в 40-х годах 20-го века. Он разработан для первых ЭВМ на электронных лампах, программы для которых создавались на машинном языке. Из-за того, что памяти у компьютеров было мало, команды вводились путем переключения тумблеров и нажимания разнообразных кнопок. Даже несложные вычисления отнимали много времени.</p>
30
<p>Создан ассемблер в 40-х годах 20-го века. Он разработан для первых ЭВМ на электронных лампах, программы для которых создавались на машинном языке. Из-за того, что памяти у компьютеров было мало, команды вводились путем переключения тумблеров и нажимания разнообразных кнопок. Даже несложные вычисления отнимали много времени.</p>
31
<p>Проблема была решена, когда ЭВМ научились хранить приложения в памяти. К 1950-му году была создана первая программа-транслятор, которая переводила машинный язык программного обеспечения в написанный на понятном человеку языке. Такая программа получила название программы-сборщика, а язык - язык ассемблера (assembler - сборщик).</p>
31
<p>Проблема была решена, когда ЭВМ научились хранить приложения в памяти. К 1950-му году была создана первая программа-транслятор, которая переводила машинный язык программного обеспечения в написанный на понятном человеку языке. Такая программа получила название программы-сборщика, а язык - язык ассемблера (assembler - сборщик).</p>
32
<p>Его появление достаточно сильно облегчило жизнь разработчикам. Вместо двоичных кодов теперь стало возможным использование команд, которые приближены по своему составу (написанию) к обычному языку условных обозначений. Ассемблер также позволил значительно уменьшить размер приложений - для устройств тех времен этот момент оказался особо значимым.</p>
32
<p>Его появление достаточно сильно облегчило жизнь разработчикам. Вместо двоичных кодов теперь стало возможным использование команд, которые приближены по своему составу (написанию) к обычному языку условных обозначений. Ассемблер также позволил значительно уменьшить размер приложений - для устройств тех времен этот момент оказался особо значимым.</p>
33
<h2>Определение</h2>
33
<h2>Определение</h2>
34
<p>Язык ассемблера (assembly language) - это представление команд процессора в форме, доступной для чтения пользователем. Он является низкоуровневым. Программы, которые на нем написаны, однозначно переводятся в инструкции конкретного процессора. В большинстве случаев они не могут быть перенесены без существенных изменений для запуска на машине с другой системой команд.</p>
34
<p>Язык ассемблера (assembly language) - это представление команд процессора в форме, доступной для чтения пользователем. Он является низкоуровневым. Программы, которые на нем написаны, однозначно переводятся в инструкции конкретного процессора. В большинстве случаев они не могут быть перенесены без существенных изменений для запуска на машине с другой системой команд.</p>
35
<p>Ассемблер - программа, преобразующая код на языке ассемблера в машинный. Приложение, выполняющее обратную задачу, носит название дизассемблера.</p>
35
<p>Ассемблер - программа, преобразующая код на языке ассемблера в машинный. Приложение, выполняющее обратную задачу, носит название дизассемблера.</p>
36
<h2>Синтаксис</h2>
36
<h2>Синтаксис</h2>
37
<p>У ассемблера отсутствует общепринятый стандарт синтаксиса. Большинство разработчиков придерживаются традиционных подходов. Основные стандарты:</p>
37
<p>У ассемблера отсутствует общепринятый стандарт синтаксиса. Большинство разработчиков придерживаются традиционных подходов. Основные стандарты:</p>
38
<ul><li>Intel-синтаксис;</li>
38
<ul><li>Intel-синтаксис;</li>
39
<li>AT&T-синтаксис.</li>
39
<li>AT&T-синтаксис.</li>
40
</ul><p>Общий формат записи инструкций для обоих стандартов будет одинаковым:</p>
40
</ul><p>Общий формат записи инструкций для обоих стандартов будет одинаковым:</p>
41
<p>[метка:] опкод [операнды] [; комментарий]</p>
41
<p>[метка:] опкод [операнды] [; комментарий]</p>
42
<p>Опкод - это и есть ассемблер-команда, мнемоника инструкции к процессору. К ней иногда добавляются префиксы (повторения, изменения типа адресации). В качестве операндов выступают:</p>
42
<p>Опкод - это и есть ассемблер-команда, мнемоника инструкции к процессору. К ней иногда добавляются префиксы (повторения, изменения типа адресации). В качестве операндов выступают:</p>
43
<ul><li>константы;</li>
43
<ul><li>константы;</li>
44
<li>названия регистров;</li>
44
<li>названия регистров;</li>
45
<li>адреса в оперативной памяти;</li>
45
<li>адреса в оперативной памяти;</li>
46
<li>иные элементы.</li>
46
<li>иные элементы.</li>
47
</ul><p>Разница между Intel и AT&T заключается в основном порядке перечисления операндов и их синтаксиса при разных методах адресации.</p>
47
</ul><p>Разница между Intel и AT&T заключается в основном порядке перечисления операндов и их синтаксиса при разных методах адресации.</p>
48
<p>Используемые команды обычно являются одинаковыми для всех процессоров в пределах одной архитектуры или семейства архитектур (наиболее известны команды процессоров и контроллеров Motorola, ARM, x86). Они будут описываться в спецификации процессоров.</p>
48
<p>Используемые команды обычно являются одинаковыми для всех процессоров в пределах одной архитектуры или семейства архитектур (наиболее известны команды процессоров и контроллеров Motorola, ARM, x86). Они будут описываться в спецификации процессоров.</p>
49
<p>Пример - процессор Zilog Z80 унаследовал систему команд Intel i8080, расширил ее и изменил некоторые операции и обозначения регистров на свой лад: mov стал ld и так далее. Процессоры Motorola Fireball унаследовали команды Z80, несколько урезав их. Дополнительно Motorola официально вернулась к Intel-командам. Сейчас половина ассемблеров для Fireball функционирует именно с ними, а половина - с Zilog.</p>
49
<p>Пример - процессор Zilog Z80 унаследовал систему команд Intel i8080, расширил ее и изменил некоторые операции и обозначения регистров на свой лад: mov стал ld и так далее. Процессоры Motorola Fireball унаследовали команды Z80, несколько урезав их. Дополнительно Motorola официально вернулась к Intel-командам. Сейчас половина ассемблеров для Fireball функционирует именно с ними, а половина - с Zilog.</p>
50
<h3>Мнемоники</h3>
50
<h3>Мнемоники</h3>
51
<p>Базовая конструкция ассемблера - это мнемоника. Он также называется мнемокодом. Так характеризуется символьное представление процессорной команды. Она включает в себя несколько символов, включая производное. Мнемоника может выступать в виде объекта, над которым осуществляется операция (стек, регистр, память), а также другие особенности (условия исполнения, влияние на регистр флагов и так далее), но в других диалектах может задаваться в операндах.</p>
51
<p>Базовая конструкция ассемблера - это мнемоника. Он также называется мнемокодом. Так характеризуется символьное представление процессорной команды. Она включает в себя несколько символов, включая производное. Мнемоника может выступать в виде объекта, над которым осуществляется операция (стек, регистр, память), а также другие особенности (условия исполнения, влияние на регистр флагов и так далее), но в других диалектах может задаваться в операндах.</p>
52
<p>Ассемблер для каждого процессора обладает собственным традиционным набором, но встречаются ассемблеры с кроссплатформенным синтаксисом (пример - упомянутый ранее AT&T). В них кроссплатформенными выступают только обозначения. Код одного процессора не сможет напрямую оказаться перенесенным на другой.</p>
52
<p>Ассемблер для каждого процессора обладает собственным традиционным набором, но встречаются ассемблеры с кроссплатформенным синтаксисом (пример - упомянутый ранее AT&T). В них кроссплатформенными выступают только обозначения. Код одного процессора не сможет напрямую оказаться перенесенным на другой.</p>
53
<h3>Операнды</h3>
53
<h3>Операнды</h3>
54
<p>Задумываясь, что пишут на ассемблере, необходимо сначала хорошо разобраться в особенностях этого языка, а также в его синтаксисе. Он включает в себя различные операнды. Ими могут выступать:</p>
54
<p>Задумываясь, что пишут на ассемблере, необходимо сначала хорошо разобраться в особенностях этого языка, а также в его синтаксисе. Он включает в себя различные операнды. Ими могут выступать:</p>
55
<ul><li>адреса ячеек памяти и портов ввода-вывода;</li>
55
<ul><li>адреса ячеек памяти и портов ввода-вывода;</li>
56
<li>константные значения;</li>
56
<li>константные значения;</li>
57
<li>регистры;</li>
57
<li>регистры;</li>
58
<li>метки;</li>
58
<li>метки;</li>
59
<li>константы.</li>
59
<li>константы.</li>
60
</ul><p>Разные assemblers могут требовать применения разного порядка операндов: в одних реализациях первым идет оператор, в который будет записано значение, а в других он прописывается последним. Операнды отделяются от мнемоник-команд с помощью пробелов.</p>
60
</ul><p>Разные assemblers могут требовать применения разного порядка операндов: в одних реализациях первым идет оператор, в который будет записано значение, а в других он прописывается последним. Операнды отделяются от мнемоник-команд с помощью пробелов.</p>
61
<h3>Литералы</h3>
61
<h3>Литералы</h3>
62
<p>Наиболее распространенный тип данных, с которым работает основная масса процессоров - целые числа, упакованные в машинные слова, либо один или несколько байтов. Реже используются числа с плавающими запятыми.</p>
62
<p>Наиболее распространенный тип данных, с которым работает основная масса процессоров - целые числа, упакованные в машинные слова, либо один или несколько байтов. Реже используются числа с плавающими запятыми.</p>
63
<p>Рассматриваемый язык чаще использует значения, заданные в разных системах счисления. В компьютерах с 8-битным байтом обычно задействуется шестнадцатеричная запись числа, так как в один байт помещаются две 16-ричные цифры. Некоторые значения записываются в виде двоичных кодов. В ранних компьютерах с 6-битным байтом встречалась восьмеричная система счисления. Способы записи могут отличаться в разных языках ассемблера:</p>
63
<p>Рассматриваемый язык чаще использует значения, заданные в разных системах счисления. В компьютерах с 8-битным байтом обычно задействуется шестнадцатеричная запись числа, так как в один байт помещаются две 16-ричные цифры. Некоторые значения записываются в виде двоичных кодов. В ранних компьютерах с 6-битным байтом встречалась восьмеричная система счисления. Способы записи могут отличаться в разных языках ассемблера:</p>
64
<ol><li>Для того, чтобы записать числа в десятичной системе счисления в одних трансляторах, используется представление только в виде цифр (255, 11115), в то время как в других для этого необходимо начать число с точки (.255, .11115).</li>
64
<ol><li>Для того, чтобы записать числа в десятичной системе счисления в одних трансляторах, используется представление только в виде цифр (255, 11115), в то время как в других для этого необходимо начать число с точки (.255, .11115).</li>
65
<li>В шестнадцатеричной системе счисления числа записываются путем добавления в самое начало префикса "0x". Встречаются языки ассемблера, где этот элемент не используется. Вместо него в конце числа добавляется "h". А в некоторых задействуются исключительно цифры. В последних двух ситуациях у чисел, которые начинаются с A-F, для отличия их от символьных имен, впереди добавляется ноль.</li>
65
<li>В шестнадцатеричной системе счисления числа записываются путем добавления в самое начало префикса "0x". Встречаются языки ассемблера, где этот элемент не используется. Вместо него в конце числа добавляется "h". А в некоторых задействуются исключительно цифры. В последних двух ситуациях у чисел, которые начинаются с A-F, для отличия их от символьных имен, впереди добавляется ноль.</li>
66
<li>Восьмеричная система счисления требует для выражения цифр в некоторых трансляторах ставить ведущий ноль (в самом начале имеющегося значения), в других префикс - это буква "О", а число заключается в апострофы.</li>
66
<li>Восьмеричная система счисления требует для выражения цифр в некоторых трансляторах ставить ведущий ноль (в самом начале имеющегося значения), в других префикс - это буква "О", а число заключается в апострофы.</li>
67
<li>Чтобы записать константу в двоичной системе, используется следующий формат: b ‘10010111’.</li>
67
<li>Чтобы записать константу в двоичной системе, используется следующий формат: b ‘10010111’.</li>
68
</ol><p>Иногда необходимо задавать блоки данных, которые загружаются вместе с программным кодом. Для этого язык программирования ассемблер включает в себя специализированные директивы. Некоторые современные его интерпретации предусматривают организацию данных в виде разнообразных структур.</p>
68
</ol><p>Иногда необходимо задавать блоки данных, которые загружаются вместе с программным кодом. Для этого язык программирования ассемблер включает в себя специализированные директивы. Некоторые современные его интерпретации предусматривают организацию данных в виде разнообразных структур.</p>
69
<h3>Компоненты выразительности</h3>
69
<h3>Компоненты выразительности</h3>
70
<p>Ассемблерный код может включать в себя разнообразные конструкции, облегчающие чтение приложения, снятия с разработчика ответственности за необходимость слежки за адресами инструкций, а также реализации компонентов, характерных высокоуровневым языкам.</p>
70
<p>Ассемблерный код может включать в себя разнообразные конструкции, облегчающие чтение приложения, снятия с разработчика ответственности за необходимость слежки за адресами инструкций, а также реализации компонентов, характерных высокоуровневым языкам.</p>
71
<p>В их спектр включены:</p>
71
<p>В их спектр включены:</p>
72
<ol><li>Метки - они указывают на места в приложении, на которые может производиться условный или безусловный переход, вызов процедуры, хранение информации и некоторые иные операции. При ассемблировании метка будет преобразована в адрес.</li>
72
<ol><li>Метки - они указывают на места в приложении, на которые может производиться условный или безусловный переход, вызов процедуры, хранение информации и некоторые иные операции. При ассемблировании метка будет преобразована в адрес.</li>
73
<li>Комментарии. Они имеют огромное значение для будущего проекта. Комментарий в рассматриваемом средстве разработки - это то же самое, что и комментарий в высокоуровневом ЯП. Самодокументированность кода в assembler не поддерживается.</li>
73
<li>Комментарии. Они имеют огромное значение для будущего проекта. Комментарий в рассматриваемом средстве разработки - это то же самое, что и комментарий в высокоуровневом ЯП. Самодокументированность кода в assembler не поддерживается.</li>
74
<li>Именованные константы - с их помощью получится дать осмысленное имя числовому значению, а также централизованно внести в него изменения. В процессе ассемблирования константа будет заменена на соответствующее ей значение.</li>
74
<li>Именованные константы - с их помощью получится дать осмысленное имя числовому значению, а также централизованно внести в него изменения. В процессе ассемблирования константа будет заменена на соответствующее ей значение.</li>
75
<li>Директивы в языке ассемблера - дают возможность задавать режимы ассемблирования, а также производить условную трансляцию и некоторые другие операции.</li>
75
<li>Директивы в языке ассемблера - дают возможность задавать режимы ассемблирования, а также производить условную трансляцию и некоторые другие операции.</li>
76
<li>Макросы - дают возможность упаковывать наиболее часто встречающиеся последовательности команд, дав им осмысленное название (имя).</li>
76
<li>Макросы - дают возможность упаковывать наиболее часто встречающиеся последовательности команд, дав им осмысленное название (имя).</li>
77
</ol><p>Это основной синтаксис рассматриваемого средства разработки. Он разнообразен и каждая его интерпретация обладает своими особенностями.</p>
77
</ol><p>Это основной синтаксис рассматриваемого средства разработки. Он разнообразен и каждая его интерпретация обладает своими особенностями.</p>
78
<h2>Как оформить код - кратко о стандартах</h2>
78
<h2>Как оформить код - кратко о стандартах</h2>
79
<p>В языке ассемблера отступы и операторные скобки, характерные для высокоуровневых средств разработки, обычно не используются. Код записывается в несколько колонок. Каждая из них включает в себя:</p>
79
<p>В языке ассемблера отступы и операторные скобки, характерные для высокоуровневых средств разработки, обычно не используются. Код записывается в несколько колонок. Каждая из них включает в себя:</p>
80
<ul><li>адрес инструкции (не является обязательным элементом);</li>
80
<ul><li>адрес инструкции (не является обязательным элементом);</li>
81
<li>метки;</li>
81
<li>метки;</li>
82
<li>мнемонику инструкции;</li>
82
<li>мнемонику инструкции;</li>
83
<li>операнды;</li>
83
<li>операнды;</li>
84
<li>комментарии.</li>
84
<li>комментарии.</li>
85
</ul><p>Такая форма записи отражает особенность исполнения приложений на процессорах общего назначения: на уровне машинных кодов программное обеспечение линейно и не имеет никакой структуры. Из одного места АО допускается переход на другое безотносительно того, где расположено начало кода. приложение продолжит исполнение с того места, куда был произведен переход.</p>
85
</ul><p>Такая форма записи отражает особенность исполнения приложений на процессорах общего назначения: на уровне машинных кодов программное обеспечение линейно и не имеет никакой структуры. Из одного места АО допускается переход на другое безотносительно того, где расположено начало кода. приложение продолжит исполнение с того места, куда был произведен переход.</p>
86
<h2>Что нужно помнить о директивах</h2>
86
<h2>Что нужно помнить о директивах</h2>
87
<p>Кроме ассемблерных команд приложение может включать в себя разнообразные директивы - операции, не переводящиеся непосредственно в машинный код. Они отвечают за управление работой компилятора. Их набор и синтаксис значительно разнятся и зависят не от аппаратных платформ, а непосредственно от задействованного компилятора. В качестве директив выделяются следующие элементы:</p>
87
<p>Кроме ассемблерных команд приложение может включать в себя разнообразные директивы - операции, не переводящиеся непосредственно в машинный код. Они отвечают за управление работой компилятора. Их набор и синтаксис значительно разнятся и зависят не от аппаратных платформ, а непосредственно от задействованного компилятора. В качестве директив выделяются следующие элементы:</p>
88
<ul><li>определение данных (переменных и констант);</li>
88
<ul><li>определение данных (переменных и констант);</li>
89
<li>управление организацией приложения в памяти;</li>
89
<li>управление организацией приложения в памяти;</li>
90
<li>манипулирование характеристиками выходных файлов;</li>
90
<li>манипулирование характеристиками выходных файлов;</li>
91
<li>задание режима функционирования компилятора;</li>
91
<li>задание режима функционирования компилятора;</li>
92
<li>абстракции (элементы языков высокого уровня) - от оформления функций и процедур (чтобы упростить реализацию передачи параметров) до условных конструкций и циклов;</li>
92
<li>абстракции (элементы языков высокого уровня) - от оформления функций и процедур (чтобы упростить реализацию передачи параметров) до условных конструкций и циклов;</li>
93
<li>макросы.</li>
93
<li>макросы.</li>
94
</ul><p>Пользоваться директивами можно по собственному усмотрению. Обычно их новички на первых порах не изучают.</p>
94
</ul><p>Пользоваться директивами можно по собственному усмотрению. Обычно их новички на первых порах не изучают.</p>
95
<h2>Преимущества и недостатки</h2>
95
<h2>Преимущества и недостатки</h2>
96
<p>Перед более глубоким и детальным изучением языка ассемблера необходимо запомнить его преимущества и недостатки. Зная их, разработчик сможет понять, насколько целесообразно применение этого ЯП для создания того или иного программного обеспечения.</p>
96
<p>Перед более глубоким и детальным изучением языка ассемблера необходимо запомнить его преимущества и недостатки. Зная их, разработчик сможет понять, насколько целесообразно применение этого ЯП для создания того или иного программного обеспечения.</p>
97
<p>К сильным сторонам ассемблера можно отнести следующие моменты:</p>
97
<p>К сильным сторонам ассемблера можно отнести следующие моменты:</p>
98
<ul><li>минимальное количество избыточного кода;</li>
98
<ul><li>минимальное количество избыточного кода;</li>
99
<li>большая скорость обработки информации;</li>
99
<li>большая скорость обработки информации;</li>
100
<li>меньший размер приложения, чем в случае с использованием высокоуровневого языка;</li>
100
<li>меньший размер приложения, чем в случае с использованием высокоуровневого языка;</li>
101
<li>непосредственный доступ к аппаратуре: регистрам процессора, портам ввода-вывода;</li>
101
<li>непосредственный доступ к аппаратуре: регистрам процессора, портам ввода-вывода;</li>
102
<li>возможность создания самомодифицирующегося кода (можно позволить программе создавать или изменять часть своего кода в процессе выполнения, причем без применения интерпретатора);</li>
102
<li>возможность создания самомодифицирующегося кода (можно позволить программе создавать или изменять часть своего кода в процессе выполнения, причем без применения интерпретатора);</li>
103
<li>максимальное соответствие требованиям необходимой платформы (использование специальных инструкций, технических особенностей имеющегося оборудования).</li>
103
<li>максимальное соответствие требованиям необходимой платформы (использование специальных инструкций, технических особенностей имеющегося оборудования).</li>
104
</ul><p>Недостатки у ассемблера тоже есть. К ним относят:</p>
104
</ul><p>Недостатки у ассемблера тоже есть. К ним относят:</p>
105
<ul><li>огромные объемы исходного кода;</li>
105
<ul><li>огромные объемы исходного кода;</li>
106
<li>большое количество дополнительных небольших задач;</li>
106
<li>большое количество дополнительных небольших задач;</li>
107
<li>меньшее количество доступных для использования библиотек;</li>
107
<li>меньшее количество доступных для использования библиотек;</li>
108
<li>низкий уровень совместимости библиотек;</li>
108
<li>низкий уровень совместимости библиотек;</li>
109
<li>плохая читабельность кода;</li>
109
<li>плохая читабельность кода;</li>
110
<li>трудность поддержки программного обеспечения;</li>
110
<li>трудность поддержки программного обеспечения;</li>
111
<li>невозможность перенести программы на другие платформы (кроме двоично совместимых).</li>
111
<li>невозможность перенести программы на другие платформы (кроме двоично совместимых).</li>
112
</ul><p>Для начинающих программистов ассемблер - достаточно сложное средство программирования. Но изучить его все равно можно даже тем, кто в разработке имеет минимальный опыт. Главное - действовать последовательно и не торопиться.</p>
112
</ul><p>Для начинающих программистов ассемблер - достаточно сложное средство программирования. Но изучить его все равно можно даже тем, кто в разработке имеет минимальный опыт. Главное - действовать последовательно и не торопиться.</p>
113
<h2>Отрасли применения</h2>
113
<h2>Отрасли применения</h2>
114
<p>Ассемблер практически вытеснен из практического применения - его полностью заменяют более простые для изучения и понимания, а также практического применения языки высокого уровня. Но он все равно встречается в некоторых отраслях. А именно в:</p>
114
<p>Ассемблер практически вытеснен из практического применения - его полностью заменяют более простые для изучения и понимания, а также практического применения языки высокого уровня. Но он все равно встречается в некоторых отраслях. А именно в:</p>
115
<ol><li>Разработке встроенного программного обеспечения. Так называются небольшие приложения, которые не требуют значительного объема памяти на таких устройствах как телефоны, автомобильные системы зажигания, видеокарты, звуковые карты, системы безопасности, модемы, принтеры. Ассемблер для них - идеальное решение.</li>
115
<ol><li>Разработке встроенного программного обеспечения. Так называются небольшие приложения, которые не требуют значительного объема памяти на таких устройствах как телефоны, автомобильные системы зажигания, видеокарты, звуковые карты, системы безопасности, модемы, принтеры. Ассемблер для них - идеальное решение.</li>
116
<li>Компьютерных и игровых консолях для того, чтобы оптимизировать и уменьшить объемы кода. За счет ассемблера можно добиться быстродействия.</li>
116
<li>Компьютерных и игровых консолях для того, чтобы оптимизировать и уменьшить объемы кода. За счет ассемблера можно добиться быстродействия.</li>
117
<li>Использовании в приложении новых команд, которые доступны на новых процессорах. Высокоуровневые компиляторы оптимизируют код в процессе компиляции, но почти не способны генерировать инструкции из расширенных наборов команд вроде AVX, XOP, CTV. Связано это с тем, что команды в процессоры добавляются быстрее, чем в компиляторах возникает логика для их генерации.</li>
117
<li>Использовании в приложении новых команд, которые доступны на новых процессорах. Высокоуровневые компиляторы оптимизируют код в процессе компиляции, но почти не способны генерировать инструкции из расширенных наборов команд вроде AVX, XOP, CTV. Связано это с тем, что команды в процессоры добавляются быстрее, чем в компиляторах возникает логика для их генерации.</li>
118
<li>Графических процессорах GPU.</li>
118
<li>Графических процессорах GPU.</li>
119
<li>Кодах, создание которых невозможно или затрудняется на высокоуровневых языках. Пример - получение дампа памяти/стека. Даже когда аналог на языке высокого уровня является возможным, преимущество ассемблера может оказаться значительным. Пример - подсчет среднего арифметического с учетом переполнения для x86 процессоров занимает две команды (сложение с выставлением флага переноса и сдвиг с займом этого флага). Аналог на языке высокого уровня ((long) x+y) может либо вообще перестать работать, ведь sizeof (long)==sizeof (int), либо в процессе компиляции начнет конвертироваться огромное количество команд процессора.</li>
119
<li>Кодах, создание которых невозможно или затрудняется на высокоуровневых языках. Пример - получение дампа памяти/стека. Даже когда аналог на языке высокого уровня является возможным, преимущество ассемблера может оказаться значительным. Пример - подсчет среднего арифметического с учетом переполнения для x86 процессоров занимает две команды (сложение с выставлением флага переноса и сдвиг с займом этого флага). Аналог на языке высокого уровня ((long) x+y) может либо вообще перестать работать, ведь sizeof (long)==sizeof (int), либо в процессе компиляции начнет конвертироваться огромное количество команд процессора.</li>
120
<li>Написании антивирусных систем, а также вирусов.</li>
120
<li>Написании антивирусных систем, а также вирусов.</li>
121
<li>Взломе и reverse engineering. Ассемблер - это мощнейший инструмент в руках реверсера. Отладка программного обеспечения, а также дизассемблирование без знания рассматриваемого языка программирования становится невозможным.</li>
121
<li>Взломе и reverse engineering. Ассемблер - это мощнейший инструмент в руках реверсера. Отладка программного обеспечения, а также дизассемблирование без знания рассматриваемого языка программирования становится невозможным.</li>
122
</ol><p>Также этот язык хорошо подходит для того, чтобы начать изучение программирования. Он может пригодиться каждому программисту для оптимизации функционирования того или иного программного обеспечения.</p>
122
</ol><p>Также этот язык хорошо подходит для того, чтобы начать изучение программирования. Он может пригодиться каждому программисту для оптимизации функционирования того или иного программного обеспечения.</p>
123
<h2>Устройство языка</h2>
123
<h2>Устройство языка</h2>
124
<p>Assembler - средство программирования второго поколения, если за первое взять машинный. Он будет работать непосредственно с процессором, а каждая команда представляет собой процессорную инструкцию. Она не является операцией операционных или файловых систем. Процесс перевода assembler в машинный код - это ассемблирование.</p>
124
<p>Assembler - средство программирования второго поколения, если за первое взять машинный. Он будет работать непосредственно с процессором, а каждая команда представляет собой процессорную инструкцию. Она не является операцией операционных или файловых систем. Процесс перевода assembler в машинный код - это ассемблирование.</p>
125
<p>Команды рассматриваемого средства разработки включают в себя коды операций и операндов. Операндами являются адреса, из которых процессор берет данные для расчетов и вычислений и в которые он помещает результат. Адреса - это ячейки оперативной памяти и регистры - память внутри процессора. Процессор контактирует с регистрами намного быстрее, чем с имеющейся оперативной памятью устройства.</p>
125
<p>Команды рассматриваемого средства разработки включают в себя коды операций и операндов. Операндами являются адреса, из которых процессор берет данные для расчетов и вычислений и в которые он помещает результат. Адреса - это ячейки оперативной памяти и регистры - память внутри процессора. Процессор контактирует с регистрами намного быстрее, чем с имеющейся оперативной памятью устройства.</p>
126
<p>Коды операций в рассматриваемом средстве разработки - мнемонические. Они являются удобными для запоминания:</p>
126
<p>Коды операций в рассматриваемом средстве разработки - мнемонические. Они являются удобными для запоминания:</p>
127
<ul><li>MUL - умножение (от английского multiplication);</li>
127
<ul><li>MUL - умножение (от английского multiplication);</li>
128
<li>SUB - вычитание (subtraction);</li>
128
<li>SUB - вычитание (subtraction);</li>
129
<li>ADD - сложение (addition).</li>
129
<li>ADD - сложение (addition).</li>
130
</ul><p>Регистры и ячейки памяти получают символические имена:</p>
130
</ul><p>Регистры и ячейки памяти получают символические имена:</p>
131
<ul><li>EAX, EBX, AX, AH - имена для регистров;</li>
131
<ul><li>EAX, EBX, AX, AH - имена для регистров;</li>
132
<li>meml - имя для ячейки памяти.</li>
132
<li>meml - имя для ячейки памяти.</li>
133
</ul><p>Пример сложения чисел из регистров BX и AX: add BX, AX. Вычитание выглядит так: sub bx, ax.</p>
133
</ul><p>Пример сложения чисел из регистров BX и AX: add BX, AX. Вычитание выглядит так: sub bx, ax.</p>
134
<p>Помимо инструкций, в ассемблере имеются директивы - команды управления компилятором. А точнее - приложением-ассемблером. Вот несколько из них:</p>
134
<p>Помимо инструкций, в ассемблере имеются директивы - команды управления компилятором. А точнее - приложением-ассемблером. Вот несколько из них:</p>
135
<ul><li>DEF - назначение регистру символического имени;</li>
135
<ul><li>DEF - назначение регистру символического имени;</li>
136
<li>EXIT - прекращение компиляции документа/файла;</li>
136
<li>EXIT - прекращение компиляции документа/файла;</li>
137
<li>INCLUDE - открытие файла и начало его компиляции.</li>
137
<li>INCLUDE - открытие файла и начало его компиляции.</li>
138
</ul><p>Ассемблер - вовсе не набор инструкций процессора с удобной для разработчика записью. Это полноценное средство разработки, на котором организовываются циклы, условные переходы, функции, а также процедуры и другие элементы.</p>
138
</ul><p>Ассемблер - вовсе не набор инструкций процессора с удобной для разработчика записью. Это полноценное средство разработки, на котором организовываются циклы, условные переходы, функции, а также процедуры и другие элементы.</p>
139
<p>Вот пример кода, с помощью которого получится вывести на дисплей цифры от 1 до 10:</p>
139
<p>Вот пример кода, с помощью которого получится вывести на дисплей цифры от 1 до 10:</p>
140
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>Операции в предложенном примере выполняются в цикле - как в for или do while в высокоуровневых языках программирования.</p>
140
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>Операции в предложенном примере выполняются в цикле - как в for или do while в высокоуровневых языках программирования.</p>
141
<p>У ассемблера отсутствует единый стандарт работы. Одна и та же команда в разных процессорах будет выглядеть по-разному. В синтаксисе Intel mov eax, ebx отвечает за перемещение информации из регистра eax в регистр ebx. В AT&T аналогичная операция ассемблера будет иметь вид movl %eax, %ebx.</p>
141
<p>У ассемблера отсутствует единый стандарт работы. Одна и та же команда в разных процессорах будет выглядеть по-разному. В синтаксисе Intel mov eax, ebx отвечает за перемещение информации из регистра eax в регистр ebx. В AT&T аналогичная операция ассемблера будет иметь вид movl %eax, %ebx.</p>
142
<h2>Востребованность ассемблера</h2>
142
<h2>Востребованность ассемблера</h2>
143
<p>Программирование на ассемблере - разработка программного обеспечения, которая является достаточно востребованной. На сайтах по поиску работы заявок от работодателей с заголовками, указывающими на поиск программиста со знаниями рассматриваемого средства программирования, найти не получится. Вместо этого там очень много вакансий с высокоуровневыми ЯП: Python, C++, C и других. Ассемблер отлично дополнит их в процессе выполнения должностных обязанностей.</p>
143
<p>Программирование на ассемблере - разработка программного обеспечения, которая является достаточно востребованной. На сайтах по поиску работы заявок от работодателей с заголовками, указывающими на поиск программиста со знаниями рассматриваемого средства программирования, найти не получится. Вместо этого там очень много вакансий с высокоуровневыми ЯП: Python, C++, C и других. Ассемблер отлично дополнит их в процессе выполнения должностных обязанностей.</p>
144
<p>Обычно востребованность рассматриваемого средства разработки подчеркивается в вакансиях:</p>
144
<p>Обычно востребованность рассматриваемого средства разработки подчеркивается в вакансиях:</p>
145
<ul><li>специалиста по компьютерной безопасности;</li>
145
<ul><li>специалиста по компьютерной безопасности;</li>
146
<li>разработка драйверов;</li>
146
<li>разработка драйверов;</li>
147
<li>программиста приложений для микропроцессоров и микроконтроллеров;</li>
147
<li>программиста приложений для микропроцессоров и микроконтроллеров;</li>
148
<li>системных разработчиков.</li>
148
<li>системных разработчиков.</li>
149
</ul><p>Средняя зарплата в IT для программиста, знающего ассемблер, составляет от 80 до 300 тысяч рублей. Более точный заработок зависит от опыта специалиста, его квалификации, а также спектра должностных обязанностей и специфики конкретной компании.</p>
149
</ul><p>Средняя зарплата в IT для программиста, знающего ассемблер, составляет от 80 до 300 тысяч рублей. Более точный заработок зависит от опыта специалиста, его квалификации, а также спектра должностных обязанностей и специфики конкретной компании.</p>
150
<h2>Целесообразность изучения новичками</h2>
150
<h2>Целесообразность изучения новичками</h2>
151
<p>Рассматриваемое средство программирования для изучения новичками подойдет не лучшим образом. Для этого существует ряд причин:</p>
151
<p>Рассматриваемое средство программирования для изучения новичками подойдет не лучшим образом. Для этого существует ряд причин:</p>
152
<ol><li>Оно слишком сильно отличается от других ЯП, особенно от высокоуровневых. Переходить с assembler на другое средство разработки программного обеспечения потом будет очень тяжело.</li>
152
<ol><li>Оно слишком сильно отличается от других ЯП, особенно от высокоуровневых. Переходить с assembler на другое средство разработки программного обеспечения потом будет очень тяжело.</li>
153
<li>Опыт, полученный с assembler, в других ЯП не пригодится. Высокоуровневые средства программирования после рассматриваемого изучаются "с нуля".</li>
153
<li>Опыт, полученный с assembler, в других ЯП не пригодится. Высокоуровневые средства программирования после рассматриваемого изучаются "с нуля".</li>
154
<li>Assembler - очень подробный ЯП. Рутинные манипуляции, которые в других средствах разработки на себя берет транслятор, в рассматриваемом описывается непосредственно программистом. Этот процесс быстро надоедает.</li>
154
<li>Assembler - очень подробный ЯП. Рутинные манипуляции, которые в других средствах разработки на себя берет транслятор, в рассматриваемом описывается непосредственно программистом. Этот процесс быстро надоедает.</li>
155
</ol><p>Именно поэтому, если человек заинтересован в обучении и трудоустройстве на профессию, связанную с assembler, лучше начать изучение высокоуровневых средств разработки. После них рассматриваемый ЯП освоить станет в разы проще.</p>
155
</ol><p>Именно поэтому, если человек заинтересован в обучении и трудоустройстве на профессию, связанную с assembler, лучше начать изучение высокоуровневых средств разработки. После них рассматриваемый ЯП освоить станет в разы проще.</p>
156
<h2>Основные инструкции</h2>
156
<h2>Основные инструкции</h2>
157
<p>Assembler имеет различные инструкции, которые помогут разрабатывать программное обеспечение. Ниже - таблица, которая поможет разобраться с ключевыми операциями:</p>
157
<p>Assembler имеет различные инструкции, которые помогут разрабатывать программное обеспечение. Ниже - таблица, которая поможет разобраться с ключевыми операциями:</p>
158
Описание командыИнтерпретацияЗагрузка значения в регистрMOVСложениеADDБезусловный переход к адресу или меткеJMPСравнение значений в регистрахCMPПереход к метке, если флаг JZ = 1JZ labelВычитаниеSubПобитовое И между имеющимися значениямиAndПобитовое или значения в регистреORПобитовое исключающее илиXORПустая операцияNOPПерекладывание значения из регистра в стекPushИзвлечение значения из стека в регистрPOPВызов подпрограммыCallВозврат из подпрограммыRetУвеличение значения в регистреIncУменьшение значения в регистреDecПобитовое отрицание значения в регистреNOTЗнаковое отрицание значения в регистреNEG<p>Теперь понятно, что собой представляет assembler. Лучше изучить его помогут дистанционные компьютерные курсы. В срок от пары месяцев до года даже не разбирающийся в программировании человек научится создавать собственные приложения на понравившемся языке. А свои навыки он подтвердит электронным сертификатом образовательного центра.</p>
158
Описание командыИнтерпретацияЗагрузка значения в регистрMOVСложениеADDБезусловный переход к адресу или меткеJMPСравнение значений в регистрахCMPПереход к метке, если флаг JZ = 1JZ labelВычитаниеSubПобитовое И между имеющимися значениямиAndПобитовое или значения в регистреORПобитовое исключающее илиXORПустая операцияNOPПерекладывание значения из регистра в стекPushИзвлечение значения из стека в регистрPOPВызов подпрограммыCallВозврат из подпрограммыRetУвеличение значения в регистреIncУменьшение значения в регистреDecПобитовое отрицание значения в регистреNOTЗнаковое отрицание значения в регистреNEG<p>Теперь понятно, что собой представляет assembler. Лучше изучить его помогут дистанционные компьютерные курсы. В срок от пары месяцев до года даже не разбирающийся в программировании человек научится создавать собственные приложения на понравившемся языке. А свои навыки он подтвердит электронным сертификатом образовательного центра.</p>
159
<p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a>Otus</a>!</em> </p>
159
<p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a>Otus</a>!</em> </p>
160
160