ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Язык Ассемблера. Начальные сведения

Идентификаторы, переменные, метки, имена, ключевые слова

Посредством идентификаторов представляются следующие объекты программы: переменные, метки, имена.

Переменные идентифицируют хранящиеся в памяти данные. Все переменные имеют три атрибута:

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

2) смещение, являющееся смещением данного поля памяти относительно начала сегмента;

3) тип, определяющий число байтов, подвергающихся манипуляциям при работе с переменной.

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

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

Некоторые идентификаторы, называемые ключевыми словами, имеют фиксированный смысл и должны употребляться только в соответствии с этим. Ключевыми словами являются: директивы Ассемблера; инструкции процессора; имена регистров ; операторы выражений.

4.2. Типы данных*

Целые числа имеют следующий синтаксис (xxxx – цифры):

 

[[+|-]]xxxx [[+|-]]xxxxB [[+|-]]xxxxQ [[+|-]]xxxxO

[[+|-]]xxxxD [[+|-]]xxxxH

 

Символьные и строковые константы имеют следующий синтаксис:

 

'символы'

"символы"

 

Предложения

Программа на языке Ассемблера – это последовательность предложений, каждое из которых записывается в отдельной строке:

 

<Предложение>

<Предложение>

...

<Предложение>

 

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

Все предложения языка Ассемблера делятся на директивы Ассемблера и инструкции (команды) процессора.

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

Инструкции процессора представляют собой мнемоническую форму записи машинных команд, непосредственно выполняемых микропроцессором. Все инструкции в соответствии с выполняемыми ими функциями делятся на 5 групп:

1) инструкции пересылки данных;

2) арифметические, логические и операции сдвига;

3) операции со строками;

4) инструкции передачи управления;

5) инструкции управления процессором.

Выражения

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

Арифметические операторы

выражение_1 * выражение_2

выражение_1 / выражение_2

выражение_1 MOD выражение_2

выражение_1 + выражение_2

выражение_1 – выражение_2

+ выражение

– выражение

Операторы сдвига

выражение SHR счетчик

выражение SHL счетчик

 

Операторы отношений

 

выражение_1 EQ выражение_2

выражение_1 NE выражение_2

выражение_1 LT выражение_2

выражение_1 LE выражение_2

выражение_1 GT выражение_2

выражение_1 GE выражение_2

 

Мнемонические коды отношений расшифровываются следующим образом: EQ – равно, NE – не равно, LT – меньше, LE – меньше или равно, GT – больше, GE – больше или равно.

Операции с битами

 

NOT выражение

выражение_1 AND выражение-2

выражение_1 OR выражение-2

выражение_1 XOR выражение-2

 

Оператор индекса

 

Оператор индекса [] складывает указанные выражения подобно тому, как это делает оператор +, с той разницей, что первое выражение необязательно, при его отсутствии предполагается 0 (двойные квадратные скобки указывают на то, что операнд не обязателен).

Оператор PTR

тип PTR выражение

 

Оператор PTR обычно используется для точного определения размера, или расстояния, ссылки. Если PTR не используется, Ассемблер подразумевает умалчиваемый тип ссылки. Кроме того, оператор PTR используется для организации доступа к объекту, который при другом способе вызвал бы генерацию сообщения об ошибке (например, для доступа к старшему байту переменной размера Word).

Операторы HIGH и LOW

Операторы HIGH и LOW вычисляют соответственно старшие и младшие 8 битов значения выражения. Выражение может иметь любое значение.

Оператор SEG

SEG выражение

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

Оператор OFFSET

OFFSET выражение

 

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

Оператор SIZE

SIZE переменная

Оператор SIZE определяет число байтов памяти, выделенных переменной.

Приоритеты операций

При вычислении значения выражения операции выполняются в соответствии со следующим списком приоритетов (в порядке убывания)*:

1) LENGTH, SIZE, WIDTH, MASK, (), [], <>

2) Оператор имени поля структуры (.)

3) Оператор переключения сегмента (:)

4) PTR, OFFSET, SEG, TYPE, THIS

5) HIGH, LOW

6) Унарные + и –

7) *, /, MOD, SHR, SHL

8) Бинарные + и –

9) EQ, NE, LT, LE, GT, GE

10) NOT

11) AND

12) OR, XOR

13) SHORT, .TYPE

Ссылки вперед

Хотя Ассемблер и допускает ссылки вперед (то есть к еще необъявленным объектам программы), такие ссылки могут при неправильном использовании приводить к ошибкам. Пример ссылки вперед:

 

JMP MET

...

