Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
flor_apparato-orientirovnnoe_prog.doc
Скачиваний:
89
Добавлен:
15.06.2014
Размер:
926.72 Кб
Скачать

2. Простейшие средства ассемблера

2.1. Средства описания данных

Средства ассемблера для описания данных аналогичны по назначению описаниям переменных в языках высокого уровня. В обоих случаях эти описания вводят именованные обозначения переменных. В простейшем случае, непосредственно отвечающем машинной архитектуре, такие описания на ассемблере только выделяют место в памяти заданного в описании размера и, может быть, заполняют это место в памяти содержимым. Последний вариант соответствует описаниям переменных с инициализацией в языках высокого уровня (например, int x=1; в языке Си).

В рассматриваемых ассемблерах для описания именованного места в памяти, аналогичного переменной языка высокого уровня, служат директивы, задаваемые ключевыми словами DB, DW, DD и DQ. Ключевые слова допускается записывать как строчными, так и прописными буквами. Наименование директив происходит от первых букв фраз Define Byte, Define Word, Define Double word, Define Quadra word. Обычное использование этих директив имеет вид

Имя_области_данных D описание_содержимого_данных

где символом  условно обозначен один из символов B, W, D и Q. Простейшее использование этих директив описания данных содержит описание лишь одного элемента указанного в ключевом слове размера, так что в этом случае директива DB выделяет для данных 1 байт, директива DW - выделяет 2 байта, директива DD - 4 байта, а директива DQ - 8 байтов.

Более сложная форма таких директив заключается в перечислении через разделительную запятую нескольких элементов описания содержимого. Например, описание

perv dw 4, 7, 11, 29

задает для дальнейшего использования именованную область данных с именем perv, элементы этого описания состоят из слов (пар байтов), причем в первом из них с самого начала выполнения программы записано число 4, во втором - число 7, в третьем число 11, а в четвертом - число 29.

Заметим, что ассемблер NASM различает строчные и прописные буквы в именах, вводимых программистом подобно языку Си (и в отличие от языка Паскаль, где такого различия не делается). Обозначения же директив можно в нем задавать как строчными, так и прописными буквами. Такое решение очень тесно сближает этот ассемблер с системным языком Си. Ассемблеры же MASM и TASM в режиме по умолчанию позволяют не различать строчные и прописные буквы, хотя такая особенность потребовалась для внешних имен при программировании для MS Windows. Поэтому она задается изменением режима работы компилятора этих ассемблеров путем использования при их вызове опции /mx или /ml. Первая из опций задает режим различения строчных и прописных букв для внешних имен, а вторая - для всех имен, использованных в обрабатываемой программе.

При задании содержимого именованных областей памяти предоставляется возможность широкого использования различных систем счисления в записи числовых констант. Десятичные константы записываются обычным путем как последовательности десятичных цифр, которым может предшествовать знак минуса. Шестнадцатеричные константы записываются последовательностями шестнадцатеричных цифр, причем в NASM для явного указания, что это шестнадцатеричная форма записи либо перед нею ставится идентифицирующий префикс, либо за нею ставится идентифицирующий суффикс. В качестве таких префиксов можно использовать пару символов 0x (как в языке Си) или служебный символ $, а в качестве указанного суффикса - H (латинский символ - строчный или прописной). При использовании двух последних вариантов в качестве первой цифры шестнадцатеричной константы следует использовать дополнительную цифру 0, когда старшая значащая цифра этой константы отлична от десятичной цифры (при начале записи с буквенного символа транслятор может не разобраться, что записано числовое значение, а не недоопределенное имя). (Ассемблеры MASM и TASM допускают только суффиксную форму записи числовых констант, отличных от десятичных.) Директива DQ в NASM предполагает использование только с инициализацией числовыми значениями с плавающей точкой.

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

Далее приведены примеры определения именованных данных в NASM

db 0x55 ; байт содержит шестнадцатеричное число 0x55

db 0x55,0x56,0x57; три байта, занятые константами

