Изучение языков программирования традиционно осуществляется на примере строки «Hello World». Обычно она используется для вывода информации на экран. В большинстве языков программирования для этого достаточно написать всего одну строку кода. Пример – Python. В нем для вывода упомянутой фразы требуется написать print(“Hello, World!”). Но есть язык, в котором для получения аналогичного результата требуется написать целый блок кода:
Это – Ассемблер. Он относится к низкоуровневым языкам разработки, а Python – к высокоуровневым. В нем каждая команда будет вызывать всего одну операцию процессора. Этот язык входит в ТОП самых популярных и изучаемых разработчиками. Новичкам на первых порах будет проблематично освоить его из-за сложности синтаксиса.
Далее предстоит выяснить, как работает ассемблер. Необходимо не только изучить определение этого инструмента, но и его ключевые особенности, сферы применения и базовые элементы. Предложенная информация рассчитана на широкую публику. Она пригодится и программистам-новичкам, и уже их более опытным коллегам.
Процессоры и машинный язык
Чтобы понять, что собой представляет язык ассемблера, необходимо сначала разобраться в принципах функционирования процессора, а также в том, как с ним «контактировать» разработчикам и обычным пользователям.
Процессор – это электронное устройство (сейчас оно представлено очень маленькой микросхемой, а раньше такое оборудование занимало целые комнаты), которое не понимает слов и цифр. Оно реагирует на два уровня напряжения:
- высокий – единица;
- низкий – ноль.
Из-за этого каждая процессорная команда представлена последовательностью единиц и нулей, где 1 – это «импульс есть», а 0 – импульс отсутствует.
Для того, чтобы работать с процессором, программисты используют машинный язык. Он включает в себя инструкции, написанные в двоичном коде. Каждая такая инструкция определяет одну операцию: логическую (поразрядную), арифметическую над числами, ввод-вывод и так далее.
Писать программы с помощью машинного кода – непростая задача. Для этого придется работать с огромными цепочками, состоящими из единиц и нулей. Создать или произвести проверку подобного приложения проблематично, а разобраться в чужом коде – и подавно.
Именно поэтому много лет назад появился язык ассемблера. В нем коды операций обозначались буквами и сокращениями английских слов, отражающих суть команды. Пример – команда mov ax 6 указывает на необходимость перемещения числа 6 в ячейку памяти AX.
История создания
Создан ассемблер в 40-х годах 20-го века. Он разработан для первых ЭВМ на электронных лампах, программы для которых создавались на машинном языке. Из-за того, что памяти у компьютеров было мало, команды вводились путем переключения тумблеров и нажимания разнообразных кнопок. Даже несложные вычисления отнимали много времени.
Проблема была решена, когда ЭВМ научились хранить приложения в памяти. К 1950-му году была создана первая программа-транслятор, которая переводила машинный язык программного обеспечения в написанный на понятном человеку языке. Такая программа получила название программы-сборщика, а язык – язык ассемблера (assembler – сборщик).
Его появление достаточно сильно облегчило жизнь разработчикам. Вместо двоичных кодов теперь стало возможным использование команд, которые приближены по своему составу (написанию) к обычному языку условных обозначений. Ассемблер также позволил значительно уменьшить размер приложений – для устройств тех времен этот момент оказался особо значимым.
Определение
Язык ассемблера (assembly language) – это представление команд процессора в форме, доступной для чтения пользователем. Он является низкоуровневым. Программы, которые на нем написаны, однозначно переводятся в инструкции конкретного процессора. В большинстве случаев они не могут быть перенесены без существенных изменений для запуска на машине с другой системой команд.
Ассемблер – программа, преобразующая код на языке ассемблера в машинный. Приложение, выполняющее обратную задачу, носит название дизассемблера.
Синтаксис
У ассемблера отсутствует общепринятый стандарт синтаксиса. Большинство разработчиков придерживаются традиционных подходов. Основные стандарты:
- Intel-синтаксис;
- AT&T-синтаксис.
Общий формат записи инструкций для обоих стандартов будет одинаковым:
[метка:] опкод [операнды] [; комментарий]
Опкод – это и есть ассемблер-команда, мнемоника инструкции к процессору. К ней иногда добавляются префиксы (повторения, изменения типа адресации). В качестве операндов выступают:
- константы;
- названия регистров;
- адреса в оперативной памяти;
- иные элементы.
Разница между Intel и AT&T заключается в основном порядке перечисления операндов и их синтаксиса при разных методах адресации.
Используемые команды обычно являются одинаковыми для всех процессоров в пределах одной архитектуры или семейства архитектур (наиболее известны команды процессоров и контроллеров Motorola, ARM, x86). Они будут описываться в спецификации процессоров.
Пример – процессор Zilog Z80 унаследовал систему команд Intel i8080, расширил ее и изменил некоторые операции и обозначения регистров на свой лад: mov стал ld и так далее. Процессоры Motorola Fireball унаследовали команды Z80, несколько урезав их. Дополнительно Motorola официально вернулась к Intel-командам. Сейчас половина ассемблеров для Fireball функционирует именно с ними, а половина – с Zilog.
Мнемоники
Базовая конструкция ассемблера – это мнемоника. Он также называется мнемокодом. Так характеризуется символьное представление процессорной команды. Она включает в себя несколько символов, включая производное. Мнемоника может выступать в виде объекта, над которым осуществляется операция (стек, регистр, память), а также другие особенности (условия исполнения, влияние на регистр флагов и так далее), но в других диалектах может задаваться в операндах.
Ассемблер для каждого процессора обладает собственным традиционным набором, но встречаются ассемблеры с кроссплатформенным синтаксисом (пример – упомянутый ранее AT&T). В них кроссплатформенными выступают только обозначения. Код одного процессора не сможет напрямую оказаться перенесенным на другой.
Операнды
Задумываясь, что пишут на ассемблере, необходимо сначала хорошо разобраться в особенностях этого языка, а также в его синтаксисе. Он включает в себя различные операнды. Ими могут выступать:
- адреса ячеек памяти и портов ввода-вывода;
- константные значения;
- регистры;
- метки;
- константы.
Разные assemblers могут требовать применения разного порядка операндов: в одних реализациях первым идет оператор, в который будет записано значение, а в других он прописывается последним. Операнды отделяются от мнемоник-команд с помощью пробелов.
Литералы
Наиболее распространенный тип данных, с которым работает основная масса процессоров – целые числа, упакованные в машинные слова, либо один или несколько байтов. Реже используются числа с плавающими запятыми.
Рассматриваемый язык чаще использует значения, заданные в разных системах счисления. В компьютерах с 8-битным байтом обычно задействуется шестнадцатеричная запись числа, так как в один байт помещаются две 16-ричные цифры. Некоторые значения записываются в виде двоичных кодов. В ранних компьютерах с 6-битным байтом встречалась восьмеричная система счисления. Способы записи могут отличаться в разных языках ассемблера:
- Для того, чтобы записать числа в десятичной системе счисления в одних трансляторах, используется представление только в виде цифр (255, 11115), в то время как в других для этого необходимо начать число с точки (.255, .11115).
- В шестнадцатеричной системе счисления числа записываются путем добавления в самое начало префикса «0x». Встречаются языки ассемблера, где этот элемент не используется. Вместо него в конце числа добавляется «h». А в некоторых задействуются исключительно цифры. В последних двух ситуациях у чисел, которые начинаются с A-F, для отличия их от символьных имен, впереди добавляется ноль.
- Восьмеричная система счисления требует для выражения цифр в некоторых трансляторах ставить ведущий ноль (в самом начале имеющегося значения), в других префикс – это буква «О», а число заключается в апострофы.
- Чтобы записать константу в двоичной системе, используется следующий формат: b ‘10010111’.
Иногда необходимо задавать блоки данных, которые загружаются вместе с программным кодом. Для этого язык программирования ассемблер включает в себя специализированные директивы. Некоторые современные его интерпретации предусматривают организацию данных в виде разнообразных структур.
Компоненты выразительности
Ассемблерный код может включать в себя разнообразные конструкции, облегчающие чтение приложения, снятия с разработчика ответственности за необходимость слежки за адресами инструкций, а также реализации компонентов, характерных высокоуровневым языкам.
В их спектр включены:
- Метки – они указывают на места в приложении, на которые может производиться условный или безусловный переход, вызов процедуры, хранение информации и некоторые иные операции. При ассемблировании метка будет преобразована в адрес.
- Комментарии. Они имеют огромное значение для будущего проекта. Комментарий в рассматриваемом средстве разработки – это то же самое, что и комментарий в высокоуровневом ЯП. Самодокументированность кода в assembler не поддерживается.
- Именованные константы – с их помощью получится дать осмысленное имя числовому значению, а также централизованно внести в него изменения. В процессе ассемблирования константа будет заменена на соответствующее ей значение.
- Директивы в языке ассемблера – дают возможность задавать режимы ассемблирования, а также производить условную трансляцию и некоторые другие операции.
- Макросы – дают возможность упаковывать наиболее часто встречающиеся последовательности команд, дав им осмысленное название (имя).
Это основной синтаксис рассматриваемого средства разработки. Он разнообразен и каждая его интерпретация обладает своими особенностями.
Как оформить код – кратко о стандартах
В языке ассемблера отступы и операторные скобки, характерные для высокоуровневых средств разработки, обычно не используются. Код записывается в несколько колонок. Каждая из них включает в себя:
- адрес инструкции (не является обязательным элементом);
- метки;
- мнемонику инструкции;
- операнды;
- комментарии.
Такая форма записи отражает особенность исполнения приложений на процессорах общего назначения: на уровне машинных кодов программное обеспечение линейно и не имеет никакой структуры. Из одного места АО допускается переход на другое безотносительно того, где расположено начало кода. приложение продолжит исполнение с того места, куда был произведен переход.
Что нужно помнить о директивах
Кроме ассемблерных команд приложение может включать в себя разнообразные директивы – операции, не переводящиеся непосредственно в машинный код. Они отвечают за управление работой компилятора. Их набор и синтаксис значительно разнятся и зависят не от аппаратных платформ, а непосредственно от задействованного компилятора. В качестве директив выделяются следующие элементы:
- определение данных (переменных и констант);
- управление организацией приложения в памяти;
- манипулирование характеристиками выходных файлов;
- задание режима функционирования компилятора;
- абстракции (элементы языков высокого уровня) – от оформления функций и процедур (чтобы упростить реализацию передачи параметров) до условных конструкций и циклов;
- макросы.
Пользоваться директивами можно по собственному усмотрению. Обычно их новички на первых порах не изучают.
Преимущества и недостатки
Перед более глубоким и детальным изучением языка ассемблера необходимо запомнить его преимущества и недостатки. Зная их, разработчик сможет понять, насколько целесообразно применение этого ЯП для создания того или иного программного обеспечения.
К сильным сторонам ассемблера можно отнести следующие моменты:
- минимальное количество избыточного кода;
- большая скорость обработки информации;
- меньший размер приложения, чем в случае с использованием высокоуровневого языка;
- непосредственный доступ к аппаратуре: регистрам процессора, портам ввода-вывода;
- возможность создания самомодифицирующегося кода (можно позволить программе создавать или изменять часть своего кода в процессе выполнения, причем без применения интерпретатора);
- максимальное соответствие требованиям необходимой платформы (использование специальных инструкций, технических особенностей имеющегося оборудования).
Недостатки у ассемблера тоже есть. К ним относят:
- огромные объемы исходного кода;
- большое количество дополнительных небольших задач;
- меньшее количество доступных для использования библиотек;
- низкий уровень совместимости библиотек;
- плохая читабельность кода;
- трудность поддержки программного обеспечения;
- невозможность перенести программы на другие платформы (кроме двоично совместимых).
Для начинающих программистов ассемблер – достаточно сложное средство программирования. Но изучить его все равно можно даже тем, кто в разработке имеет минимальный опыт. Главное – действовать последовательно и не торопиться.
Отрасли применения
Ассемблер практически вытеснен из практического применения – его полностью заменяют более простые для изучения и понимания, а также практического применения языки высокого уровня. Но он все равно встречается в некоторых отраслях. А именно в:
- Разработке встроенного программного обеспечения. Так называются небольшие приложения, которые не требуют значительного объема памяти на таких устройствах как телефоны, автомобильные системы зажигания, видеокарты, звуковые карты, системы безопасности, модемы, принтеры. Ассемблер для них – идеальное решение.
- Компьютерных и игровых консолях для того, чтобы оптимизировать и уменьшить объемы кода. За счет ассемблера можно добиться быстродействия.
- Использовании в приложении новых команд, которые доступны на новых процессорах. Высокоуровневые компиляторы оптимизируют код в процессе компиляции, но почти не способны генерировать инструкции из расширенных наборов команд вроде AVX, XOP, CTV. Связано это с тем, что команды в процессоры добавляются быстрее, чем в компиляторах возникает логика для их генерации.
- Графических процессорах GPU.
- Кодах, создание которых невозможно или затрудняется на высокоуровневых языках. Пример – получение дампа памяти/стека. Даже когда аналог на языке высокого уровня является возможным, преимущество ассемблера может оказаться значительным. Пример – подсчет среднего арифметического с учетом переполнения для x86 процессоров занимает две команды (сложение с выставлением флага переноса и сдвиг с займом этого флага). Аналог на языке высокого уровня ((long) x+y) может либо вообще перестать работать, ведь sizeof (long)==sizeof (int), либо в процессе компиляции начнет конвертироваться огромное количество команд процессора.
- Написании антивирусных систем, а также вирусов.
- Взломе и reverse engineering. Ассемблер – это мощнейший инструмент в руках реверсера. Отладка программного обеспечения, а также дизассемблирование без знания рассматриваемого языка программирования становится невозможным.
Также этот язык хорошо подходит для того, чтобы начать изучение программирования. Он может пригодиться каждому программисту для оптимизации функционирования того или иного программного обеспечения.
Устройство языка
Assembler – средство программирования второго поколения, если за первое взять машинный. Он будет работать непосредственно с процессором, а каждая команда представляет собой процессорную инструкцию. Она не является операцией операционных или файловых систем. Процесс перевода assembler в машинный код – это ассемблирование.
Команды рассматриваемого средства разработки включают в себя коды операций и операндов. Операндами являются адреса, из которых процессор берет данные для расчетов и вычислений и в которые он помещает результат. Адреса – это ячейки оперативной памяти и регистры – память внутри процессора. Процессор контактирует с регистрами намного быстрее, чем с имеющейся оперативной памятью устройства.
Коды операций в рассматриваемом средстве разработки – мнемонические. Они являются удобными для запоминания:
- MUL – умножение (от английского multiplication);
- SUB – вычитание (subtraction);
- ADD – сложение (addition).
Регистры и ячейки памяти получают символические имена:
- EAX, EBX, AX, AH – имена для регистров;
- meml – имя для ячейки памяти.
Пример сложения чисел из регистров BX и AX: add BX, AX. Вычитание выглядит так: sub bx, ax.
Помимо инструкций, в ассемблере имеются директивы – команды управления компилятором. А точнее – приложением-ассемблером. Вот несколько из них:
- DEF – назначение регистру символического имени;
- EXIT – прекращение компиляции документа/файла;
- INCLUDE – открытие файла и начало его компиляции.
Ассемблер – вовсе не набор инструкций процессора с удобной для разработчика записью. Это полноценное средство разработки, на котором организовываются циклы, условные переходы, функции, а также процедуры и другие элементы.
Вот пример кода, с помощью которого получится вывести на дисплей цифры от 1 до 10:
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
Операции в предложенном примере выполняются в цикле – как в for или do while в высокоуровневых языках программирования.
У ассемблера отсутствует единый стандарт работы. Одна и та же команда в разных процессорах будет выглядеть по-разному. В синтаксисе Intel mov eax, ebx отвечает за перемещение информации из регистра eax в регистр ebx. В AT&T аналогичная операция ассемблера будет иметь вид movl %eax, %ebx.
Востребованность ассемблера
Программирование на ассемблере – разработка программного обеспечения, которая является достаточно востребованной. На сайтах по поиску работы заявок от работодателей с заголовками, указывающими на поиск программиста со знаниями рассматриваемого средства программирования, найти не получится. Вместо этого там очень много вакансий с высокоуровневыми ЯП: Python, C++, C и других. Ассемблер отлично дополнит их в процессе выполнения должностных обязанностей.
Обычно востребованность рассматриваемого средства разработки подчеркивается в вакансиях:
- специалиста по компьютерной безопасности;
- разработка драйверов;
- программиста приложений для микропроцессоров и микроконтроллеров;
- системных разработчиков.
Средняя зарплата в IT для программиста, знающего ассемблер, составляет от 80 до 300 тысяч рублей. Более точный заработок зависит от опыта специалиста, его квалификации, а также спектра должностных обязанностей и специфики конкретной компании.
Целесообразность изучения новичками
Рассматриваемое средство программирования для изучения новичками подойдет не лучшим образом. Для этого существует ряд причин:
- Оно слишком сильно отличается от других ЯП, особенно от высокоуровневых. Переходить с assembler на другое средство разработки программного обеспечения потом будет очень тяжело.
- Опыт, полученный с assembler, в других ЯП не пригодится. Высокоуровневые средства программирования после рассматриваемого изучаются «с нуля».
- Assembler – очень подробный ЯП. Рутинные манипуляции, которые в других средствах разработки на себя берет транслятор, в рассматриваемом описывается непосредственно программистом. Этот процесс быстро надоедает.
Именно поэтому, если человек заинтересован в обучении и трудоустройстве на профессию, связанную с assembler, лучше начать изучение высокоуровневых средств разработки. После них рассматриваемый ЯП освоить станет в разы проще.
Основные инструкции
Assembler имеет различные инструкции, которые помогут разрабатывать программное обеспечение. Ниже – таблица, которая поможет разобраться с ключевыми операциями:
Описание командыИнтерпретацияЗагрузка значения в регистрMOVСложениеADDБезусловный переход к адресу или меткеJMPСравнение значений в регистрахCMPПереход к метке, если флаг JZ = 1JZ labelВычитаниеSubПобитовое И между имеющимися значениямиAndПобитовое или значения в регистреORПобитовое исключающее илиXORПустая операцияNOPПерекладывание значения из регистра в стекPushИзвлечение значения из стека в регистрPOPВызов подпрограммыCallВозврат из подпрограммыRetУвеличение значения в регистреIncУменьшение значения в регистреDecПобитовое отрицание значения в регистреNOTЗнаковое отрицание значения в регистреNEG
Теперь понятно, что собой представляет assembler. Лучше изучить его помогут дистанционные компьютерные курсы. В срок от пары месяцев до года даже не разбирающийся в программировании человек научится создавать собственные приложения на понравившемся языке. А свои навыки он подтвердит электронным сертификатом образовательного центра.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Знакомство с ассемблером OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Изучение языков программирования традиционно осуществляется на примере строки «Hello World». Обычно она используется для вывода информации на экран. В большинстве языков программирования для этого достаточно написать всего одну строку кода. Пример – Python. В нем для вывода упомянутой фразы требуется написать print(“Hello, World!”). Но есть язык, в котором для получения аналогичного результата требуется написать целый" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/znakomstvo-s-assemblerom/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#article","name":"\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c OTUS","headline":"\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/02\/oj-1080x720-8.jpg","width":2245,"height":1587},"datePublished":"2024-02-03T12:41:19+00:00","dateModified":"2024-02-03T12:45:05+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#listItem","position":2,"name":"\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#webpage","url":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/","name":"\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c OTUS","description":"\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u00abHello World\u00bb. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u043e\u0434\u0430. \u041f\u0440\u0438\u043c\u0435\u0440 \u2013 Python. \u0412 \u043d\u0435\u043c \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0444\u0440\u0430\u0437\u044b \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c print(\u201cHello, World!\u201d). \u041d\u043e \u0435\u0441\u0442\u044c \u044f\u0437\u044b\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0439","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/02\/oj-1080x720-8.jpg","@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/znakomstvo-s-assemblerom\/#mainImage"},"datePublished":"2024-02-03T12:41:19+00:00","dateModified":"2024-02-03T12:45:05+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/9104" /><link rel='shortlink' href='https://otus.ru/journal/?p=9104' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fznakomstvo-s-assemblerom%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fznakomstvo-s-assemblerom%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-9104 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-9104" class="the-post post-9104 post type-post status-publish format-standard has-post-thumbnail category-polza tag-assembler tag-programmirovanie">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Знакомство с ассемблером
</h1>
<a href="https://otus.ru/journal/znakomstvo-s-assemblerom/" class="date-link" data-wpel-link="internal"><time class="post-date">3 февраля, 2024</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-8.jpg" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Знакомство с ассемблером" title="Знакомство с ассемблером" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-8-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-8-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-8-770x515.jpg" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80%D1%8B_%D0%B8_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA" title="Процессоры и машинный язык">Процессоры и машинный язык</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F" title="История создания">История создания</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Определение">Определение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81" title="Синтаксис">Синтаксис</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8" title="Мнемоники">Мнемоники</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D0%BD%D0%B4%D1%8B" title="Операнды">Операнды</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%9B%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D0%BB%D1%8B" title="Литералы">Литералы</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B_%D0%B2%D1%8B%D1%80%D0%B0%D0%B7%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8" title="Компоненты выразительности">Компоненты выразительности</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%9A%D0%B0%D0%BA_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%82%D1%8C_%D0%BA%D0%BE%D0%B4_%E2%80%93_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE_%D0%BE_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%B0%D1%85" title="Как оформить код – кратко о стандартах">Как оформить код – кратко о стандартах</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%A7%D1%82%D0%BE_%D0%BD%D1%83%D0%B6%D0%BD%D0%BE_%D0%BF%D0%BE%D0%BC%D0%BD%D0%B8%D1%82%D1%8C_%D0%BE_%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%85" title="Что нужно помнить о директивах">Что нужно помнить о директивах</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8" title="Преимущества и недостатки">Преимущества и недостатки</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%9E%D1%82%D1%80%D0%B0%D1%81%D0%BB%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F" title="Отрасли применения">Отрасли применения</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%A3%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0" title="Устройство языка">Устройство языка</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%92%D0%BE%D1%81%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%B0" title="Востребованность ассемблера">Востребованность ассемблера</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-15" href="#%D0%A6%D0%B5%D0%BB%D0%B5%D1%81%D0%BE%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B8%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%B0%D0%BC%D0%B8" title="Целесообразность изучения новичками">Целесообразность изучения новичками</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8" title="Основные инструкции">Основные инструкции</a></li></ul></nav></div>
<p>Изучение языков программирования традиционно осуществляется на примере строки «Hello World». Обычно она используется для вывода информации на экран. В большинстве языков программирования для этого достаточно написать всего одну строку кода. Пример – Python. В нем для вывода упомянутой фразы требуется написать print(“Hello, World!”). Но есть язык, в котором для получения аналогичного результата требуется написать целый блок кода:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/zs7OVPKvh97po748uSoIkSKX5CAxzGzAyICXDNkQB9IjpGZWSKC8yiRnfEsbpYo8FUHWQJDPHFyPnN1DYduIZPGTVKj2lF2qV6hJes3UqDfsJp_RzyauK0onBEJyVbcyXQ-zHJVF0Pow9mjhqNkxpQ" alt="Знакомство с ассемблером"/></figure>
<p>Это – Ассемблер. Он относится к низкоуровневым языкам разработки, а Python – к высокоуровневым. В нем каждая команда будет вызывать всего одну операцию процессора. Этот язык входит в ТОП самых популярных и изучаемых разработчиками. Новичкам на первых порах будет проблематично освоить его из-за сложности синтаксиса.</p>
<p>Далее предстоит выяснить, как работает ассемблер. Необходимо не только изучить определение этого инструмента, но и его ключевые особенности, сферы применения и базовые элементы. Предложенная информация рассчитана на широкую публику. Она пригодится и программистам-новичкам, и уже их более опытным коллегам.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80%D1%8B_%D0%B8_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA"></span>Процессоры и машинный язык<span class="ez-toc-section-end"></span></h2>
<p>Чтобы понять, что собой представляет язык ассемблера, необходимо сначала разобраться в принципах функционирования процессора, а также в том, как с ним «контактировать» разработчикам и обычным пользователям.</p>
<p>Процессор – это электронное устройство (сейчас оно представлено очень маленькой микросхемой, а раньше такое оборудование занимало целые комнаты), которое не понимает слов и цифр. Оно реагирует на два уровня напряжения:</p>
<ul>
<li>высокий – единица;</li>
<li>низкий – ноль.</li>
</ul>
<p>Из-за этого каждая процессорная команда представлена последовательностью единиц и нулей, где 1 – это «импульс есть», а 0 – импульс отсутствует.</p>
<p>Для того, чтобы работать с процессором, программисты используют машинный язык. Он включает в себя инструкции, написанные в двоичном коде. Каждая такая инструкция определяет одну операцию: логическую (поразрядную), арифметическую над числами, ввод-вывод и так далее.</p>
<p>Писать программы с помощью машинного кода – непростая задача. Для этого придется работать с огромными цепочками, состоящими из единиц и нулей. Создать или произвести проверку подобного приложения проблематично, а разобраться в чужом коде – и подавно.</p>
<p>Именно поэтому много лет назад появился язык ассемблера. В нем коды операций обозначались буквами и сокращениями английских слов, отражающих суть команды. Пример – команда mov ax 6 указывает на необходимость перемещения числа 6 в ячейку памяти AX.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F"></span>История создания<span class="ez-toc-section-end"></span></h2>
<p>Создан ассемблер в 40-х годах 20-го века. Он разработан для первых ЭВМ на электронных лампах, программы для которых создавались на машинном языке. Из-за того, что памяти у компьютеров было мало, команды вводились путем переключения тумблеров и нажимания разнообразных кнопок. Даже несложные вычисления отнимали много времени.</p>
<p>Проблема была решена, когда ЭВМ научились хранить приложения в памяти. К 1950-му году была создана первая программа-транслятор, которая переводила машинный язык программного обеспечения в написанный на понятном человеку языке. Такая программа получила название программы-сборщика, а язык – язык ассемблера (assembler – сборщик).</p>
<p>Его появление достаточно сильно облегчило жизнь разработчикам. Вместо двоичных кодов теперь стало возможным использование команд, которые приближены по своему составу (написанию) к обычному языку условных обозначений. Ассемблер также позволил значительно уменьшить размер приложений – для устройств тех времен этот момент оказался особо значимым.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Определение<span class="ez-toc-section-end"></span></h2>
<p>Язык ассемблера (assembly language) – это представление команд процессора в форме, доступной для чтения пользователем. Он является низкоуровневым. Программы, которые на нем написаны, однозначно переводятся в инструкции конкретного процессора. В большинстве случаев они не могут быть перенесены без существенных изменений для запуска на машине с другой системой команд.</p>
<p>Ассемблер – программа, преобразующая код на языке ассемблера в машинный. Приложение, выполняющее обратную задачу, носит название дизассемблера.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81"></span>Синтаксис<span class="ez-toc-section-end"></span></h2>
<p>У ассемблера отсутствует общепринятый стандарт синтаксиса. Большинство разработчиков придерживаются традиционных подходов. Основные стандарты:</p>
<ul>
<li>Intel-синтаксис;</li>
<li>AT&T-синтаксис.</li>
</ul>
<p>Общий формат записи инструкций для обоих стандартов будет одинаковым:</p>
<p><code>[метка:] опкод [операнды] [; комментарий]</code></p>
<p>Опкод – это и есть ассемблер-команда, мнемоника инструкции к процессору. К ней иногда добавляются префиксы (повторения, изменения типа адресации). В качестве операндов выступают:</p>
<ul>
<li>константы;</li>
<li>названия регистров;</li>
<li>адреса в оперативной памяти;</li>
<li>иные элементы.</li>
</ul>
<p>Разница между Intel и AT&T заключается в основном порядке перечисления операндов и их синтаксиса при разных методах адресации.</p>
<p>Используемые команды обычно являются одинаковыми для всех процессоров в пределах одной архитектуры или семейства архитектур (наиболее известны команды процессоров и контроллеров Motorola, ARM, x86). Они будут описываться в спецификации процессоров.</p>
<p>Пример – процессор Zilog Z80 унаследовал систему команд Intel i8080, расширил ее и изменил некоторые операции и обозначения регистров на свой лад: mov стал ld и так далее. Процессоры Motorola Fireball унаследовали команды Z80, несколько урезав их. Дополнительно Motorola официально вернулась к Intel-командам. Сейчас половина ассемблеров для Fireball функционирует именно с ними, а половина – с Zilog.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9C%D0%BD%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%BA%D0%B8"></span>Мнемоники<span class="ez-toc-section-end"></span></h3>
<p>Базовая конструкция ассемблера – это мнемоника. Он также называется мнемокодом. Так характеризуется символьное представление процессорной команды. Она включает в себя несколько символов, включая производное. Мнемоника может выступать в виде объекта, над которым осуществляется операция (стек, регистр, память), а также другие особенности (условия исполнения, влияние на регистр флагов и так далее), но в других диалектах может задаваться в операндах.</p>
<p>Ассемблер для каждого процессора обладает собственным традиционным набором, но встречаются ассемблеры с кроссплатформенным синтаксисом (пример – упомянутый ранее AT&T). В них кроссплатформенными выступают только обозначения. Код одного процессора не сможет напрямую оказаться перенесенным на другой.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D0%BD%D0%B4%D1%8B"></span>Операнды<span class="ez-toc-section-end"></span></h3>
<p>Задумываясь, что пишут на ассемблере, необходимо сначала хорошо разобраться в особенностях этого языка, а также в его синтаксисе. Он включает в себя различные операнды. Ими могут выступать:</p>
<ul>
<li>адреса ячеек памяти и портов ввода-вывода;</li>
<li>константные значения;</li>
<li>регистры;</li>
<li>метки;</li>
<li>константы.</li>
</ul>
<p>Разные assemblers могут требовать применения разного порядка операндов: в одних реализациях первым идет оператор, в который будет записано значение, а в других он прописывается последним. Операнды отделяются от мнемоник-команд с помощью пробелов.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9B%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D0%BB%D1%8B"></span>Литералы<span class="ez-toc-section-end"></span></h3>
<p>Наиболее распространенный тип данных, с которым работает основная масса процессоров – целые числа, упакованные в машинные слова, либо один или несколько байтов. Реже используются числа с плавающими запятыми.</p>
<p>Рассматриваемый язык чаще использует значения, заданные в разных системах счисления. В компьютерах с 8-битным байтом обычно задействуется шестнадцатеричная запись числа, так как в один байт помещаются две 16-ричные цифры. Некоторые значения записываются в виде двоичных кодов. В ранних компьютерах с 6-битным байтом встречалась восьмеричная система счисления. Способы записи могут отличаться в разных языках ассемблера:</p>
<ol>
<li>Для того, чтобы записать числа в десятичной системе счисления в одних трансляторах, используется представление только в виде цифр (255, 11115), в то время как в других для этого необходимо начать число с точки (.255, .11115).</li>
<li>В шестнадцатеричной системе счисления числа записываются путем добавления в самое начало префикса «0x». Встречаются языки ассемблера, где этот элемент не используется. Вместо него в конце числа добавляется «h». А в некоторых задействуются исключительно цифры. В последних двух ситуациях у чисел, которые начинаются с A-F, для отличия их от символьных имен, впереди добавляется ноль.</li>
<li>Восьмеричная система счисления требует для выражения цифр в некоторых трансляторах ставить ведущий ноль (в самом начале имеющегося значения), в других префикс – это буква «О», а число заключается в апострофы.</li>
<li>Чтобы записать константу в двоичной системе, используется следующий формат: b ‘10010111’.</li>
</ol>
<p>Иногда необходимо задавать блоки данных, которые загружаются вместе с программным кодом. Для этого язык программирования ассемблер включает в себя специализированные директивы. Некоторые современные его интерпретации предусматривают организацию данных в виде разнообразных структур.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B_%D0%B2%D1%8B%D1%80%D0%B0%D0%B7%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8"></span>Компоненты выразительности<span class="ez-toc-section-end"></span></h3>
<p>Ассемблерный код может включать в себя разнообразные конструкции, облегчающие чтение приложения, снятия с разработчика ответственности за необходимость слежки за адресами инструкций, а также реализации компонентов, характерных высокоуровневым языкам.</p>
<p>В их спектр включены:</p>
<ol>
<li>Метки – они указывают на места в приложении, на которые может производиться условный или безусловный переход, вызов процедуры, хранение информации и некоторые иные операции. При ассемблировании метка будет преобразована в адрес.</li>
<li>Комментарии. Они имеют огромное значение для будущего проекта. Комментарий в рассматриваемом средстве разработки – это то же самое, что и комментарий в высокоуровневом ЯП. Самодокументированность кода в assembler не поддерживается.</li>
<li>Именованные константы – с их помощью получится дать осмысленное имя числовому значению, а также централизованно внести в него изменения. В процессе ассемблирования константа будет заменена на соответствующее ей значение.</li>
<li>Директивы в языке ассемблера – дают возможность задавать режимы ассемблирования, а также производить условную трансляцию и некоторые другие операции.</li>
<li>Макросы – дают возможность упаковывать наиболее часто встречающиеся последовательности команд, дав им осмысленное название (имя).</li>
</ol>
<p>Это основной синтаксис рассматриваемого средства разработки. Он разнообразен и каждая его интерпретация обладает своими особенностями.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%82%D1%8C_%D0%BA%D0%BE%D0%B4_%E2%80%93_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE_%D0%BE_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%B0%D1%85"></span>Как оформить код – кратко о стандартах<span class="ez-toc-section-end"></span></h2>
<p>В языке ассемблера отступы и операторные скобки, характерные для высокоуровневых средств разработки, обычно не используются. Код записывается в несколько колонок. Каждая из них включает в себя:</p>
<ul>
<li>адрес инструкции (не является обязательным элементом);</li>
<li>метки;</li>
<li>мнемонику инструкции;</li>
<li>операнды;</li>
<li>комментарии.</li>
</ul>
<p>Такая форма записи отражает особенность исполнения приложений на процессорах общего назначения: на уровне машинных кодов программное обеспечение линейно и не имеет никакой структуры. Из одного места АО допускается переход на другое безотносительно того, где расположено начало кода. приложение продолжит исполнение с того места, куда был произведен переход.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A7%D1%82%D0%BE_%D0%BD%D1%83%D0%B6%D0%BD%D0%BE_%D0%BF%D0%BE%D0%BC%D0%BD%D0%B8%D1%82%D1%8C_%D0%BE_%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%85"></span>Что нужно помнить о директивах<span class="ez-toc-section-end"></span></h2>
<p>Кроме ассемблерных команд приложение может включать в себя разнообразные директивы – операции, не переводящиеся непосредственно в машинный код. Они отвечают за управление работой компилятора. Их набор и синтаксис значительно разнятся и зависят не от аппаратных платформ, а непосредственно от задействованного компилятора. В качестве директив выделяются следующие элементы:</p>
<ul>
<li>определение данных (переменных и констант);</li>
<li>управление организацией приложения в памяти;</li>
<li>манипулирование характеристиками выходных файлов;</li>
<li>задание режима функционирования компилятора;</li>
<li>абстракции (элементы языков высокого уровня) – от оформления функций и процедур (чтобы упростить реализацию передачи параметров) до условных конструкций и циклов;</li>
<li>макросы.</li>
</ul>
<p>Пользоваться директивами можно по собственному усмотрению. Обычно их новички на первых порах не изучают.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8"></span>Преимущества и недостатки<span class="ez-toc-section-end"></span></h2>
<p>Перед более глубоким и детальным изучением языка ассемблера необходимо запомнить его преимущества и недостатки. Зная их, разработчик сможет понять, насколько целесообразно применение этого ЯП для создания того или иного программного обеспечения.</p>
<p>К сильным сторонам ассемблера можно отнести следующие моменты:</p>
<ul>
<li>минимальное количество избыточного кода;</li>
<li>большая скорость обработки информации;</li>
<li>меньший размер приложения, чем в случае с использованием высокоуровневого языка;</li>
<li>непосредственный доступ к аппаратуре: регистрам процессора, портам ввода-вывода;</li>
<li>возможность создания самомодифицирующегося кода (можно позволить программе создавать или изменять часть своего кода в процессе выполнения, причем без применения интерпретатора);</li>
<li>максимальное соответствие требованиям необходимой платформы (использование специальных инструкций, технических особенностей имеющегося оборудования).</li>
</ul>
<p>Недостатки у ассемблера тоже есть. К ним относят:</p>
<ul>
<li>огромные объемы исходного кода;</li>
<li>большое количество дополнительных небольших задач;</li>
<li>меньшее количество доступных для использования библиотек;</li>
<li>низкий уровень совместимости библиотек;</li>
<li>плохая читабельность кода;</li>
<li>трудность поддержки программного обеспечения;</li>
<li>невозможность перенести программы на другие платформы (кроме двоично совместимых).</li>
</ul>
<p>Для начинающих программистов ассемблер – достаточно сложное средство программирования. Но изучить его все равно можно даже тем, кто в разработке имеет минимальный опыт. Главное – действовать последовательно и не торопиться.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D1%82%D1%80%D0%B0%D1%81%D0%BB%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F"></span>Отрасли применения<span class="ez-toc-section-end"></span></h2>
<p>Ассемблер практически вытеснен из практического применения – его полностью заменяют более простые для изучения и понимания, а также практического применения языки высокого уровня. Но он все равно встречается в некоторых отраслях. А именно в:</p>
<ol>
<li>Разработке встроенного программного обеспечения. Так называются небольшие приложения, которые не требуют значительного объема памяти на таких устройствах как телефоны, автомобильные системы зажигания, видеокарты, звуковые карты, системы безопасности, модемы, принтеры. Ассемблер для них – идеальное решение.</li>
<li>Компьютерных и игровых консолях для того, чтобы оптимизировать и уменьшить объемы кода. За счет ассемблера можно добиться быстродействия.</li>
<li>Использовании в приложении новых команд, которые доступны на новых процессорах. Высокоуровневые компиляторы оптимизируют код в процессе компиляции, но почти не способны генерировать инструкции из расширенных наборов команд вроде AVX, XOP, CTV. Связано это с тем, что команды в процессоры добавляются быстрее, чем в компиляторах возникает логика для их генерации.</li>
<li>Графических процессорах GPU.</li>
<li>Кодах, создание которых невозможно или затрудняется на высокоуровневых языках. Пример – получение дампа памяти/стека. Даже когда аналог на языке высокого уровня является возможным, преимущество ассемблера может оказаться значительным. Пример – подсчет среднего арифметического с учетом переполнения для x86 процессоров занимает две команды (сложение с выставлением флага переноса и сдвиг с займом этого флага). Аналог на языке высокого уровня ((long) x+y) может либо вообще перестать работать, ведь sizeof (long)==sizeof (int), либо в процессе компиляции начнет конвертироваться огромное количество команд процессора.</li>
<li>Написании антивирусных систем, а также вирусов.</li>
<li>Взломе и reverse engineering. Ассемблер – это мощнейший инструмент в руках реверсера. Отладка программного обеспечения, а также дизассемблирование без знания рассматриваемого языка программирования становится невозможным.</li>
</ol>
<p>Также этот язык хорошо подходит для того, чтобы начать изучение программирования. Он может пригодиться каждому программисту для оптимизации функционирования того или иного программного обеспечения.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A3%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0"></span>Устройство языка<span class="ez-toc-section-end"></span></h2>
<p>Assembler – средство программирования второго поколения, если за первое взять машинный. Он будет работать непосредственно с процессором, а каждая команда представляет собой процессорную инструкцию. Она не является операцией операционных или файловых систем. Процесс перевода assembler в машинный код – это ассемблирование.</p>
<p>Команды рассматриваемого средства разработки включают в себя коды операций и операндов. Операндами являются адреса, из которых процессор берет данные для расчетов и вычислений и в которые он помещает результат. Адреса – это ячейки оперативной памяти и регистры – память внутри процессора. Процессор контактирует с регистрами намного быстрее, чем с имеющейся оперативной памятью устройства.</p>
<p>Коды операций в рассматриваемом средстве разработки – мнемонические. Они являются удобными для запоминания:</p>
<ul>
<li>MUL – умножение (от английского multiplication);</li>
<li>SUB – вычитание (subtraction);</li>
<li>ADD – сложение (addition).</li>
</ul>
<p>Регистры и ячейки памяти получают символические имена:</p>
<ul>
<li>EAX, EBX, AX, AH – имена для регистров;</li>
<li>meml – имя для ячейки памяти.</li>
</ul>
<p>Пример сложения чисел из регистров BX и AX: add BX, AX. Вычитание выглядит так: sub bx, ax.</p>
<p>Помимо инструкций, в ассемблере имеются директивы – команды управления компилятором. А точнее – приложением-ассемблером. Вот несколько из них:</p>
<ul>
<li>DEF – назначение регистру символического имени;</li>
<li>EXIT – прекращение компиляции документа/файла;</li>
<li>INCLUDE – открытие файла и начало его компиляции.</li>
</ul>
<p>Ассемблер – вовсе не набор инструкций процессора с удобной для разработчика записью. Это полноценное средство разработки, на котором организовываются циклы, условные переходы, функции, а также процедуры и другие элементы.</p>
<p>Вот пример кода, с помощью которого получится вывести на дисплей цифры от 1 до 10:</p>
<pre class="wp-block-code"><code>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</code></pre>
<p>Операции в предложенном примере выполняются в цикле – как в for или do while в высокоуровневых языках программирования.</p>
<p>У ассемблера отсутствует единый стандарт работы. Одна и та же команда в разных процессорах будет выглядеть по-разному. В синтаксисе Intel mov eax, ebx отвечает за перемещение информации из регистра eax в регистр ebx. В AT&T аналогичная операция ассемблера будет иметь вид movl %eax, %ebx.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D0%BE%D1%81%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%B0"></span>Востребованность ассемблера<span class="ez-toc-section-end"></span></h2>
<p>Программирование на ассемблере – разработка программного обеспечения, которая является достаточно востребованной. На сайтах по поиску работы заявок от работодателей с заголовками, указывающими на поиск программиста со знаниями рассматриваемого средства программирования, найти не получится. Вместо этого там очень много вакансий с высокоуровневыми ЯП: Python, C++, C и других. Ассемблер отлично дополнит их в процессе выполнения должностных обязанностей.</p>
<p>Обычно востребованность рассматриваемого средства разработки подчеркивается в вакансиях:</p>
<ul>
<li>специалиста по компьютерной безопасности;</li>
<li>разработка драйверов;</li>
<li>программиста приложений для микропроцессоров и микроконтроллеров;</li>
<li>системных разработчиков.</li>
</ul>
<p>Средняя зарплата в IT для программиста, знающего ассемблер, составляет от 80 до 300 тысяч рублей. Более точный заработок зависит от опыта специалиста, его квалификации, а также спектра должностных обязанностей и специфики конкретной компании.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A6%D0%B5%D0%BB%D0%B5%D1%81%D0%BE%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B8%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%B0%D0%BC%D0%B8"></span>Целесообразность изучения новичками<span class="ez-toc-section-end"></span></h2>
<p>Рассматриваемое средство программирования для изучения новичками подойдет не лучшим образом. Для этого существует ряд причин:</p>
<ol>
<li>Оно слишком сильно отличается от других ЯП, особенно от высокоуровневых. Переходить с assembler на другое средство разработки программного обеспечения потом будет очень тяжело.</li>
<li>Опыт, полученный с assembler, в других ЯП не пригодится. Высокоуровневые средства программирования после рассматриваемого изучаются «с нуля».</li>
<li>Assembler – очень подробный ЯП. Рутинные манипуляции, которые в других средствах разработки на себя берет транслятор, в рассматриваемом описывается непосредственно программистом. Этот процесс быстро надоедает.</li>
</ol>
<p>Именно поэтому, если человек заинтересован в обучении и трудоустройстве на профессию, связанную с assembler, лучше начать изучение высокоуровневых средств разработки. После них рассматриваемый ЯП освоить станет в разы проще.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8"></span>Основные инструкции<span class="ez-toc-section-end"></span></h2>
<p>Assembler имеет различные инструкции, которые помогут разрабатывать программное обеспечение. Ниже – таблица, которая поможет разобраться с ключевыми операциями:</p>
<figure class="wp-block-table"><table><tbody><tr><td>Описание команды</td><td>Интерпретация</td></tr><tr><td>Загрузка значения в регистр</td><td>MOV</td></tr><tr><td>Сложение</td><td>ADD</td></tr><tr><td>Безусловный переход к адресу или метке</td><td>JMP</td></tr><tr><td>Сравнение значений в регистрах</td><td>CMP</td></tr><tr><td>Переход к метке, если флаг JZ = 1</td><td>JZ label</td></tr><tr><td>Вычитание</td><td>Sub</td></tr><tr><td>Побитовое И между имеющимися значениями</td><td>And</td></tr><tr><td>Побитовое или значения в регистре</td><td>OR</td></tr><tr><td>Побитовое исключающее или</td><td>XOR</td></tr><tr><td>Пустая операция</td><td>NOP</td></tr><tr><td>Перекладывание значения из регистра в стек</td><td>Push</td></tr><tr><td>Извлечение значения из стека в регистр</td><td>POP</td></tr><tr><td>Вызов подпрограммы</td><td>Call</td></tr><tr><td>Возврат из подпрограммы</td><td>Ret</td></tr><tr><td>Увеличение значения в регистре</td><td>Inc</td></tr><tr><td>Уменьшение значения в регистре</td><td>Dec</td></tr><tr><td>Побитовое отрицание значения в регистре</td><td>NOT</td></tr><tr><td>Знаковое отрицание значения в регистре</td><td>NEG</td></tr></tbody></table></figure>
<p>Теперь понятно, что собой представляет assembler. Лучше изучить его помогут дистанционные компьютерные курсы. В срок от пары месяцев до года даже не разбирающийся в программировании человек научится создавать собственные приложения на понравившемся языке. А свои навыки он подтвердит электронным сертификатом образовательного центра.</p>
<p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a href="https://otus.ru/?utm_source=oj" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Otus<span class="wpel-icon wpel-image wpel-icon-6"></span></a>!</em> </p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/assembler/" rel="tag" data-wpel-link="internal">ассемблер</a><a href="https://otus.ru/journal/tag/programmirovanie/" rel="tag" data-wpel-link="internal">программирование</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fznakomstvo-s-assemblerom%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fznakomstvo-s-assemblerom%2F&text=%D0%97%D0%BD%D0%B0%D0%BA%D0%BE%D0%BC%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%20%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%BE%D0%BC" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fznakomstvo-s-assemblerom%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fznakomstvo-s-assemblerom%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2024%2F02%2Foj-1080x720-8.jpg&description=%D0%97%D0%BD%D0%B0%D0%BA%D0%BE%D0%BC%D1%81%D1%82%D0%B2%D0%BE%20%D1%81%20%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%BE%D0%BC" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/vvedenie-v-rekursiju/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/vvedenie-v-rekursiju/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Введение в рекурсию" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-7-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-7-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-7-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-7-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-7-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-7-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Введение в рекурсию" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/vvedenie-v-rekursiju/" data-wpel-link="internal">Введение в рекурсию</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/vvedenie-v-rekursiju/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-02-03T11:03:04+00:00">3 февраля, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">6 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/kak-sdelat-bekap/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/kak-sdelat-bekap/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Как сделать бэкап" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-9-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-9-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-9-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-9-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-9-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-9-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Как сделать бэкап" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/kak-sdelat-bekap/" data-wpel-link="internal">Как сделать бэкап</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/kak-sdelat-bekap/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-02-03T13:07:47+00:00">3 февраля, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">8 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/znakomstvo-s-assemblerom\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 22:33:44 GMT -->