MET: ...

 

В приведенном выше примере предполагается, что MET – метка типа NEAR и для ее адресации используется регистр CS, в результате чего генерируется инструкция JMP, занимающая 3 байта.

Рекомендуется придерживаться следующих правил:

1) если ссылка вперед является переменной, вычисляемой относительно регистров ES, SS или CS, следует использовать оператор переключения сегмента, если он не использован, делается попытка вычисления адреса относительно регистра DS;

2) если ссылка вперед является меткой инструкции в команде JMP и отстоит не далее, чем на 128 байтов, можно использовать оператор SHORT, если этого не делать, метке будет присвоен тип FAR, что не вызовет ошибки, но на 2-м проходе Ассемблер для сокращения размера содержащей ссылку инструкции вынужден будет вставить дополнительную и ненужную инструкцию NOP;

3) если ссылка вперед является меткой инструкции в командах CALL или JMP, следует использовать оператор PTR для определения типа метки, иначе Ассемблер устанавливает тип NEAR, и, если в действительности тип метки окажется FAR, будет выдано сообщение об ошибке.

4.7. Директивы определения данных

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

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

- скалярные данные, представляющие собой единичное значение или набор единичных значений;

- записи, позволяющие манипулировать с данными на уровне бит;

- структуры, отражающие некоторую логическую структуру данных.

Скалярные данные

Директивы определения скалярных данных приведены в таблице

 

Формат Функция
[[имя]] DB значение,... определение байтов
[[имя]] DW значение,... определение слов
[[имя]] DD значение,... определение двойных слов
[[имя]] DQ значение,... определение квадрослов
[[имя]] DT значение,... определение 10 байтов

 

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

 

счетчик DUP (значение,...)

 

Оператор DUP может использоваться не только при определении памяти, но и в других директивах.

Синтаксис директив DW, DD, DQ и DT идентичен синтаксису директивы DB.

Примеры директив определения скалярных данных:

 

integer1 DB 16

string1 DB 'abCDf'

empty1 DB ?

contan2 DW 4*3

string3 DD 'ab'

high4 DQ 18446744073709551615

high5 DT 1208925819614629174706175d

db6 DB 5 DUP(5 DUP(5 DUP(10)))

dw6 DW DUP(1,2,3,4,5)

Записи

Запись представляет собой набор полей бит, объединенных одним именем. Каждое поле записи имеет собственную длину, исчисляемую в битах, и не обязано занимает целое число байтов. Объявление записи в программе на языке Ассемблера включает в себя два действия:

- объявление шаблона или типа записи директивой RECORD;

- объявление собственно записи.

Формат директивы RECORD:

 

имя_записи RECORD имя_поля:длина[[=выражение]],...

 

Директива RECORD определяет вид 8- или 16-битовой записи, содержащей одно или несколько полей. Имя_записи представляет собой имя типа записи, которое будет использоваться при объявлении записи. Имя_поля и длина (в битах) описывает конкретное поле записи. Выражение, если оно указано задает начальное (умалчиваемое) значение поля. Описания полей записи в директиве RECORD, если их несколько, должны разделяться запятыми. Для одной записи может быть задано любое число полей, но их суммарная длина не должна превышать 16 бит.

Длина каждого поля задается константой в пределах от 1 до 16. Если общая длина полей превышает 8 бит, Ассемблер выделяет под запись 2 байта, в противном случае – 1 байт. Если задано выражение, оно определяет начальное значение поля. Если длина поля не меньше 7 бит, в качестве выражения может быть использован символ в коде ASCII. Выражение не должно содержать ссылок вперед. Например,

 

item RECORD char:7='Q',weight:4=2

 

Запись item будет иметь следующий вид:

 

  char weight

 

При обработке директивы RECORD формируется шаблон записи, а сами данные создаются при объявлении записи, которое имеет следующий вид

 

[[имя]] имя_записи <[[значение,...]]>

table item 10 DUP(<'A',2>)

 

Если для описания шаблона записи использовалась директива RECORD из предыдущего примера, то по этому объявлению создается 10 записей, объединенных именем table.

Структуры

Структура представляет собой набор полей байтов, объединенных одним именем. Объявление структуры, аналогично объявлению записи, включает в себя два действия: объявление шаблона или типа структуры; объявление собственно структуры.

Директивы STRUC и ENDS обозначают соответственно начало и конец описания шаблона (типа) структуры.

Пример:

table STRUC

count DB 10

value DW 10 DUP(?)

tname DB 'font'

table ENDS

 

Директива эквивалентности

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

имя EQU операнд

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти