Для чего нужен ассемблер?
И следует ли его учить , если его уже заменяют? Так важно ли понимания того, что происходит на более глубоком, машинном уровне.
- Вопрос задан более трёх лет назад
- 19210 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 9

Гуглю за еду
Скажем так: зачем уметь собирать-разбирать двигатель от машины и понимать как он работает?
99% людей это не нужно в принципе. Но если вы это знаете, вы можете легко диагностировать какую-то проблему, понять как её решить. При этом, каждый день вы не производите двигатели на станке.
То же самое с ассемблером: чтобы понимать как работает программа, как её отладить, диагностировать, понять, что не работает — для этого и нужен ассемблер. Писать на нём что-то конкретное и большое сейчас абсолютно бессмысленно. Его надо знать и понимать, этого достаточно.
Ответ написан более трёх лет назад
Комментировать
Нравится 9 Комментировать

Daemon23RUS @Daemon23RUS
Я не понимаю его назначение
Поймите одну простую вещь, абсолютно любая программа написанная на абсолютно любом языке программирования, в конечном итоге для выполнения будет преобразована в машинный код процессора. А представлением этого кода как раз и является ассемблер.
И следует ли его учить , если его уже заменяют?
Его никто не заменяет, осмелюсь сказать он незаменим. Ассемблер обладает одним свойством, на нем оочень тяжело писать большие программы, даже используя макроассемблер. Представтье, что ассемблерной программе не нужна операционная система, ассемблер напрямую может взаимодействовать с устройствами, без драйверов (надо только написать протокол этого самого взаимодействия) Есть более удобные языки, например «С» или «С++». Решение об изучениии каждый принимает самостоятельно, в некоторых сферах ассемблер -незаменим. А в других — бесполезен и даже вреден.
Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать
Готовые решения — не подаю, но.
Учить, как и проходить — однозначно не надо.
Изучать — да, возможно. Хотя бы с точки зрения понимания работы процессора как такового.
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать

Системный программист ^_^
А ещё знание ассемблера нужно, если вы хотите понять, как работает та или иная скомпилированная программа (и затем написать схожую по функциональности свою или модифицировать эту).
В сфере информационной безопасности обязательно. Простой пример — в лаборатории Касперского вручную анализировать неизвестные вирусы. (если интересно, ЛК проводит курсы по этой теме и нанимает на стажировку)
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
evgeniy_lm @evgeniy_lm
К вашему сведению драйверы это часть ОС. Их как и всю ОС можно написать на СИ, можно на Assembler, а можно, например, на Pascal. Просто сейчас компьютеры настолько быстрые и имеют так много памяти, что оптимизация кода уходит на второй план. Хотя компиляторы современных языков программирования в плане оптимизации фору дадут большинству современных программистов.
Но все таки в серьезных программах есть много так называемых»узких мест» как правило это связано с нехваткой быстродействия, реже нехваткой памяти, тут на помощь приходит ассемблер.
Хотя чудику который говнокодит на PHP или JS этого не понять
PS Язык программирования это инструмент, а не стихотворение его учить не надо, на нем надо писать программы
Ответ написан более трёх лет назад
Нравится 1 2 комментария
А ты сильно глубоко говнокодил на js, пишешь как даун
evgeniy_lm @evgeniy_lm
Виталий: Ну, извини что задел за живое.
Коля К @Kolyagrozamorey
инженер-электроник службы ИТ ХАЕС
Программа правильно написана на ассемблере будет работать в несколько раз быстрее чем аналогичная программа написана на языку высокого уровня. Но если код программы на языке высокого уровня займет страницу, то на ассемблере 10-20 страниц. Так что если важна скорость и не боитесь написать с несколько десятков страниц кода пишите на ассемблере.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
«I’m here to consult you» © Dogbert
Для чего нужен ассемблер
Ещё пара ниш к уже перечисленным: разработка компиляторов и процессорных эмуляторов.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Павел @electronik777
Что бы было понятнее, лет 20 назад Asm еще использовался для оптимизации приложения, т.е для более оптимальной приложения. С развитием фрэймворков, эта надобность отпала как таковая, т.к сейчас производительность железа намного больше чем 20 лет назад, а ресурсы этого железа используются в среднем процентов на 30( не учитываем игры и 3д графику), да и мало кто уже использует низкоуровневые функции(привет от int13h). Единственное где еще может использоваться так это в real-time OS, где критически важны доли-долей микро-нано-секунд. В повседневной жизни это не пригодится, конечно если Вы не ходите разговаривать с процессором на его родном языке.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

