Машинные коды и ассемблер кратко

Обновлено: 05.07.2024

Казалось бы, за такое количество времени язык должен безнадежно устареть, но ассемблер регулярно входит в топы наиболее популярных. В нашей статье мы расскажем, почему так происходит, разберем основные характеристики этого языка, а также подскажем, кому стоит изучать его.

Характеристика языка ассемблера

Название ассемблер взято от английского assemble, что в переводе означает собирать, монтировать. По сути – это разновидность транслятора. Ассемблер представляет собой язык низкого уровня, который используется внутри операционной системы для того, чтобы в автоматическом режиме преобразовывать исходную программу (заданную компьютеру) на машинный язык.

По составляющим ассемблера становится понятна архитектура электронно-вычислительной машины. На ассемблере машинный язык представляется в виде символики, благодаря чему программы пишутся гораздо проще. Можно разработать несколько языков ассемблера, подходящих одному и тому же компьютеру. Когда программист работает с высокоуровневым языком, то не видит проблем, связанных с реализацией алгоритмов. А ассемблер открыто взаимодействует с компьютерной системой команд.

Характеристика языка ассемблера

Характеристика языка ассемблера

Язык ассемблер дает доступ к регистрам, позволяет указывать методы адресации и использовать терминологию команд процессора для описания операций. В состав языка может входить инструментарий более высокого уровня. Например, макрокоманды (и встроенные, и определяемые), аналогичные набору из нескольких машинных команд; возможность задавать автоматический выбор команд (по типам операндов); инструменты для описания структур данных.

Компилятор, трансформирующий язык ассемблера в команды машинного языка, часто тоже называют ассемблером, хотя для него есть ещё название – мнемокод. С его помощью машинные коды трансформируются в мнемонический (удобный для восприятия) вид.

Есть отдельные ассемблеры и для разных по архитектуре процессоров, и для разных операционных систем. К примеру, программу для машины с одной архитектурой можно ассемблировать с помощью кросс-ассемблера под машину с другой архитектурой (или операционкой).

Ассемблер дает доступ к регистрам, позволяет указывать методы адресации и использовать терминологию команд процессора для описания операций. В состав языка может входить инструментарий более высокого уровня. Например, макрокоманды (и встроенные, и определяемые), аналогичные набору из нескольких машинных команд; возможность задавать автоматический выбор команд (по типам операндов); инструменты для описания структур данных.

Между командами ассемблера и процессора существует соответствие, что позволяет записывать команды и аргументы в установленной символьной форме. И данные, и части программы в процессе ассемблирования связываются между собой посредством меток. Сначала для каждой метки определяется адрес, который потом и ставится в места вхождения меток.

Ваш Путь в IT начинается здесь

Подробнее

Понятно, что у разных микропроцессоров системы команд неодинаковы. Поэтому для каждого процессора есть персональный набор команд, написанных на языке программирования ассемблер и собственные компиляторы-ассемблеры.

Синтаксис языка ассемблера

Структура языка ассемблера не включает в себя общепринятые для других языков основы синтаксиса. Тем не менее, специалисты по ассемблеру применяют, как правило, определенные общие подходы к программированию. Подобными общепринятыми стандартами считаются AT&T-синтаксис и Intel-синтаксис.

Данные стандарты записываются с применением единого формата, и выглядит он так:

Синтаксис языка ассемблера

Синтаксис языка ассемблера

Опкод – это и есть ассемблерная команда. Он выступает в роли инструкции к определенному процессору. В записи могут присутствовать специальные префиксы, а среди них, в свою очередь бывают изменения, представленные адресациями и повторениями.

Язык программирования Python: сферы применения, методы и этапы изучения

Операндами же тут являются названия регистров, констант, адресов, хранящихся в оперативной памяти компьютера. Но имейте в виду, что между стандартами синтаксиса существует отличие. Какое именно? В процессе адресации может меняться порядок перечисления операндов. При этом для процессоров, объединенных одной архитектурой, используемые команды будут одинаковыми.

