[ Ассемблер ]

Язык ассемблера — тип языка программирования низкого уровня.

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

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

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


Связывание ассемблерного кода с другими языками

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

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

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


Синтаксис

Единого стандарта для синтаксиса языков ассемблера не существует, конкретный разработчик волен установить свои 
собственные синтаксические правила. Однако существуют традиционные подходы, которых придерживаются языки ассемблера 
для наиболее распространённых процессорных архитектур, своего рода стандарт de facto. Так основными стандартами 
являются стандарты — Intel и AT&T.

Каждая инструкция записывается в отдельной строке, которая на языке ассемблера обычно имеет следующий вид:

label: code ;comment


Причём в строке может отсутствовать любой из компонентов.

Элемент ';comment' в приведенном примере является комментарием разработчика. Компиляторы (ассемблеры) игнорируют все 
символы после точки с запятой до конца строки.

В примере code — непосредственно мнемоника инструкции процессору. У инструкции так же могут быть префиксы и разделенные 
запятыми операнды, в качестве которых могут выступать константы, названия регистров или адреса в оперативной памяти.

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

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

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

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

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

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

Для упрощения и ускорения написания программ на языке ассемблера служат макросы.


Достоинства языка ассемблера


    * Максимально оптимальное использование средств процессора, использование меньшего количества команд и обращений в 
	память, и как следствие — большая скорость и меньший размер программы
    * Использование расширенных наборов инструкций процессора (MMX, SSE, SSE2, SSE3)
    * Доступ к портам ввода-вывода и особым регистрам процессора (в большинстве ОС эта возможность доступна только на 
	уровне модулей ядра и драйверов)
    * Возможность использования самомодифицирующегося (в том числе перемещаемого) кода (под многими платформами эта 
	возможность недоступна, так как запись в страницы кода запрещена, в том числе и аппаратно, однако в большинстве 
	общедоступных систем из-за их врожденных недостатков имеется возможность исполнения кода содержащегося в сегменте 
	(секции) данных, куда запись разрешена)
    * Максимальная «подгонка» для нужной платформы


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

Технология W^X используется в OpenBSD (где и появилась), в других BSD-системах, в Linux; в Microsoft Windows (начиная 
с Windows XP SP2) используется схожая технология DEP.


Недостатки


    * Большие объемы кода, большое число дополнительных мелких задач, меньшее количество доступных для использования 
	библиотек, по сравнению с языками высокого уровня
    * Трудоёмкость чтения и поиска ошибок (хотя здесь многое зависит от комментариев и стиля программирования)
    * Зачастую компилятор языка высокого уровня, благодаря современным алгоритмам оптимизации, даёт более эффективную 
	программу (по соотношению качество/время разработки).
    * Непереносимость на другие платформы (кроме совместимых).
    * Ассемблер более сложен для совместных проектов.


Пример программы на языке ассемблера

Пример программы для операционной системы DOS на процессоре семейства Intel x86, выдающей на экран приветствие 
(написан на TASM):

mov bx,1               ; указание направления вывода (на экран)
mov cx,13              ; указание количества символов строки
mov dx,offset msg      ; поместить в регистр DX смещение строки
mov ah,40h             ; выбор функции вывода строки
int 21h                ; вызов прерывания DOS "Набор процедур" для вывода строки
int 20h                ; вызов прерывания DOS (завершение программы)  
 
msg DB 'Hello, World!$'


msg — метка (идентификатор), упрощающая доступ к данным.


Ассемблеры для x86

Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM), MASM32, FASM (http://flatassembler.net), NASM, Unix 
Assembler (AS) и GNU Assembler (GAS) (Unix-подобные системы)


Происхождение и критика термина «язык ассемблера»

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

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

Использование термина «язык ассемблера» также может вызвать ошибочное мнение о существовании единого языка низкого 
уровня, или хотя бы стандарта на такие языки. При именовании языка, на котором написана конкретная программа, желательно 
уточнять, для какой архитектуры она предназначена и на каком диалекте языка написана.


(c) funker777