Dimonchik @dimonchik2013
non progredi est regredi
. ну или вирусок какой на заказ
FasmWorld Программирование на ассемблере FASM для начинающих и не только
Учебный курс. Часть 0. Зачем учить ассемблер
Автор: xrnd | Рубрика: Учебный курс | 27-01-2010 | Распечатать запись
В настоящее время существует множество языков программирования. Созданы самые разные языки, удобные для решения любых задач. Большинство этих языков является языками высокого уровня.
Ассемблер — это практически самый древний язык программирования. До него было лишь программирование в машинных кодах
Итак, какие же преимущества дает знание ассемблера:
- Глубокое понимание работы компьютера и операционной системы.
- Максимальная гибкость при работе с аппаратными ресурсами.
- Оптимизация программ по скорости выполнения.
- Оптимизация программ по размеру кода.
- Дизассемблирование и отладка.
Глубокое понимание работы компьютера и операционной системы.
Даже если вы пишете программу на языке высокого уровня, знание ассемблера поможет понять, как будет выполнятся программа, как хранятся переменные, как вызываются функции. А это позволит избежать многих очень неприятных ошибок. Есть такие люди, которые знают программирование только на уровне языка. То есть знают что надо написать, чтобы получить какой-то результат. А как оно работает, для них остается тайной, покрытой мраком. Человек, владеющий ассемблером, будет лучше программировать и на других языках.
Максимальная гибкость при работе с аппаратными ресурсами.
Используя ассемблер, можно делать с компьютером все что угодно! А языки высокого уровня ограничены компилятором и используемыми библиотеками. Такие современные языки, как Java и C# вобще не позволяют работать с аппаратными ресурсами и операционной системой напрямую.
Оптимизация программ по скорости выполнения.
Современные компиляторы довольно неплохо оптимизируют код, поэтому писать на ассемблере все подряд, конечно, не имеет смысла. Однако, если вы пишите прогу для шифрования или архивации больших файлов, то применение ассемблера позволит в несколько раз увеличить скорость выполнения программы. Причем достаточно реализовать на ассемблере небольшой критически важный участок программы, который производит вычисления или сложные преобразования, а интерфейс может быть написан на языке высокого уровня.
Оптимизация программ по размеру кода.
Программа на ассемблере, как правило, значительно меньше аналогичной программы на другом языке программирования. Для современных персональных компьютеров и серверов с терабайтными дисками и гигабайтами памяти это, конечно, врядли играет большую роль. Но для микроконтроллеров, где всего несколько килобайт памяти, маленький размер программы очень важен. Чем меньше программа, тем меньше памяти требуется и тем проще и дешевле будет используемая микросхема.
Дизассемблирование и отладка.
Знание ассемблера позволяет расковырять любую программу дизассемблером и изучить механизм её работы! Только представьте — можно залезть внутрь любой программы и посмотреть как она работает. Иногда бывает, что попадается интересная программа и не понятно, что там внутри, как она написана. Зная ассемблер, можно заглянуть внутрь любой программы и удовлетворить свое любопытство, даже не имея исходников.
Ассемблер очень может помочь при отладке. Иногда случаются ошибки и в компиляторах — очень злая тема. Вроде бы корректно написанный код выполняется вовсе не так, как предполагалось. Чтобы обнаружить такую ошибку надо посмотреть, во что скомпилился код, а разобраться в этом без ассемблера невозможно.
Что такое язык ассемблера и стоит ли его изучать
Ассемблер используют разработчики микроконтроллеров и драйверов — те, кто работает с железом.

