ассемблер это машинный код
3.1. Машинный язык и ассемблер
На своем рабочем уровне микропроцессор реагирует на список операций, называемый машинной программой. На рис. 3.1, а приведено содержимое памяти, являющееся программой на машинном языке. Эта программа начинается с адреса 2000Н с содержимым КОП ОО11 11102 и оканчивается адресом 2006Н с содержимым 0111 01102. Человеку практически невозможно понять программу, представленную в такой форме.
Программа на машинном языке на рис. 3.1, а становится несколько проще для восприятия, когда она представлена в шестнадцатеричном коде (Н-коде), как показано на рис. 3.1, б. Однако, хотя двоичные данные приведены в шестнадцатеричном коде, эта часть программы всегда рассматривается как заданная на машинном языке и оказывается трудной для понимания.
В более приемлемой форме записанная на машинном языке она могла бы выглядеть так:
1. Загрузить двоичное число (1011 0100) в аккумулятор.
Инвертировать каждый двоичный бит содержимого аккумулятора.
Поместить результаты инверсии в ячейку памяти данных 2100Н.
В этой части осуществляется перевод двоичного 8-разрядного числа в его эквивалент в инверсной форме.
Возникает вопрос: как перейти от этой формы человеческого языка, иногда длинной и сложной, к машинному языку? Ответ состоит в использовании языка простого программирования – от самого высокого уровня до машинного, представленного на рис. 3.1. Ассемблер использует слова и фразы, преобразуя их в машинный код микропроцессора.
Программа на языке ассемблер, записанная человеком, могла бы быть представлена в виде табл. 3.1.
Число различных команд микропроцессора равно 78 и для них предложено 78 имен команд. Многие базовые команды порождают несколько различных кодов операций, поэтому общее число кодов команд равно 244.
Запомнить 244 восьмиразрядных двоичных кода очень трудно, и поэтому каждому коду ставится в соответствие мнемоническое название (мнемоника) команды, которое является сокращением от английских слов, описывающих ее действие. Например, IN 25 – input data at accumulator from port 25. На русский язык переводится так – ввести данные в аккумулятор из порта с адресом 25.
Мнемонический код команд позволяет легче запомнить их функции и значительно упрощает написание программ.
Такой язык написания программ называется языком ассемблера.
А затем эту программу на ассемблере надо перевести на язык, понятный микропроцессору, в последовательность двоичных восьмиразрядных чисел.
Перевод может происходить автоматически с помощью специальных программ-трансляторов (кросс-ассемблеров или ассемблеров) или вручную с помощью таблицы кодов команд.
При работе микропроцессор реагирует на список команд, называемый машинной программой. На рис. 3.1 показаны программы: а) в двоичном машинном коде; б) в шестнадцатеричном машинном коде.
Программа на рис. 3.1, а начинается с адреса 2000Н с содержимым КОП 001111100 и оканчивается адресом 2006 с содержимым 01110110. Человеку практически невозможно понять программу, представленную в таком виде. Хотя любая микропроцессорная система будет работать только с такой программой.
Программа, представленная на рис. 3.1, б, несколько проще для восприятия, так как она представлена в шестнадцатеричном коде, но все равно она трудна для понимания. Обе эти программы написаны на машинном языке.
А как программа, записанная на машинном языке, могла быть описана человеком?
1 – загрузить двоичное число 10110100 в аккумулятор;
2 – инвертировать каждый дв
оичный бит содержимого аккумулятора;
3 – поместить результат инверсии в ячейку памяти данных 2100Н;
4 – остановить микропроцессор.
Здесь осуществляется инвертирование двоичного восьмиразрядного числа.
Возникает вопрос: как перейти от этой формы человеческого языка, иногда длинной и сложной, к машинному языку.
Язык ассемблер использует слова и фразы, преобразуя их в машинный код микропроцессора.
Суть и процедура ассемблирования показаны на рис. 3.2, где вторая команда программы представлена единственной мнемоникой из трех букв CMA – complement accumulator – инвертировать содержимое аккумулятора.
Ход ассемблирования. Сначала три буквы переведены в их эквивалент в коде АСКИ, затем эти три кода АСКИ преобразованы в определенный порядок специальной программой ассемблера, которая выдает код инверсии содержимого аккумулятора на машинном языке – 2FH.
Программа, записанная человеком на языке ассемблера, выглядит следующим образом:
Программа разделена на 4 поля:
1 – поле метки; используется не всегда;
2 – поле мнемоники, содержит точную мнемонику, установленную разработчиком. Указывает программе ассемблера операцию для выполнения;
3 – поле операнда, содержит информацию о регистрах, данных и адресах, объединенных соответствующей операцией;
4 – поле комментариев, не учитывается ассемблером и ограничивается его перепечаткой. Очень важно, так как позволяет понять события в программе.
Что такое ассемблер и нужно ли его изучать
Этому языку уже за 70, но на пенсию он пока не собирается.
Есть традиция начинать изучение программирования с вывода на экран строки «Hello world!». На языке Python, например, это всего одна команда:
Всё просто, понятно и красиво! Но есть язык программирования, в котором, чтобы получить тот же результат, нужно написать солидный кусок кода:
Это ассемблер. Только не нужно думать, что он плох. Просто Python — это язык высокого уровня, а ассемблер — низкого. Одна команда Python при выполнении вызывает сразу несколько операций процессора, а каждая команда ассемблера — всего одну операцию.
Сложно? Давайте разбираться.
Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.
Немного о процессорах и машинном языке
Чтобы объяснить, что такое язык ассемблера, начнём с того, как вообще работает процессор и на каком языке с ним можно «разговаривать».
Процессор — это электронное устройство (сейчас крошечная микросхема, а раньше процессоры занимали целые залы), не понимающее слов и цифр. Он реагирует только на два уровня напряжения: высокий — единица, низкий — ноль. Поэтому каждая процессорная команда — это последовательность нулей и единиц: 1 — есть импульс, 0 — нет.
Для работы с процессором используется машинный язык. Он состоит из инструкций, записанных в двоичном коде. Каждая инструкция определяет одну простую машинную операцию: арифметическую над числами, логическую (поразрядную), ввода-вывода и так далее.
Например, для Intel 8088 инструкция 0000001111000011B — это операция сложения двух чисел, а 0010101111000011B — вычитания.
Программировать на машинном языке нелегко — приходится работать с огромными цепочками нулей и единиц. Трудно написать или проверить такую программу, а уж тем более разобраться в чужом коде.
Поэтому много лет назад был создан язык ассемблера, в котором коды операций обозначались буквами и сокращениями английских слов, отражающих суть команды. Например, команда mov ax, 6 означает: «переместить число 6 в ячейку памяти AX».
Когда и как был создан ассемблер?
Это произошло ещё в сороковых годах прошлого века. Ассемблер был создан для первых ЭВМ на электронных лампах, программы для которых писали на машинном языке. А так как памяти у компьютеров было мало, то команды вводили, переключая тумблеры и нажимая кнопки. Даже несложные вычисления занимали много времени.
Проблему решили, когда ЭВМ научились хранить программы в памяти. Уже в 1950 году была разработана первая программа-транслятор, которая переводила в машинный код программы, написанные на понятном человеку языке. Эту программу назвали программой-сборщиком, а язык — языком ассемблера (от англ. assembler — сборщик).
Появление ассемблера сильно облегчило жизнь программистов. Они смогли вместо двоичных кодов использовать команды, состоящие из близких к обычному языку условных обозначений. Кроме того, ассемблер позволил уменьшить размеры программ — для машин того времени это было важно.
Как устроен язык ассемблера?
Ассемблер можно считать языком второго поколения, если за первый принять машинный язык. Он работает непосредственно с процессором, и каждая его команда — это инструкция процессора, а не операционной или файловой системы. Перевод языка ассемблера в машинный код называется ассемблированием.
Коды операций в языке ассемблера мнемонические, то есть удобные для запоминания:
Регистрам и ячейкам памяти присваиваются символические имена, например:
EAX, EBX, AX, AH — имена для регистров;
meml — имя для ячейки памяти.
Например, так выглядит команда сложения чисел из регистров AX и BX:
А это команда вычитания чисел из регистров AX и BX:
Кроме инструкций, в языке ассемблера есть директивы — команды управления компилятором, то есть программой-ассемблером.
Вот некоторые из них:
Не думайте, что ассемблер — всего лишь набор инструкций процессора с удобной для программиста записью. Это полноценный язык программирования, на котором можно организовать циклы, условные переходы, процедуры и функции.
Вот, например, код, на ассемблере, выводящий на экран цифры от 1 до 10:
Здесь действие будет выполняться в цикле — как, например, в циклах for или do while в языках высокого уровня.
Единого стандарта для языков ассемблера нет. В работе с процессорами Intel разработчики придерживаются двух синтаксисов: Intel и AT&T. Ни у того ни у другого нет особых преимуществ: AT&T — стандартный синтаксис в Linux, а Intel используется в мире Microsoft.
Одна и та же команда в них выглядит по-разному.
Например, в синтаксисе Intel:
mov eax, ebx — команда перемещает данные из регистра eax в регистр ebx.
В синтаксисе AT&T эта команда выглядит так:
Почему для разных семейств процессоров нужен свой ассемблер?
Дело в том, что у каждого процессора есть набор характеристик — архитектура. Это его конструкция и принцип работы, а также регистры, адресация памяти и используемый набор команд. Если у процессоров одинаковая архитектура, то говорят, что они из одного семейства.
Так как наборы команд для разных архитектур процессоров отличаются друг от друга, то и программы на ассемблере, написанные для одних семейств, не будут работать на процессорах из других семейств. Поэтому ассемблер называют машинно-ориентированным языком.
Кому и зачем нужен язык ассемблера?
Даже из нашего примера «Hello, World!» видно, что ассемблер не так удобен в разработке, как языки высокого уровня. Больших программ на этом языке сейчас никто не пишет, но есть области, где он незаменим:
Если вы хотите разрабатывать новые микропроцессоры или стать реверс-инженером, то есть смысл серьёзно заняться изучением языка ассемблера.
Востребованы ли программисты на ассемблере сегодня?
Конечно. Хотя на сайтах по поиску работу вы вряд ли найдёте заявки от работодателей с заголовками: «Нужен программист на ассемблере», зато там много таких, где требуется знание ассемблера дополнительно к языкам высокого уровня: C, C++ или Python. Это вакансии реверс-инженеров, специалистов по компьютерной безопасности, разработчиков драйверов и программ для микроконтроллеров/микропроцессоров, системных программистов и другие.
Предлагаемая зарплата — обычная в сфере IT: 80–300 тысяч рублей в зависимости от квалификации и опыта. Вот, например, вакансия реверс-инженера на HeadHunter, где требуется знание ассемблера:
Стоит ли начинать изучение программирования с языка ассемблера?
Нет, так делать не нужно. Для этого есть несколько причин:
Поэтому, даже если вы решили заняться профессией, связанной с ассемблером, изучение программирования вам лучше начинать с языка высокого уровня. А уж ассемблер после него будет выучить несложно.
обложка: Полина Суворова для Skillbox Media
Ассемблер в 2k21: кто и зачем продолжает писать на машинно-ориентированном языке
Жизнь слишком коротка, чтобы кодить на ассемблере. И всё же в некоторых задачах он до сих пор незаменим.
В этом году ассемблер ворвался в топ-10 языков программирования по версии TIOBE, а значит, старичка ещё рано отправлять на пенсию. Мы пообщались с разработчиками, которые пишут код на ассемблере, а ещё изучили мнения зарубежных девелоперов на Quora и Stack Overflow.
Где используют ассемблер в 2021 году
Сегодня ассемблер используют как минимум в четырёх направлениях.
Операционные системы и компиляторы. Современные операционные системы, например дистрибутивы Linux, пишут на C/C++, но там есть фрагменты на ассемблере. Некоторые фрагменты g++ и компиляторы для BASIC и Fortran тоже написаны на машинно-ориентированном языке.
Встроенные системы и драйверы. На ассемблере пишут драйверы под Windows для архитектуры процессоров x86 и программы для AVR-микроконтроллеров и Arduino.
Кибербезопасность и хакинг. С помощью ассемблера хакеры взламывают ПО, а разработчики пишут на нём защиту от взлома. Иногда встречаются и вирусы на ассемблере. Их тяжелее обнаружить, и они куда эффективнее высокоуровневых.
Виртуальные машины / эмуляторы. Виртуальные машины тесно взаимодействуют с ОС, поэтому частично написаны на ассемблере. Как, например, LLVM или Surface Duo Emulator.
Есть мнение, что худо-бедно знать ассемблер нужно всем разработчикам. Он помогает отлаживать программы, когда обычные способы не работают, исправлять ошибки в стандартной библиотеке или функциях ОС. Разработчику проще оптимизировать код, если он понимает, как процессор обрабатывает инструкции.
«Считается, что веб-разработчику ассемблер знать ни к чему. Правда, потом страница с текстом потребляет 100% ресурсов процессора и 2 гигабайта ОЗУ. Если честно, всем, кто пишет прикладные программы, полезно знать, как работает компьютер. Хочется, чтобы все эти люди думали не в стиле „запустилось на моём сверхсовременном компе, и ладно“, а хоть немного пытались оптимизировать свои поделки и уж тем более не использовали всякие извращения вроде Electron».
Юрий Иваник,
администратор Telegram-чата про ассемблер pro.asm
Журналист, коммерческий автор и редактор. Пишет про IT, цифровой маркетинг и бизнес.
Сайт: darovska.com.
Операционные системы и низкоуровневое ПО
Ассемблеры — это целая группа машинно-ориентированных языков программирования. Набор команд ( ISA ) и архитектура конкретного ассемблера зависит от типа процессора. Поэтому для разных процессоров команды тоже будут разными — единого стандарта языка не существует.
«Ассемблер — это лёгкая мнемоническая обёртка для машинных команд процессора, в которой человеку их легче понять и запомнить. Чтобы писать на ассемблере, нужно понимать архитектуру процессора, набор его команд и адресные пространства. Сейчас ассемблер используют в основном разработчики микроконтроллеров, драйверов и чипов — в общем, те, кто непосредственно работает с железом».
«Иногда ассемблер называют машинным языком, но это не совсем корректно. Машинный язык — это нули и единицы, понятные процессору. А программа на ассемблере проходит фазу компиляции — преобразования кода, понятного человеку, в набор байтов, понятный процессору.
Ассемблер используют там, где важен каждый такт работы исполнительного ядра, высокая производительность или ресурсы крайне ограничены. На языке ассемблера можно писать программы, драйвера, да хоть саму ОС! И такая даже есть — KolibriOS».
Юрий Иваник,
администратор Telegram-чата про ассемблер pro.asm. Комментарий для Skillbox Media
«На ассемблере, например, пишут код начальной загрузки компьютера, который запускается перед средой выполнения языка более высокого уровня».
Лоуренс Стюарт,
технический директор Serissa Research
«Ассемблер незаменим для загрузчиков, демосцен (маленькие демки — интро до 512 байт, как правило), оптимизации кода. В ситуациях, когда крайне важна производительность и мало памяти для кода».
Встроенные системы
«Встроенные системы» — это микрокомпьютеры, которые решают определённые задачи. Они встречаются в автомобилях, телевизорах, цифровых камерах, IoT-устройствах и мобильных телефонах. Для встроенных систем исторически использовали именно ассемблер.
«Когда компиляторы и языки программирования были относительно примитивными, многие программы и даже операционные системы полностью писали на ассемблере. На машинном языке почти не кодили, а Fortran и COBOL плоховато подходили для встроенных систем.
Кросс-ассемблеры и кросс-компиляторы встречались редко — последние работали на мэйнфреймах и с дискет. Поставщики микропроцессоров или микроконтроллеров редко писали хорошие компиляторы, потому что не разбирались в программном обеспечении».
«Несколько лет назад я был разработчиком в компании, которая устанавливала видеодомофоны. Мы закупили гигантскую партию домофонов в Китае, а к ним прилагалось ПО, написанное на С++, документация — всё как положено.
На внутренних тестах выяснилось, что аппаратура страшно тормозит, и клиенты, очевидно, будут недовольны. А так как я был опытным разработчиком, мне поставили задачу ускорить работу системы. Классическая история, когда ошибку менеджеров и руководителей пытаются заткнуть техническими специалистами.
При анализе оборудования мы выяснили, что оно построено на микроконтроллерах с открытой архитектурой, у которых есть очень толковая документация, а вот ПО для них написали китайцы — причём чуть ли не перед отправкой к нам.
В итоге оно получилось страшно сырым и держалось на стандартных функциях из библиотек, написанных сообществом любителей этих микроконтроллеров. Я вооружился документацией и переписал кучу этих низкоуровневых функций на ассемблере. Это заметно повысило скорость работы — в некоторых случаях до 15 раз.
После этого было ещё несколько подобных задач. К программированию на ассемблере мы в основном обращались, когда нужно было «пошаманить» со скоростью выполнения низкоуровневых запросов к железу. Кстати, забавная история: спустя некоторое время я обнаружил в китайских драйверах к экшн-камере кусок своего кода на ассемблере!»
Василий Сысоев,
ведущий разработчик ООО «Встроенные системы». Комментарий для Skillbox Media
Со временем микроконтроллеры и процессоры стали быстрее и умнее, поэтому всё больше популярности набирали языки высокого уровня.
«Ассемблер до сих пор используют во встроенных системах, когда ресурсов мало или нужна жёсткая оптимизация. Но чаще всего код для встраиваемых систем пишут на С».
Евгений Красников,
участник сообщества pro.asm. Комментарий для Skillbox Media
Кибербезопасность и хакинг
«Некоторые важные части микропрограмм для смарт-карт написаны на ассемблере — это помогает защитить программное обеспечение от атак. Ассемблер — единственный язык, на котором вы полностью контролируете двоичный код программы. Это важно, ведь компилятор может оставить „дыру“ в прошивке, через которую злоумышленник взломает аппаратуру».
Любые задачи, с которыми не справляются С/С++
Сейчас встраиваемые системы чаще всего программируют на C — это стандарт. Также популярность набирает C++. А на ассемблере в основном пишут специфические программы, например для цифровой обработки сигналов, или когда высокоуровневые языки уже не справляются:
Но даже в этих случаях основную часть программы пишут на C или C++, а код ассемблера встраивают с помощью механизма asm. С другой стороны, в некоторых системах код на С работает слишком медленно и переписать его на ассемблере может быть вполне практичным решением.
«Пока в России не запретили квадрокоптеры, я собирал многовинтовые летательные аппараты. Мне пришлось с нуля писать софт на ассемблере для управления периферическим оборудованием. Оно подключается к основному контроллеру коптера. Аналогов не было — они появились позже, у производителей беспилотников типа DJI.
Сначала я писал весь софт на С, но код работал медленно и непредсказуемо. Тогда решил программировать на ассемблере. В общем, сейчас на ассемблере пишут ПО для встроенных систем, носимой электроники, драйверов устройств — когда нужно обеспечить идеальную точность и скорость работы с микропроцессором. Микропроцессоры „думают“ на языке, очень похожем на ассемблер».
Василий Сысоев,
ведущий разработчик в ООО «Встроенные системы»
«Есть несколько случаев, когда оптимизированный вручную язык ассемблера будет эффективнее языка ассемблера, сгенерированного компилятором из исходного кода C. Да и разработчику, привыкшему к ассемблеру, некоторые вещи проще написать на нём. В этих случаях многие компиляторы C допускают встроенную сборку.
Но компиляторы C становятся всё лучше, так что ручная оптимизация почти не нужна. А ещё большинство платформ налагает ограничения на некоторые низкоуровневые программы».
«Сейчас на ассемблере пишут специфичные команды процессора, которые не поддерживаются языком C. Но это уже редкость».
Алан Меллор,
бывший старший разработчик на С в Siemens
Как писать на ассемблере в 2018 году
Статья посвящена языку ассемблер с учетом актуальных реалий. Представлены преимущества и отличия от ЯВУ, произведено небольшое сравнение компиляторов, скрупулёзно собрано значительное количество лучшей тематической литературы.
1. Язык. Преимущества и отличия от ЯВУ
Ассемблер (Assembly) — язык программирования, понятия которого отражают архитектуру электронно-вычислительной машины. Язык ассемблера — символьная форма записи машинного кода, использование которого упрощает написание машинных программ. Для одной и той же ЭВМ могут быть разработаны разные языки ассемблера. В отличие от языков высокого уровня абстракции, в котором многие проблемы реализации алгоритмов скрыты от разработчиков, язык ассемблера тесно связан с системой команд микропроцессора. Для идеального микропроцессора, у которого система команд точно соответствует языку программирования, ассемблер вырабатывает по одному машинному коду на каждый оператор языка. На практике для реальных микропроцессоров может потребоваться несколько машинных команд для реализации одного оператора языка.
Язык ассемблера обеспечивает доступ к регистрам, указание методов адресации и описание операций в терминах команд процессора. Язык ассемблера может содержать средства более высокого уровня абстракции: встроенные и определяемые макрокоманды, соответствующие нескольким машинным командам, автоматический выбор команды в зависимости от типов операндов, средства описания структур данных. Главное достоинство языка ассемблера — «приближенность» к процессору, который является основой используемого программистом компьютера, а главным неудобством — слишком мелкое деление типовых операций, которое большинством пользователей воспринимается с трудом. Однако язык ассемблера в значительно большей степени отражает само функционирование компьютера, чем все остальные языки.
И хотя драйвера и операционные системы сейчас пишут на Си, но Си при всех его достоинствах — язык высокого уровня абстракции, скрывающий от программиста различные тонкости и нюансы железа, а ассемблер — язык низкого уровня абстракции, прямо отражающий все эти тонкости и нюансы.
Для успешного использования ассемблера необходимы сразу три вещи:
Оптимальной можно считать программу, которая работает правильно, по возможности быстро и занимает, возможно, малый объем памяти. Кроме того, ее легко читать и понимать; ее легко изменить; ее создание требует мало времени и незначительных расходов. В идеале язык ассемблера должен обладать совокупностью характеристик, которые бы позволяли получать программы, удовлетворяющие как можно большему числу перечисленных качеств.
На языке ассемблера пишут программы или их фрагменты в тех случаях, когда критически важны:
Языки программирования высокого уровня абстракции разрабатывались с целью возможно большего приближения способа записи программ к привычным для пользователей компьютеров тех или иных форм записи, в частности математических выражений, а также чтобы не учитывать в программах специфические технические особенности отдельных компьютеров. Язык ассемблера разрабатывается с учетом специфики процессора, поэтому для грамотного написания программы на языке ассемблера требуется, в общем, знать архитектуру процессора используемого компьютера. Однако, имея в виду преимущественное распространение PC-совместимых персональных компьютеров и готовые пакеты программного обеспечения для них, об этом можно не задумываться, поскольку подобные заботы берут на себя фирмы-разработчики специализированного и универсального программного обеспечения.
2. О компиляторах
Какой ассемблер лучше?
Для процессора x86-x64, имеется более десятка различных ассемблер компиляторов. Они отличаются различными наборами функций и синтаксисом. Некоторые компиляторы больше подходят для начинающих, некоторые ― для опытных программистов. Некоторые компиляторы достаточно хорошо документированы, другие вообще не имеют документации. Для некоторых компиляторов разработано множеством примеров программирования. Для некоторых ассемблеров написаны учебные пособия и книги, в которых подробно рассматривается синтаксис, у других нет ничего. Какой ассемблер лучше?
Учитывая множество диалектов ассемблеров для x86-x64 и ограниченное количество времени для их изучения, ограничимся кратким обзором следующих компиляторов: MASM, TASM, NASM, FASM, GoASM, Gas, RosAsm, HLA.
Какую операционную систему вы бы хотели использовать?
Это вопрос, на который вы должны ответить в первую очередь. Самый многофункциональный ассемблер не принесет вам никакой пользы, если он не предназначен для работы под ту операционную систему, которую вы планируете использовать.
Windows | DOS | Linux | BSD | QNX | MacOS, работающий на процессоре Intel/AMD | |
---|---|---|---|---|---|---|
FASM | x | x | x | x | ||
GAS | x | x | x | x | x | x |
GoAsm | x | |||||
HLA | x | x | ||||
MASM | x | x | ||||
NASM | x | x | x | x | x | x |
RosAsm | x | |||||
TASM | x | x |
Поддержка 16 бит
Если ассемблер поддерживает DOS, то он поддерживает и 16-разрядные команды. Все ассемблеры предоставляют возможность писать код, который использует 16-разрядные операнды. 16-разрядная поддержка означает возможность создания кода, работающего в 16-разрядной сегментированной модели памяти (по сравнению с 32-разрядной моделью с плоской памятью, используемой большинством современных операционных систем).
Поддержка 64 бит
За исключением TASM, к которому фирма Borland охладела в середине нулевых, и, который не поддерживает в полном объеме даже 32-разрядные программы, все остальные диалекты поддерживают разработку 64-разрядных приложений.
Переносимость программ
Очевидно, что вы не собираетесь писать код на ассемблере x86-x64, который запускался бы на каком-то другом процессоре. Однако, даже на одном процессоре вы можете столкнуться с проблемами переносимости. Например, если вы предполагаете компилировать и использовать свои программы на ассемблере под разными операционными системами. NASM и FASM можно использовать в тех операционных системах, которые они поддерживают.
Предполагаете ли вы писать приложение на ассемблере и затем портировать, это приложение с одной ОС на другую с «перекомпиляцией» исходного кода? Эту функцию поддерживает диалект HLA. Предполагаете ли вы иметь возможность создавать приложения Windows и Linux на ассемблере с минимальными усилиями для этого? Хотя, если вы работаете с одной операционной системой и абсолютно не планируете работать в какой-либо другой ОС, тогда эта проблема вас не касается.
Поддержка высокоуровневых языковых конструкций
Некоторые ассемблеры предоставляют расширенный синтаксис, который обеспечивает языковые высокоуровневые структуры управления (типа IF, WHILE, FOR и так далее). Такие конструкции могут облегчить обучение ассемблеру и помогают написать более читаемый код. В некоторые ассемблеры встроены «высокоуровневые конструкции» с ограниченными возможностями. Другие предоставляют высокоуровневые конструкции на уровне макросов.
Никакой ассемблер не заставляет вас использовать какие-либо структуры управления или типы данных высокого уровня, если вы предпочитаете работать на уровне кодировки машинных команд. Высокоуровневые конструкции ― это расширение базового машинного языка, которое вы можете использовать, если найдете их удобными.
Качество документации
Удобство использования ассемблера напрямую связано с качеством его документации. Учитывая объем работы, который тратится для создания диалекта ассемблера, созданием документации для этого диалекта авторы компиляторов практически не заморачиваются. Авторы, расширяя свой язык, забывают документировать эти расширения.
В следующей таблице описывается качество справочного руководства ассемблера, которое прилагается к продукту:
Учебники и учебные материалы
Документация на самом ассемблере, конечно, очень важна. Еще больший интерес для новичков и других, изучающих язык ассемблера (или дополнительные возможности данного ассемблера), ― это наличие документации за пределами справочного руководства для языка. Большинство людей хотят, чтобы учебник, объясняющий, как программировать на ассемблере, не просто предоставляет синтаксис машинных инструкций и ожидает, что читателю объяснят, как объединять эти инструкции для решения реальных проблем.
MASM является лидером среди огромного объема книг, описывающих, как программировать на этом диалекте. Есть десятки книг, которые используют MASM в качестве своего ассемблера для обучения ассемблеру.
Большинство учебников по ассемблеру MASM/TASM продолжают обучать программированию под MS-DOS. Хотя постепенно появляются учебники, которые обучают программированию в Windows и Linux.
3. Литература и веб ресурсы
Beginners
Advanced
4. Практика
Итак, вы уже знаете, что такое ассемблер и с чем его едят. Вы запаслись парой/тройкой книг и веб мануалами, возможно определились и с компилятором… К сожалению уроки программирования выходят за рамки данной статьи, но для тех чей выбор пал на MASM/FASM можете воспользоваться следующими макетами:
Желаем вам, друзья, значительных достижений и новых знаний в 2018 году!
С уважением
Михаил Смоленцев MiklIrk (Иркутский государственный университет путей сообщения),
Алексей Гриценко expressrus (Донской государственный технический университет).
Ps1: Уважаемый, Хабрахабр! Добавьте в ваш редактор подсветку ассемблера (Intel-синтаксис), это пригодится для будущих статей!