Плюсы и минусы языка ассемблера

  • Ассемблер – машинный язык, позволяющий максимально задействовать возможности процессора. При этом применять как можно меньше команд и обращений к памяти, что уменьшает размер и повышает скорость работы программы.
  • Доступ к расширенным наборам инструкций процессора (MMX, SSE, SSE2, SSE3).
  • Доступность портов входа-выхода и особых регистров процессора. Обычно в операционных системах этими опциями можно пользоваться лишь применительно к драйверам и модулям ядра.
  • Можно задействовать самомодифицирующийся код, причем и перемещаемый – тоже. Очень во многих случаях это недоступная опция из-за запрета на запись в страницы кода (аппаратных записей это тоже касается). Впрочем, большая часть используемых систем имеет недостатки, по причине которых становится доступно исполнение кода, если только он расположен в сегменте данных, где запись не запрещена.
  • Возможность адаптироваться под используемую платформу.

Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.

На своем рабочем уровне микропроцессор реагирует на список операций, называемый машинной программой. На рис. 3.1, а приведено содержимое памяти, являющееся программой на машинном языке. Эта программа начинается с адреса 2000Н с содержимым КОП ОО11 11102 и оканчивается адресом 2006Н с содержимым 0111 01102. Человеку практически невозможно понять программу, представленную в такой форме.

Программа на машинном языке на рис. 3.1, а становится несколько проще для восприятия, когда она представлена в шестнадцатеричном коде (Н-коде), как показано на рис. 3.1, б. Однако, хотя двоичные данные приведены в шестнадцатеричном коде, эта часть программы всегда рассматривается как заданная на машинном языке и оказывается трудной для понимания.

В более приемлемой форме записанная на машинном языке она могла бы выглядеть так:

1. Загрузить двоичное число (1011 0100) в аккумулятор.

Инвертировать каждый двоичный бит содержимого аккумулятора.

Поместить результаты инверсии в ячейку памяти данных 2100Н.

Возникает вопрос: как перейти от этой формы человеческого языка, иногда длинной и сложной, к машинному языку? Ответ состоит в использовании языка простого программирования от самого высокого уровня до машинного, представленного на рис. 3.1. Ассемблер использует слова и фразы, преобразуя их в машинный код микропроцессора.

Обычно фраза или заданная величина на ассемблере будет соответствовать выражению длиной от одного до трех байт машинного языка. Суть и процедура ассемблирования показаны на рис. 3.2, где, например, вторая команда программы представлена единственной мнемоникой из трех букв СМА (инвертировать содержимое аккумулятора). Сначала три буквы переведены в их эквивалент в коде ASCI , затем три кода AS СI преобразованы в оп­ределенный порядок специальной программой ассемблера, которая выдает код инверсии содержимого аккумулятора на машинном языке, т.е. 0010 11112 в данном случае или 2FH. Мнемоника преобразована в один единственный байт машинного языка.

Программа на языке ассемблер, записанная человеком, могла бы быть представлена в виде табл. 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 поле комментариев, не учитывается ассемблером и ограничивается его перепечаткой. Очень важно, так как позволяет понять события в программе.


Листинг программы на языке ассемблера Motorola MC6800 (слева идут адреса и машинные коды в шестнадцатеричной системе, вычисленные и сгенерированные ассемблером из исходного кода программы, справа показан сам текст программы с мнемоническими инструкциями, метками, директивами, выражениями и комментариями)

Язык ассе́мблера (англ. assembly language ) — машинно-ориентированный язык низкого уровня с командами, обычно соответствующими командам машины, который может обеспечить дополнительные возможности вроде макрокоманд [1] ; автокод, расширенный конструкциями языков программирования высокого уровня, такими как выражения, макрокоманды, средства обеспечения модульности программ [2] . Автокод — язык программирования, предложения которого по своей структуре в основном подобны командам и обрабатываемым данным конкретного машинного языка. [2]

Язык ассемблера — система обозначений, используемая для представления в удобочитаемой форме программ, записанных в машинном коде. Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления). [3]

Перевод программы на языке ассемблера в исполнимый машинный код (вычисление выражений, раскрытие макрокоманд, замена мнемоник собственно машинными кодами и символьных адресов на абсолютные или относительные адреса) производится ассемблером — программой-транслятором, которая и дала языку ассемблера его название.

Содержание

Содержание языка

Команды языка ассемблера один к одному соответствуют командам процессора. Фактически, они и представляют собой более удобную для человека символьную форму записи — мнемокоды — команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора. [4]

Кроме того, язык ассемблера позволяет использовать символические метки вместо адресов ячеек памяти, которые при ассемблировании заменяются на вычисляемые ассемблером или компоновщиком абсолютные или относительные адреса, а также так называемые директивы (команды ассемблера, не переводимые в машинные команды процессора, а выполняемые самим ассемблером).

Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами.