db 'a',0x55 ; первый байт заполняется символом a, второй числом 0x55

db 'hello',13,10,'$' ; восемь байтов, в первых пяти из которых текст 'hellow'

dw 0x1234 ; в младшем байте константа 0x34, в старшем константа 0x12

dw 'a' ; пара байтов, в младшем код буквы a, в старшем 0

dw 'ab' ; символы, размещенные в паре байтов

dw 'abc' ; два слова: в младшем коды 0x41 0x42, в старшем - 0x43 0x00

dd 0x12345678 ; последовательные байты значений 0x78 0x56 0x34 0x12

Предоставляемые ассемблером NASM возможности настолько широки, что мы предпочтем использовать при задании констант только тот вариант, который полностью совместим с другими, только что упомянутыми ассемблерами. Именно, в дальнейшем текущем изложении будет использоваться исключительно запись с идентифицирующими суффиксами H, Q и B.

Кроме описания инициализированных данных (задаваемых директивами DB, DW, DD, DQ) совершенно необходимо иметь аналогичные средства для описания неинициализированных данных (аналогов неинициализированных переменных из языков высокого уровня). В NASM для этих целей служат директивы, задаваемые ключевыми словами RESB, RESW, RESD и RESQ (начальная часть их наименований происходит от английского слова RESERVE). Использование этих директив имеет общий вид

имя_резервируемой_области RES число_байтов_в_области

где символ  условно обозначает один из символов B, W, D или Q. Далее приведены примеры таких неинициализированных описаний

buffer resb 64 ; резервируется 64 байта

wordvar resw 1 ; резервируется одно слово

Для дальнейшего важно ясно себе представлять, что имя данных в ассемблере NASM обозначает не собственно область данных, в которой сколько-то байтов, а всего лишь отметку в памяти начала размещения этих байтов. Такая содержательная связь однозначно отражает особенность обозначений областей памяти на внутреннем машинном языке, которым являются двоичные коды команд: в полях машинных командах, обозначающих операнды, может быть обозначено только начало областей данных, но никоим образом не размер этих областей. Такое техническое решение связано со стремлением избегать, где только это возможно, избыточности. Размер операндов команды задается в составе кода операции команды или отдельным полем команды, которое является общим для всех операндов команды. Подобное решение обусловлено весьма практическим решением выполнять с помощью большинства команд операции только над двоичными кодами одинаковой длины.

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

имя_области_данных TIMES число описание_директивы

С формальной стороны она представляет собой префикс, который вызывает повторения описания следующей за ней директивы столько раз, сколько задает параметр число. Примером использования этой конструкции может быть

buffer times 64 db 0

которая задает повторение описания байта с содержимым 0 шестьдесят четыре раза. Тем самым описывается буфер размеров в 64 байта, первоначально заполняемый нулями.

В ассемблерах MASM и TASM для повторения используется другая, менее естественная конструкция, которая задается служебным словом DUP, причем повторяемая с помощью нее часть описания должна помещаться за служебным словом обязательно в круглых скобках, а число повторений записано перед этим служебным словом через пробел или пробелы. Таким образом, в упомянутых ассемблерах приведенное выше описание буфера запишется в виде

buffera db 64 dup(0)

В качестве средства резервирования в MASM и TASM (вместо RESx ) используется специальный метасимвол ? (вопросительный знак), который предназначается для задания вместо конкретного инициализирующего значения. Так в указанных ассемблерах резервировании памяти для областей buffer и wordvar соответствующие описания задаются как

buffer DB 64 DUP(?) ; резервируется 64 байта

wordvar DW ? ; резервируется одно слово

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

имя_константы EQU выражение

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

N EQU 128

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

buffer times N db 0

abc dw N

Последние директивы описывают (на основе предварительного задания N) именованную область из 128 нулевых байтов и обозначенную именем abc область данных размером в одно слово, проинициализированную числом 128.

Соседние файлы в предмете Системное программное обеспечение