Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

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



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

 

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

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

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

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

(Использование комментариев в программе улучшает ее

ясность, oсобенно там, где назначение набора команд

непонятно. Комментаpий всегда начинаются на любой строке

исходного модуля с символа точка с запятой (;) и ассемблер

полагает в этом случае, что все символы, находящиеся справа

от ; являются комментарием. Комментарий может содержать

любые печатные символы, включая пробел.

Комментарий может занимать всю строку или следовать за

командой на той же строке, Основной формат кодирования команд ассемблера имеет

следующий вид:

 

[метка] команда [операнд(ы)]

 

Метка (если имеется), команда и операнд (если имеется)

pазделяются по крайней мере одним пробелом или символом

табуляции. Максимальная длина строки - 132 символа. Первым символом в метке должна быть буква или спецсимвол.

Ассемблер не делает различия между заглавными и строчными

буквами. Максимальная длина метки - 31 символ. Примеры

меток: COUNT, PAGE25, $E10. Рекомендуется использовать

описательные и смысловые метки. Имена регистров, например,

AX, DI или AL являются зарезервированными и используются

только для указания соответствующих регистров.)

Директивы

Ассемблер имеет ряд операторов, которые позволяют упpавлять процессом

ассемблирования и формирования листинга. Эти операторы называются

псевдокомандами или директивами. Они действуют только в процессе

ассемблирования программы и не генерируют машинных кодов. Большинство

директив показаны в следующих разделах. В гл.24 подробно описаны все

директивы ассемблера и приведено более чем достаточно соответствующей

информации. Гл.24 можно использовать в качестве справочника.

 

 

Директивы управления листингом: PAGE и TITLE

----------------------------------------------

Ассемблер содержит ряд директив, управляющих форматом печати (или

листинга). Обе директивы PAGE и TITLE можно использовать в любой

программе.

 

 

Д и р е к т и в а PAGE. В начале программы можно указать количество

строк, распечатываемых на одной странице, и максимальное количество

символов на одной строке. Для этой цели cлужит директива PAGE. Следующей

директивой устанавливается 60 строк на страницу и 132 символа в строке:

 

PAGE 60,132

 

Количество строк на странице может быть в пределах от 10 до 255, а

символов в строке - от 60 до 132. По умолчанию в ассемблере установлено

PAGE 66,80.

Предположим, что счетчик строк установлен на 60. В этом случае

ассемблер, распечатав 60 строк, выполняет прогон листа на начало следующей

страницы и увеличивает номер страницы на eдиницу. Кроме того можно

заставить ассемблер сделать прогон листа на конкретной строке, например, в

конце сегмента. Для этого необходимо записать директиву PAGE без

операндов. Ассемблер автоматически делает прогон листа при обработке

диpективы PAGE.

 

 

Д и р е к т и в а TITLE. Для того, чтобы вверху каждой страницы

листинга печатался заголовок (титул) программы, используется диpектива

TITLE в следующем формате:

 

TITLE текст

 

Рекомендуется в качестве текста использовать имя программы, под

которым она находится в каталоге на диске. Например, если программа

называется ASMSORT, то можно использовать это имя и описательный

комментарий общей длиной до 60 символов:

 

TITLE ASMSORT - Ассемблерная программа сортировки имен

 

В ассемблере также имеется директива подзаголовка SUBTTL, которая

может оказаться полезной для очень больших программ, содержащих много

подпрограмм.

 

 

Директива SEGMENT

-------------------

Любые ассемблерные программы содержат по крайней мере один сегмент -

сегмент кода. В некоторых программах используется сегмент для стековой

памяти и сегмент данных для определения данных. Асcемблерная директива для

описания сегмента SEGMENT имеет следующий формат:

 

Имя Директива Операнд

имя SEGMENT [параметры]

.

.

.

имя ENDS

 

Имя сегмента должно обязательно присутствовать, быть уникальным и

соответствовать соглашениям для имен в ассемблере. Директива ENDS

обозначает конец сегмента. Обе директивы SEGMENT и ENDS должны иметь

одинаковые имена. Директива SEGMENT может содержать три типа параметров,

определяющих выравнивание, объединение и класс.

 

1. В ы р а в н и в а н и е. Данный параметр определяет границу

начала сегмента. Обычным значением является PARA, по которому сегмент

устанавливается на границу параграфа. В этом случае начальный адрес

делится на 16 без остатка, т.е. имеет шест. адрес nnn0. В случае

отсутствия этого операнда ассемблер принимает по умолчанию PARA.

2. О б ъ е д и н е н и е. Этот элемент определяет объединяется

ли данный сегмент с другими сегментами в процессе компановки после

ассемблирования (пояснения см. в следующем разделе "Компановка

программы"). Возможны следующие типы объединений: STACK, COMMON,

PUBLIC, AT выражение и MEMORY. Сегмент стека определяется следующим

образом:

имя SEGMENT PARA STACK

 

Когда отдельно ассемблированные программы должны объединяться

компановщиком, то можно использовать типы: PUBLIC, COMMON и MEMORY. В

случае, если программа не должна объединяться с другими программами,

то данная опция может быть опущена.

3. К л а с с. Данный элемент, заключенный в апострофы,

используется для группирования относительных сегментов при

компановке:

 

имя SEGMENT PARA STACK 'Stack'

 

Фрагмент программы на рис.3.1. в следующем разделе иллюстрирует

директиву SEGMENT и ее различные опции.

 

 

Директива PROC

----------------

Сегмент кода содержит выполняемые команды программы. Кроме того этот

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

директивой PROC. Сегмент, содержащий только одну процедуру имеет следующий

вид:

имя-сегмента SEGMENT PARA

имя-процедуры PROC FAR Сегмент

. кода

. с

. одной

RET процедурой

имя-процедуры ENDP

имя-сегмента ENDS

 

Имя процедуры должно обязательно присутствовать, быть уникальным и

удовлетворять соглашениям по именам в ассемблере. Операнд FAR указывает

загрузчику DOS, что начало данной процедуры является точкой входа для

выполнения программы.

Директива ENDP определяет конец процедуры и имеет имя, аналогичное

имени в директиве PROC. Команда RET завершает выполнение программы и в

данном случае возвращает управление в DOS.

Сегмент может содержать несколько процедур (см. гл.7).

 

 

Директива ASSUME

------------------

Процессор использует регистр SS для адресации стека, регистр DS для

адресации сегмента данных и регистр CS для адресации cегмента кода.

Ассемблеру необходимо сообщить назначение каждого сегмента. Для этой цели

служит директива ASSUME, кодируемая в сегменте кода следующим образом:

 

Директива Операнд

ASSUME SS:имя_стека,DS:имя_с_данных,CS:имя_с_кода

 

Например, SS:имя_стека указывает, что ассемблер должен ассоциировать

имя сегмента стека с регистром SS. Операнды могут записываться в любой

последовательности. Регистр ES также может присутствовать в числе

операндов. Если программа не использует регистр ES, то его можно опустить

или указать ES:NOTHING.

 

 

Директива END

---------------

Как уже показано, директива ENDS завершает сегмент, а директива ENDP

завершает процедуру. Директива END в свою очередь полностью завершает всю

программу:

 

Директива Операнд

END [имя_процедуры]

 

Операнд может быть опущен, если программа не предназначена для

выполнения, например, если ассемблируются только определения данных, или

эта программа должна быть скомпанована с другим (главным) модулем. Для

обычной программы с одним модулем oперанд содержит имя, указанное в

директиве PROC, которое было oбозначено как FAR.

 

 




©2015 studopedya.ru Все права принадлежат авторам размещенных материалов.