Анастасия Хамидулина
Автор статьи
5 мая 2023 в 9:01
Про Python, Java, C пишут в блогах онлайн-школ, на хабре и ви-си. Эти языки — лидеры по рейтингу TIOBE, их часто выбирают новички, чтобы изучать как первый язык программирования. Но знания менее популярных языков программирования тоже востребованы. В статье рассматриваем язык ассемблера: о нём расскажет Алексей Каньков, старший backend-разработчик Revizto.
Что такое ассемблер
Язык ассемблера (Assembly, или ASM) — это язык программирования, который используют, чтобы написать программы для аппаратных платформ или архитектур.
В отличие от языков программирования высокого уровня, например Python или Java, язык ассемблера обеспечивает прямое представление инструкций машинного кода. Поэтому язык ассемблера называют языком низкого уровня: он ближе к двоичному коду, который понимает компьютер.
Если больший интерес вызывают языки высокого уровня, приходите на курс Skypro «Java-разработчик». За 11 месяцев научитесь работать с самыми популярными инструментами языка программирования Java и станете востребованным специалистом с дипломом о профессиональной переподготовке. Сможете устроиться на работу уже во время обучения.
Программы на языке ассемблера обычно пишут с комбинациями текстовой мнемоники и числовых кодов, известных как коды операций. Это инструкции: их выполняет процессор. Программы непросто писать и отлаживать из-за их низкоуровневой природы. Зато они дают больший контроль над аппаратным обеспечением компьютера и могут быть более эффективными, чем программы на языках высокого уровня.
Когда и как был создан
Язык программирования ассемблер существует с первых дней вычислительной техники. Его развитие можно проследить до первых электронных компьютеров, построенных в 1940-х и 1950-х.
Один из первых примеров языка ассемблера — язык, используемый для программирования компьютера Manchester Mark 1. Его разработала группа исследователей под руководством Фредерика Уильямса и Тома Килберна из Манчестерского университета в Англии. Manchester Mark 1 был одним из первых компьютеров, использующих архитектуру с хранимой программой. Его язык применяли для написания программ, которые хранились в его памяти.
Компьютерное оборудование развивалось — совершенствовались и языки ассемблера. Добавили новые инструкции и функции для более сложных операций и новых аппаратных возможностей. Сегодня язык ассемблера по-прежнему используют в специализированных областях. Например, в программировании встроенных систем и низкоуровневом системном программировании.
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Где используют язык ассемблера
Сейчас используют множество различных языков ассемблера, каждый из которых предназначен для конкретной аппаратной платформы или архитектуры. Примеры:
- x86 для ПК на базе Intel;
- ARM для мобильных устройств и встроенных систем;
- MIPS для некоторых встроенных систем и академического использования.
Ассемблер нужен в областях, где требуется низкоуровневое системное программирование или аппаратное управление:
Разработка операционной системы. Язык ассемблера используют при разработке ОС и драйверов устройств, для которых нужен прямой доступ к аппаратным компонентам.
Программирование встроенных систем. Ассемблер применяют для разработки микроконтроллеров и других небольших устройств с ограниченной вычислительной мощностью.
Разработка игр. Язык нужен, чтобы оптимизировать критически важные для производительности участки кода. Примеры игр, в которых использовали ассемблер: TIS-100, RollerCoaster Tycoon, Shenzhen I/O, Human Resource Machine. Правда, эти игры скорее для программистов: в них разрабатывают имитацию кода.
Обратный инжиниринг. Язык ассемблера часто используют для дизассемблирования и анализа двоичного кода.
Разработка вредоносных программ. Хакеры создают на ассемблере вирусы.
То есть язык ассемблера используют в тех областях, где критически важны производительность и аппаратный контроль. Там, где другие языки программирования высокого уровня не отвечают конкретным требованиям приложения.
Если хочется работать на них — приходите на курс «Python-разработчик». За 10 месяцев научитесь создавать логику программ, баз данных и разрабатывать приложения. Выполните несколько проектных работ: например, сделаете планировщик задач с авторизацией через соцсети и возможностью управлять карточками. Получите навыки, которые востребованы во многих IT-компаниях.
Как устроен язык ассемблера
Синтаксис
Синтаксис ассемблера может различаться: зависит от конкретной архитектуры или платформы. Одни языки используют двоеточия для меток или целей перехода, у других символы отличаются. Но в целом синтаксис состоит из серии инструкций и операндов, написанных с использованием текстовой мнемоники. Пример:
``` MOV AX, 1 ; move the value 1 into the AX register ADD AX, BX ; add the value in the BX register to the AX register ```
В этом примере MOV и ADD — это мнемоники для инструкций «переместить» и «добавить». AX и BX — это операнды. Они относятся к регистрам, в которых хранятся данные.
Синтаксис языка ассемблера точный и структурированный, потому что предназначен для работы с машинным кодом. Но это затрудняет чтение и написание кода для программистов, привыкших к языкам более высокого уровня.
Если хотите изучать более универсальные и популярные языки, начните с Java и Python. В онлайн-университете Skypro есть такие курсы: учим с нуля, делаем упор на практику. Научитесь разрабатывать приложения, сайты, социальные сети, игры, доски объявлений. В конце — диплом и помощь с работой. Не просто подбираем вакансии, а устраиваем на новую работу — или возвращаем деньги за обучение.
Директивы
В языке ассемблера директивы — это специальные инструкции. Они используются для предоставления дополнительной информации ассемблеру или компоновщику, а не выполняются как часть программы. Директивы обычно обозначают специальным символом, например точкой или решеткой.
`SECTION`: эта директива нужна для определения разделов программы, которые используют для группировки связанного кода и данных вместе.
`ORG`: чтобы установить исходный или начальный адрес программы или раздела.
`EQU`: чтобы определить константы или символы, которые используют во всей программе.
`DB`, `DW`, `DD`: для определения значений данных байтов, слов или двойных слов в памяти.
`ALIGN`: для выравнивания ячейки памяти следующей инструкции или значения данных с указанной границей.
`EXTERN`, `GLOBAL`: чтобы указать, определяется ли символ внешне или глобально. Эту информацию использует компоновщик для разрешения ссылок на символы в разных объектных файлах.
`INCLUDE`: для включения файла кода на языке ассемблера в текущую программу.
Директивы помогают управлять структурой и организацией программы на языке ассемблера, указывать дополнительную информацию для создания конечной исполняемой программы.
Команды
Команды языка ассемблера — основные строительные блоки программ. Эти инструкции используют, чтобы сообщить процессору, какие операции следует выполнять. В одних архитектурах сотни или тысячи различных инструкций, в других может быть всего несколько десятков.
Команды перемещения данных. Перемещают данные между регистрами или ячейками памяти: MOV, PUSH и POP.
Арифметические команды. Выполняют арифметические операции с данными в регистрах или ячейках памяти: ADD, SUB и MUL.
Логические команды. Выполняют логические операции с данными в регистрах или ячейках памяти: AND, OR и XOR.
Команды ветвления. Управляют путем перехода к другому разделу кода: JMP, JZ и JE.
Команды стека. Управляют стеком — областью памяти для хранения данных — и управляющей информацией во время вызовов функций и возвратов: PUSH и POP.
Системные вызовы. Позволяют программам на ассемблере взаимодействовать с операционной системой или другими системными функциями, такими как INT, которые запускают программное прерывание.
Ассемблерный код
Примеры фрагментов кода ассемблера для архитектуры x86:
``` section .data msg db 'Hello, world!', 0 section .text global _start _start: mov eax, 4 ; System call for write mov ebx, 1 ; File descriptor for stdout mov ecx, msg ; Address of message to print mov edx, 13 ; Length of message int 0x80 ; Call kernel mov eax, 1 ; System call for exit xor ebx, ebx ; Exit code 0 int 0x80 ; Call kernel ```
Эта программа определяет строку сообщения в разделе .data, а затем использует инструкцию mov для настройки параметров системного вызова. Выводит на экран сообщения с помощью системного вызова записи. Затем программа завершается с кодом выхода 0.
Сумма двух чисел:
``` section .data a dw 5 b dw 7 section .text global _start _start: mov ax, [a] ; Load first number into AX add ax, [b] ; Add second number to AX mov cx, ax ; Save result in CX mov eax, 1 ; System call for exit xor ebx, ebx ; Exit code 0 int 0x80 ; Call kernel ```
Эта программа определяет два значения в разделе .data, а потом использует инструкции mov и add для вычисления суммы двух чисел и сохранения результата в регистре cx. Затем программа завершается с кодом выхода 0.
Программа для вычисления последовательности Фибоначчи:
``` section .data n dw 10 section .bss fib resw 10 section .text global _start _start: mov eax, [n] mov ebx, 0 mov ecx, 1 mov edx, 2 mov [fib+ebx], ecx .loop: cmp edx, eax jge .done add ecx, [fib+ebx] mov [fib+edx], ecx mov ebx, edx inc edx jmp .loop .done: mov eax, 1 xor ebx, ebx int 0x80 ```
Эта программа использует цикл для вычисления первых n чисел в последовательности Фибоначчи и сохранения их в массиве, в разделе .bss. Затем программа завершается с кодом выхода 0.
Достоинства и недостатки ассемблера
Преимущества
➕ Эффективность: программы на языке ассемблера можно оптимизировать для конкретной архитектуры — это делает их эффективными и быстрыми.
➕ Низкоуровневый контроль над аппаратными ресурсами: позволяет разработчикам писать программы, адаптированные к конкретным аппаратным требованиям.
➕ Небольшой размер кода: программы на языке ассемблера обычно меньше программ на языках более высокого уровня. Это важно в определенных встроенных системах или других средах с ограниченным объемом памяти.
➕ Переносимость: язык используют для написания кода, который можно скомпилировать для работы на разных платформах с соответствующими модификациями.
➕ Отладка: язык ассемблера полезен для отладки низкоуровневых проблем в программах или оборудовании.
Недостатки
➖ Сложность: язык ассемблера гораздо сложнее написать и понять, чем языки более высокого уровня. Программирование на ассемблере утомительно и занимает много времени: разработчики должны писать код даже для самых простых операций.
Сначала лучше изучать более популярные, универсальные и простые языки. Например, на курсе Skypro «Python-разработчик» изучите Python — его применяют на разных платформах и широко используют в разработке интернет-приложений, программного обеспечения и машинном обучении.
➖ Ограниченная абстракция: в языке нет многих абстракций и высокоуровневых конструкций — это затрудняет написание сложных программ.
➖ Сопровождение: программы на ассемблере трудно поддерживать, потому что изменения в аппаратном или программном обеспечении требуют значительных обновлений кода.
➖ Отладка: это еще и минус, потому что отладка кода на языке ассемблера сложная — проблемы низкого уровня трудно диагностировать и исправить.
Стоит ли изучать язык ассемблера
Это зависит от ваших целей и интересов. Если хотите писать высокопроизводительный код для конкретной аппаратной платформы или устройства, ассемблер полезен. Еще знания пригодятся для отладки низкоуровневых проблем в программах или оборудовании.
Но учитывайте, что язык ассемблера требует глубокого понимания компьютерной архитектуры и наборов инструкций. Учить его сложнее, чем языки более высокого уровня. Особенно если нет опыта в области компьютерных наук, вы еще не знакомы с архитектурой компьютера и концепциями низкоуровневого программирования.
Востребованы ли программисты на ассемблере сегодня
Программирование на языке assembler не так распространено, как раньше. Но всё еще есть отрасли и приложения, где он нужен. Например, встроенные системы, разработка операционных систем и реверс-инжиниринг.
Этот язык программирования используют только для максимально эффективной разработки, потому что команды работают с процессором или контроллером напрямую. То есть код ассемблера будет максимально быстро исполняться и четко работать.
Изучать его стоит, если вы планируете программировать микросхемы или писать эффективные программы для процессоров. Потому что писать программы на ассемблере трудоемко, а разрабатывать приложения с интерфейсами для пользователей бессмысленно.
На 13 марта 2023-го на хедхантере 50 075 вакансий программистов, а вакансий с упоминанием Assembler всего 244 по России — меньше 0,5%. Но с учетом тренда на импортозамещение спрос на таких программистов может вырасти.
Юрий Гизатуллин, руководитель и сооснователь digital-агентства TIQUM, сооснователь RB7.ru




