FreelanceHunt.com > удаленная работа и фриланс проекты в сфере IT  

FreelanceHunt.com » Категории » Что такое Assembly?

Язык ассемблера — тип языка программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком. Часто для краткости его называют «Ассемблер».

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


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

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

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

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


Во многом повторяют таковые для низкоуровневых языков вообще:
  • 15px Минимальное количество избыточного кода (использование меньшего количества команд и обращений в память). Как следствие — бо?льшая скорость и меньший размер программы
  • 15px Большие объемы кода, большое число дополнительных мелких задач =>
    • плохая читабельность кода => трудность поддержки (отладка, добавление возможностей)
    • трудность реализации парадигм программирования и любых других сколь-нибудь сложных конвенций => сложность совместной разработки
  • 15px Меньшее количество доступных библиотек, их малая совместимость

Но есть и особые, происходящие из «машинной сущности» ассемблера:

  • 15px Специальные возможности:
  • 15px Максимальная «подгонка» для нужной платформы (использование специальных инструкций, технических особенностей «железа»)
  • 15px Непереносимость на другие платформы (кроме двоично совместимых).

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

Применение


Напрямую вытекает из достоинств и недостатков.

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

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

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


Поскольку на ассемблере чаще всего пишут лишь фрагменты программы, их необходимо связывать с остальными частями на других языках.
Это достигается 2 основными способами:
  • На этапе компиляции — вставка в программу ассемблерных фрагментов ({{lang-en|inline assembler}}) специальными директивами языка, в т.ч. написание процедур на языке ассемблера. Способ хороший для несложных преобразований данных, но полноценного ассемблерного кода — с данными и подпрограммами, включая подпрограммы с множеством входов и выходов, не поддерживаемых высокоуровневыми языками, с помощью него сделать нельзя.
  • На этапе компоновкираздельная компиляция. Для взаимодействия скомпонованных модулей достаточно, чтобы "связующие" функцииопределенные в одних модулях и использующиеся в других поддерживали нужные соглашения о вызовах ({{lang-en|calling conventions}}) и типы данных. Написаны же отдельные модули могут быть на любых языках, в том числе и на ассемблере.

Синтаксис


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

Инструкции


Общий формат записи инструкций одинаков для обоих стандартов:
[метка:] опкод [операнды] [;комментарий]

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

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

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

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

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

Директивы


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

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


Пример программы Hello world для MS-DOS для архитертуры x86 на диалекте TASM:

.MODEL TINY
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 100h
START:
mov ah,9
mov dx,OFFSET Msg
int 21h
int 20h
Msg DB 'Hello World',13,10,'$'
CODE ENDS
END START

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


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

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

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

См. также


Ссылки


  • WASM.ru — крупнейший русскоязычный портал, посвящённый информационной безопасности и программированию на языках ассемблера

Литература


  • {{книга

|автор = Галисеев Геннадий Владимирович
|заглавие = Ассемблер для Win 32. Самоучитель
|ссылка =
|место = М.
|издательство = «Диалектика»
|год = 2007
|страницы = 368
|isbn = 978-5-8459-1197-1
}}

  • {{книга

|автор = Кип Ирвин
|часть =
|заглавие = Язык ассемблера для процессоров Intel
|оригинал = Assembly Language for Intel-Based Computers
|ссылка =
|издание =
|место = М.
|издательство = «Вильямс»
|год = 2005
|страницы = 912
|isbn = 0-13-091013-9
}}

{{Ассемблеры}}
{{Языки программирования}}

Категория:Языки программирования
*

ar:??? ???????
bg:Асемблер
bs:Assembler
ca:Llenguatge assemblador
cs:Assembler
da:Assemblersprog
Assemblersprache
el:Assembly (?????? ???????????????)
Assembly language
eo:Asembla lingvo
es:Lenguaje ensamblador
et:Assemblerkeel
fi:Assembly (ohjelmointikieli)
Assembleur
he:??? ??
hr:Asemblerski jezik
hu:Assembly
is:Smalam?l
it:Assembly
ja:???????
ko:?????
lt:Asemblerio kalba
lv:Asamblervaloda
no:Assembler
pt:Linguagem de montagem
si:????????? ?????
sl:Zbirni jezik
sq:Assembly
sr:Асемблер
th:?????????????
tr:?evirici diller
zh:????