![]() |
Поиск
Последние проекты
2. Продвижение сайта
3. веб сайт
4. Доработка конфигурации 1с
5. Разработка небольшой И...
6. Веб дизайн магазина
7. Раскрутка сайта
8. Разработать информацио...
9. Альт Проект
10. Программирование и соп...
Последние вакансии
FreelanceHunt.com » Категории » Что такое Assembly?
Язык ассемблера — тип языка программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком. Часто для краткости его называют «Ассемблер».
Содержание языка
Команды языка ассемблера один в один соответствуют командам процессора и, фактически, представляют собой удобную символьную форму записи (мнемокод) команд и их аргументов. Также язык ассемблера обеспечивает базовые программные абстракции: связывание частей программы и данныx через метки с символьными именами (при ассемблированиипереводе команд из мнемонической записи в двоичный вид, понятный процессору для каждой метки высчитывается адрес, после чего каждое вхождение метки заменяется на этот адрес) и директивыкоманды, не переводящиеся в процессорные инструкции, а выполняемые компилятором при ассемблировании.
Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла); повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, отличный от адреса расположения в памяти{{уточнить}}; менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др.
Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера.
Достоинства и недостатки
Во многом повторяют таковые для низкоуровневых языков вообще:
Минимальное количество избыточного кода (использование меньшего количества команд и обращений в память). Как следствие — бо?льшая скорость и меньший размер программы
Большие объемы кода, большое число дополнительных мелких задач =>
- плохая читабельность кода => трудность поддержки (отладка, добавление возможностей)
- трудность реализации парадигм программирования и любых других сколь-нибудь сложных конвенций => сложность совместной разработки
Меньшее количество доступных библиотек, их малая совместимость
Но есть и особые, происходящие из «машинной сущности» ассемблера:
Специальные возможности:
- Непосредственный доступ к аппаратуре: портам ввода-вывода, особым регистрам процессора
- Возможность написания самомодифицирующегося кода (т.е. метапрограммирования, причем без необходимости программного интерпретатора)
Максимальная «подгонка» для нужной платформы (использование специальных инструкций, технических особенностей «железа»)
Непереносимость на другие платформы (кроме двоично совместимых).
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}} — сборщик). Название последнего обусловлено тем, что на первых компьютерах не существовало языков более высокого уровня, и единственной альтернативой созданию программ с помощью ассемблера было программирование непосредственно в кодах.
Язык ассемблера в русском языке часто называют «ассемблером» (а что-то связанное с ним — «ассемблерный»), что, согласно английскому переводу слова, неправильно, но вписывается в правила русского языка. Однако, сам ассемблер (программу) тоже называют просто «ассемблером», а не «компилятором языка ассемблера» и т. п.
Использование термина «язык ассемблера» также может вызвать ошибочное мнение о существовании единого языка низкого уровня, или хотя бы стандарта на такие языки. При именовании языка, на котором написана конкретная программа, желательно уточнять, для какой архитектуры она предназначена и на каком диалекте языка написана.
См. также
- KolibriOS — операционная система , полностью написанная на языке ассемблера fasm
- Методы адресации
Ссылки
- 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:????