Примеры вакансий на хедхантере с упоминанием ассемблера: зарплаты от 100 000 ₽ до 500 000 ₽
Главное: что такое ассемблер
- Ассемблер — это язык программирования низкого уровня. Он нужен для программирования микроконтроллеров или написания программ, которые работают с процессорами напрямую. Еще его используют для анализа двоичного кода, создания вирусов, оптимизации важных для производительности участков кода при разработке игр.
- Преимущества языка ассемблера: низкоуровневый контроль над аппаратными ресурсами, небольшой размер кода. Код ассемблера можно скомпилировать для работы на разных платформах с соответствующими модификациями. Язык ассемблера полезен для отладки низкоуровневых проблем в программах или оборудовании. Программы на языке ассемблера можно оптимизировать для конкретной архитектуры.
- Недостатки: в языке нет многих абстракций и высокоуровневых конструкций, его сложно изучать, а программы на ассемблере трудно поддерживать.
Ассемблер против C: Зачем изучать ассемблер?
В настоящее время программирование большинства встраиваемых систем выполняется на C; а если не на C, то на другом языке высокого уровня, таком как C ++.
Так было не всегда. В начале появления встраиваемых систем код писался на ассемблере; это был единственный вариант. В те дни память была чрезвычайно ограничена, поэтому требовался очень жесткий контроль за ее использованием, и ассемблер обеспечивал этот контроль. Но, кроме этого, не было доступных инструментов для языков высокого уровня.
Прошло несколько лет, прежде чем на рынке появились инструменты, и еще несколько лет, прежде чем их качество стало достаточно хорошим для разработки серьезного кода. Инструменты появились как раз в нужное время, поскольку процессоры становились всё более мощными (стали доступными 16-разрядные и 32-разрядные устройства), память становилась всё дешевле и плотнее, а сложность приложений увеличивалась.
Итак, что насчет сегодня? У нас есть чрезвычайно мощные процессоры, которые могут быть обеспечены огромными объемами памяти, с чрезвычайно сложными приложениями, которые разрабатываются большими командами программистов.
Где пригодятся навыки знания ассемблера?
Зачем учить ассемблер? Навыки программирования встраиваемых систем
На самом деле есть два навыка, каждый из которых может быть ценным: умение читать/понимать язык ассемблера и умение писать на нем.
Почему вы должны знать, как читать на ассемблере
У большинства разработчиков программного обеспечения встраиваемых систем должна быть возможность читать на ассемблере. Это необходимо по двум причинам.
Во-первых, эффективность кода во встраиваемой системе почти всегда важна. Современные компиляторы обычно отлично справляются с оптимизацией кода. Тем не менее, важно понимать, какие замечательные вещи сделал компилятор. В противном случае при отладке может возникнуть путаница.
Компиляторы, как правило, не просто переводят C на язык ассемблера. Хороший современный компилятор берет алгоритм, написанный на C, и выводит функционально эквивалентный алгоритм, написанный на ассемблере. Не то же самое. Вот почему отладка может быть сложной.
Также возможно, что компилятор не справился идеально – возможно, код C был написан не самым ясным образом – и разработчик должен быть в состоянии понять, что пошло не так. Проверка сгенерированного компилятором кода должна быть рутинной частью процесса разработки. Она дает возможность убедиться, что вывод компилятора действительно выполняет то, что задумал программист, и не был неправильно истолкован чрезмерно усердным оптимизатором.
Вторая причина, по которой некоторым разработчикам необходимо иметь возможность читать ассемблер, заключается в том, что это важно при программировании «близко к аппаратному обеспечению». В настоящее время драйверы не обязательно написаны 100% на ассемблере, но некоторое содержание на ассемблере почти неизбежно. Необходимо в подробностях понимать, что делает драйвер, чтобы использовать его наиболее эффективно и устранять неисправности.
Почему вы должны знать, как писать на ассемблере
Как насчет написания на ассемблере? В настоящее время было бы очень необычно, чтобы целое приложение было написано на ассемблере; большая часть кода, по крайней мере, написана на C. Итак, навыки программирования на C являются ключевым требованием для разработки встраиваемого программного обеспечения. Тем не менее, некоторые разработчики должны иметь представление о программировании на ассемблере. Конечно, этот навык специфичен для конкретного процессора; однако, если разработчик освоил язык ассемблера для одного процессора, переход на другой не должен быть слишком сложным.
Есть две причины писать на ассемблере. Первая и самая важная причина заключается в реализации некоторых функций, которые невозможно выразить на C. Простым примером может быть отключение прерываний. Этого можно достичь, написав подпрограмму на ассемблере и вызывая ее так, как если бы она была функцией C. Чтобы реализовать это, должен быть известен протокол вызова/возврата используемого компилятора C, но это, как правило, легко понять. Например, вы можете просто посмотреть на код, сгенерированный компилятором.
Другой способ реализовать код на ассемблере – вставить его в код C, как правило, используя ключевое слово расширения asm . Это имеет смысл, когда требуется одна или несколько инструкций на ассемблере, поскольку устраняются накладные расходы на вызов/возврат. Реализация этого расширения варьируется от одного компилятора к другому, но обычно оператор asm принимает такую форму:
asm(" trap #0");
Как правило, единственные места, где требуется функциональность, которая не может быть описана на C, – это код запуска и драйверы устройств. В этой части разработки встраиваемого программного обеспечения участвует небольшое количество разработчиков. Таким образом, потребность в навыках письма на ассемблере, как упоминалось выше, ограничена избранной группой инженеров.
Некоторые разработчики считают, что им нужно знать, как писать на ассемблере, чтобы реализовать код «более эффективным» способом, чем это сделает компилятор. Возможно, что в некоторых очень редких случаях они могут быть правы. Однако большинство современных компиляторов выполняют замечательную работу по оптимизации и генерации эффективного кода (имейте в виду, что «эффективный» может означать быстро или компактно – выбираете вы, хотя иногда вы можете получить и то и другое).
#define ARRAYSIZE 4 char aaa[ARRAYSIZE]; int main()
Это похоже на простой цикл, который устанавливает каждый элемент массива на ноль. Если вы скомпилируете это с разумным количеством активированной оптимизации и попытаетесь отладить код, вы получите странный результат: он будет перепрыгивать прямо через цикл (то есть будет вести себя так, как если бы цикла не было вообще). Это связано с тем, что компилятор определяет, что 32-разрядное перемещение нуля в массив будет выполнять работу намного эффективнее, чем цикл.
Результирующий код (в данном случае для процессора ARM) выглядит примерно так:
mov r3, #0 ldr r2, .L3 mov r0, r3 str r3, [r2] bx lr .L3: .word .LANCHOR0
Изменение значения ARRAYSIZE дает интересные результаты. Установка в значение 5 дает такой результат:
mov r3, #0 ldr r2, .L3 mov r0, r3 str r3, [r2] strb r3, [r2, #4]
Еще нет цикла. При значении 8 продолжается в том же духе:
mov r3, #0 ldr r2, .L3 mov r0, r3 str r3, [r2] str r3, [r2, #4]
Затем сборка этого кода для 64-разрядного процессора дает еще лучший результат:
mov w0, 0 str xzr, [x1, #:lo12:.LANCHOR0]
И так продолжается. Большие размеры массива приводят к созданию эффективных циклов или, возможно, просто к вызову библиотечной функции, такой как memset() , стандартной библиотечной функции C, которую можно вызывать из ассемблера.
Суть в том, что навыки языка ассемблера далеко не устарели, но многие высококвалифицированные и очень продуктивные разработчики встраиваемого программного обеспечения могут быть ограничены в грамотном чтении кода на ассемблере.
Если вы хотите узнать больше о другой стороне этой концепции, посмотрите статью о языке C для программирования для страиваемых систем.
Поделитесь своими мыслями и опытом относительно использования языка ассемблера в комментариях ниже.
Теги
Сохранить или поделиться
На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.
В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.
Присоединяйтесь к нам во ВКонтакте!
- Антенны и распространение радиоволн
- Беспроводная связь
- Высокочастотная техника
- Волоконно-оптические линии связи (ВОЛС)
- Измерительная техника
- Исполнительные механизмы и драйверы
- САПР
- Спутниковая связь
- Схемотехника
- Телевидение
- Цифровая электроника
- Технологии и инструменты
- Электронные компоненты
- А что внутри?
- Прочее (радиоэлектроника)
- Алгоритмы и структуры данных
- Базы данных
- Веб-разработка
- Мультимедиа (разработка ПО)
- Нейронные сети
- Паттерны проектирования
- Связь
- Системы сборки ПО
- Языки программирования
- Компьютерные сети
- Операционные системы
- Верстка
- Системы контроля версий
- История технологий
- Мультимедиа
- Новости телекома
- Нормативная документация
- Охрана труда
- Полезные программы
- Просто интересно
- Экономика телекоммуникаций и электронной промышленности
- Экономика и инвестиции
Мы в соцсетях