Каждая модель (или семейство) процессоров имеет свой набор — систему — команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы языков ассемблера — Intel-синтаксис и AT&T-синтаксис.

Существуют компьютеры, реализующие в качестве машинного язык программирования высокого уровня (Форт, Лисп, Эль-76). Фактически, в таких компьютерах они выполняют роль языков ассемблера.

Достоинства и недостатки

Достоинства

  • Язык ассемблера позволяет писать самый быстрый и компактный код, какой вообще возможен для данного процессора.
  • Если код программы достаточно большой, — данные, которыми он оперирует, не помещаются целиком в регистрах процессора, то есть частично или полностью находятся в оперативной памяти, — то искусный программист, как правило, способен значительно оптимизировать программу по сравнению с транслятором с языка высокого уровня по одному или нескольким параметрам:
    • скорость работы — за счёт оптимизации вычислительного алгоритма и/или более рационального обращения к ОП, перераспределения данных;
    • объём кода (в том числе за счёт эффективного использования промежуточных результатов). (Сокращение объёма кода также нередко повышает скорость выполнения программы.)

    Недостатки

    Применение

    Исторически, если первым поколением языков программирования считать машинные коды, то язык ассемблера можно рассматривать как второе поколение языков программирования. Недостатки языка ассемблера, сложность разработки на нём больших программных комплексов привели к появлению языков третьего поколения — языков программирования высокого уровня (таких как Фортран, Лисп, Кобол, Паскаль, Си и др.). Именно языки программирования высокого уровня и их наследники в основном используются в настоящее время в индустрии информационных технологий. Однако языки ассемблера сохраняют свою нишу, обусловленную их уникальными преимуществами в части эффективности и возможности полного использования специфических средств конкретной платформы.

    На языке ассемблера пишут программы или их фрагменты в тех случаях, когда критически важны:

    • быстродействие (драйверы, игры);
    • объём используемой памяти (загрузочные секторы, встраиваемое (англ.embedded ) программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты).

    С использованием программирования на языке ассемблера производятся:

    • Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фиксированную производительность, и для мультимедийныхкодеков, которые стремятся делать менее ресурсоёмкими и более быстрыми.
    • Создание операционных систем (ОС) или их компонентов. В настоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в основном на Си — языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения (hardware abstraction layer) и ядро, часто пишутся на языке ассемблера. Фактически, ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надёжность, но, тем не менее, он там присутствует. Некоторые любительские ОС, такие как MenuetOS, целиком написаны на языке ассемблера. При этом MenuetOS помещается на дискету и содержит графический многооконный интерфейс.
    • Программирование микроконтроллеров (МК) и других встраиваемых процессоров. По мнению профессора Таненбаума, развитие МК повторяет историческое развитие компьютеров новейшего времени. [9] На сегодняшний день для программирования МК весьма часто применяют язык ассемблера (хотя и в этой области широкое распространение получают языки вроде Си). В МК приходится перемещать отдельные байты и биты между различными ячейками памяти. Программирование МК весьма важно, так как, по мнению Таненбаума, в автомобиле и квартире современного цивилизованного человека в среднем содержится 50 микроконтроллеров. [10]
    • Создание драйверов. Некоторые части драйверов программируют на языке ассемблера. Хотя в целом в настоящее время драйверы также стараются писать на языках высокого уровня в связи с повышенными требованиями к надёжности и достаточной производительностью современных процессоров и достаточным совершенством компиляторов с языков высокого уровня. Надёжность для драйверов играет особую роль, поскольку в Windows NT и UNIX (в том числе в Linux) драйверы работают в режиме ядра. Одна ошибка в драйвере может привести к краху всей системы.
    • Создание антивирусов и других защитных программ.
    • Написание трансляторов языков программирования.

    Связывание программ на разных языках

    Поскольку уже давно на языке ассемблера часто кодируют только фрагменты программ, их необходимо связывать с остальными частями программной системы, написанными на других языках программирования. Это достигается двумя основными способами:

    • На этапе компиляции — вставка в исходный код программы на языке высокого уровня ассемблерных фрагментов (англ.inline assembler ) с помощью специальных директив языка. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода, с данными и подпрограммами, включая подпрограммы со множеством входов и выходов, не поддерживаемых языком высокого уровня, с его помощью сделать невозможно.
    • На этапе компоновки при раздельной компиляции. Для взаимодействия компонуемых модулей достаточно, чтобы импортируемые функции (определённые в одних модулях и используемые в других) поддерживали определённое соглашения вызова (англ.calling conventions ). Написаны же отдельные модули могут быть на любых языках, в том числе и на языке ассемблера.

    Синтаксис

    Синтаксис языка ассемблера определяется системой команд конкретного процессора.

    Набор команд

    Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры x86):

    • Команды пересылки данных ( mov и др.)
    • Арифметические команды ( add , sub , imul и др.)
    • Логические и побитовые операции ( or , and , xor , shr и др.)
    • Команды управления ходом выполнения программы ( jmp , loop , ret и др.)
    • Команды вызова прерываний (иногда относят к командам управления): int
    • Команды ввода/вывода в порты ( in , out )
    • Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например:
    • cjne — перейти, если не равно
    • djnz — декрементировать, и если результат ненулевой, то перейти
    • cfsneq — сравнить, и если не равно, пропустить следующую команду

    Инструкции

    Типичный формат записи команд:

    где мнемокод — непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.).

    В качестве операндов могут выступать константы, адреса регистров, адреса в оперативной памяти и пр. Различия между синтаксисом Intel и AT&T касаются в основном порядка перечисления операндов и указания различных методов адресации.

    Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров x86, ARM, SPARC, PowerPC, M68k). Они описываются в спецификации процессоров. Возможные исключения:

    • если ассемблер использует кроссплатформенный AT&T-синтаксис (оригинальные мнемоники приводятся к синтаксису AT&T);
    • если изначально существовало два стандарта записи мнемоник (система команд была наследована от процессора другого производителя).

    Например, процессор Zilog Z80 наследовал систему команд Intel 8080, расширил её и поменял мнемоники (и обозначения регистров) на свой лад. Процессоры Motorola Fireball наследовали систему команд Z80, несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel и в данный момент половина ассемблеров для Fireball работает с мнемониками Intel, а половина — с мнемониками Zilog.

    Директивы

    Язык ассемблера (автокод) — язык программирования низкого уровня. В отличие от языка машинных кодов, позволяет использовать более удобные для человека мнемонические (символьные) обозначения команд. При этом для перевода с языка ассемблера в понимаемый процессором машинный код требуется специальная программа, называемая ассемблером.

    Содержание

    Содержание языка

    Команды языка ассемблера один к одному соответствуют командам процессора, фактически, они представляют собой более удобную для человека символьную форму записи (мнемокод) команд и их аргументов.

    Кроме того, язык ассемблера обеспечивает использование символических меток вместо адресов ячеек памяти, которые при ассемблировании заменяются на автоматически рассчитываемые абсолютные или относительные адреса, а также так называемых директив (команд, не переводящихся в процессорные инструкции, а выполняемых самим ассемблером).

    Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макроопределения с параметрами.

    Каждая модель (или семейство) процессоров имеет свой набор команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы: Intel-синтаксис и AT&T-синтаксис.

    Достоинства и недостатки

    Достоинства

    Недостатки

    Применение

    Исторически можно рассматривать ассемблер как второе поколение языков программирования ЭВМ (если первым считать машинный код). Недостатки ассемблера, сложность разработки на нем больших программных комплексов привели к появлению языков третьего поколения — языков программирования высокого уровня (Фортран, Лисп, Кобол, Паскаль, Си и др.). Именно языки программирования высокого уровня и их наследники в основном используются в настоящее время в индустрии информационных технологий. Однако, языки ассемблера сохраняют свою нишу, обуславливаемую их уникальными преимуществами в части эффективности и возможности полного использования специфических средств конкретной платформы.

    На ассемблере пишутся программы или фрагменты программ, для которых критически важны:

    • быстродействие (драйверы, игры);
    • объем используемой памяти (загрузочные сектора, встраиваемое (привет) программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты).

    С использованием программирования на ассемблере производятся:

    • Оптимизация критичных к скорости участков программ написанных на языке высокого уровня, таком как C++. Это особенно актуально для игровых приставок, у которых фиксированная производительность, и для мультимедийныхкодеков, которые стремятся делать менее ресурсоемкими и более популярными.
    • Создание операционных систем (ОС). ОС часто пишут на Си, языке, который специально был создан для написания одной из первых версий Unix. Аппаратно зависимые участки кода, такие, как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения — HAL и ядро, часто пишутся на ассемблере. Ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся к переносимости и надёжность, но тем не менее он присутствует. Некоторые любительские ОС, такие, как MenuetOS, целиком написаны на ассемблере. При этом MenuetOS помещается на дискету и содержит графический многооконный интерфейс.
    • Программирование микроконтроллеров (МК) и других встраиваемых процессоров. По мнению профессора Танненбаума, развитие МК повторяет историческое развитие компьютеров новейшего времени. [1] На сегодняшний день для программирования МК весьма часто применяют ассемблер. В МК приходится перемещать отдельные байты и биты между различными ячейками памяти. Программирование МК весьма важно, так как, по мнению Танненбаума, в автомобиле и квартире современного цивилизованного человека в среднем содержится 50 микроконтроллеров. [2]
    • Создание драйверов. Некоторые участки драйверов, взаимодействующие с аппаратным обеспечением, программируют на ассемблере. Хотя в целом в настоящее время драйверы стараются писать на языках высокого уровня в связи с повышенными требованиями к надёжности. Надёжность для драйверов играет особую роль, поскольку в Windows NT и Linux драйверы работают в режиме ядра. Одна ошибка может привести к краху системы.
    • Создание антивирусов и других защитных программ.
    • Написание трансляторов языков программирования.

    Нелегальная сфера деятельности

    Программирование на языке ассемблера характерно также для нелегальных сфер деятельности в ИТ, в частности, с использованием ассемблера производятся:

    Связывание программ на разных языках

    Поскольку на ассемблере часто разрабатываются только фрагменты программ, их необходимо связывать с остальными частями программной системы, написанными на других языках программирования.

    Это достигается 2 основными способами:

    • На этапе компиляции — вставка в программу ассемблерных фрагментов (привет) с помощью специальных директив языка (в частности, данный способ поддерживается языком программирования Си), в том числе написание функций на языке ассемблера. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода, с данными и подпрограммами, включая подпрограммы с множеством входов и выходов, не поддерживаемых высокоуровневыми языками, с помощью него сделать нельзя.
    • На этапе компоновки, или раздельной компиляции. Для взаимодействия скомпонованных модулей достаточно, чтобы связующие функции (определённые в одних модулях и использующиеся в других) поддерживали нужные соглашения вызова (привет) и типы данных. Написаны же отдельные модули могут быть на любых языках, в том числе и на ассемблере.

    Синтаксис

    Синтаксис языка ассемблера определяется системой команд конкретного процессора.

    Набор команд

    Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры x86):

    • Команды пересылки данных (mov, lea и т. д.)
    • Арифметичекие команды (add, sub, imul и т. д.)
    • Логические и побитовые операции (or, and, xor, shr и т. д.)
    • Команды управления ходом выполнения программы (jmp, loop, ret и т. д.)
    • Команды вызова прерываний (иногда относят к командам управления): int, into
    • Команды ввода/вывода в порты (in, out)
    • Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например:
    • cbne — перейти, если не равно
    • dbnz — декрементировать, и если результат ненулевой, то перейти
    • cfsneq — сравнить, и если не равно, пропустить следующую команду

    Инструкции

    Типичный формат записи команд: [метка:] опкод [операнды] [;комментарий]

    где опкод (код операции) — непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.).

    В качестве операндов могут выступать константы, адреса регистров, адреса в оперативной памяти и пр.. Различия между стандартами Intel и AT&T касаются, в основном, порядка перечисления операндов и их синтаксиса при различных методах адресации.

    Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров x86, ARM, SPARC, PowerPC, M68k). Они описываются в спецификации процессоров. Возможные исключения:

    • Если ассемблер использует кроссплатформенный AT&T-синтаксис (оригинальные мнемоники приводятся к синтаксису AT&T)
    • Если изначально существовало два стандарта записи мнемоник (система команд была наследована от процессора другого производителя).

    Например, процессор Zilog Z80 наследовал систему команд Intel i8080, расширил ее и поменял мнемоники (и обозначения регистров) на свой лад. Процессоры Motorola Fireball наследовали систему команд Z80, несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel. И в данный момент половина ассемблеров для Fireball работает с интеловскими мнемониками, а половина с мнемониками Zilog.

    Директивы

    • определение данных (констант и переменных)
    • управление организацией программы в памяти и параметрами выходного файла
    • задание режима работы компилятора
    • всевозможные абстракции (то есть элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования)
    • макросы

    Пример программы

    Примеры программы Hello, world! для разных платформ и разных диалектов: Шаблон:Hider hiding

    Читайте также: