Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Ассемблеру.docx
Скачиваний:
12
Добавлен:
09.11.2018
Размер:
125.1 Кб
Скачать
    1. Синтаксис ассемблерных команд

Здесь и далее ассемблерными командами называются команды на языке встроенного ассемблера, вставляемые в тело ассемблерного оператора asm... end. Структура ассемблерной команды такова:

[Метка] [Префикс] [Код [Операнд [,Операнд]]]

В квадратных скобках указываются необязательные элементы структуры.

Метки

Любой команде ассемблерного оператора может предшествовать одна или сколько меток. В ассемблере используется два типа меток: глобальные и локальные. Глобальные метки - это обычные метки Турбо Паскаля. Они объявляются в разделе описаний после зарезервированного слова Label. С помощью глобальной метки мо передать управление в тело ассемблерного оператора оператором GOTO. Например:

Label

AltEnt;

Begin

.....

Goto AltEnd;

. . . . .

asm

. . . .

AltEnd:

……

end;

{Передаем управление внутрь ассемблерного опера тора}

{Сюда можно передать управление извне}

Локальные метки объявляются непосредственно в теле ассемблерного оператора. Эти метки обязаны начинаться символом «@». Поскольку этот символ нельзя использовать в именах Турбо Паскаля, он позволяет отличить локальную метку от глобальной. Локальная метка не известна нигде вне ассемблерного оператора, поэтому на нее нельзя передать управление оператором GOTO. По этой же причине в разных ассемблерных операторах можно использовать одноименные локальные метки.

Коды инструкций

Встроенный ассемблер поддерживает мнемонику всех команд, перечисленных выше. Кроме того, в ассемблерных командах может использоваться мнемоника конструкций процессора 8087, а также команды процессоров 80286/80287. Инструкции 8087 допустимы только при активном состоянии {$N+}, 80286 - при {$G+}; а 80287 - в случае {$G+,N+}.

Операнды

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

Константы

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

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

'Строковая константа'

"Это - тоже строковая константа"

'Символ '' не считается ограничителем'

'внутри строки, обрамленной кавычками "..."'

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

- 2 147 483 648 ... +4 294 967 295.

По умолчанию при записи числовых констант используется десятичная нотация, но ассемблер поддерживает также двоичные, восьмеричные и шестнадцатеричные константы. Двоичная константа составляется как комбинация единиц и нулей, заканчивающаяся символом В (от Binary - двоичный); при записи восьмеричной константы используются символы 0...7, а в ее конце ставится символ О (Octal - восьмеричный); шестнадцатеричная константа записывается по правилам Турбо Паскаля (начинается с символа #) либо по правилам Турбо Ассемблера: начинается с цифры, в конце ставится символ H (от Hexadecimal - шестнадцатеричный).

Имена

Локальные метки - это единственные имена, которые разрешается определять внутри ассемблерного оператора. Имена остальных объектов программы – констант, переменных, подпрограмм - должны определяться только с помощью средств Турбо Паскаля.

Область определения имен подчиняется тем же правилам, что и в Турбо Паскале - имена должны быть «видны» в том месте, где они используются, и они локализуются в пределах блока, в котором описаны.

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

@@Code - текущий сегмент кода

@Data - начальный сегмент данных

@Result - ссылка внутри функции на ее результат

Имена @Code и @Data могут использоваться только в сочетании с директивой SEG для ссылки на нужный сегмент. Например:

asm

mov ax, SEG @Data

mov ds,ax

end;

Имя ©Result используется для присвоения результата функции. Например:

Function Min(X,У: Integer): Integer; {Эта функция сравнивает два целых числа и возвращает наименьшее из них}

begin

asm

{Помещаем X в АХ}

{X<Y ?}

{Да - на выход}

{Нет - помещаем У в АХ}

{АХ содержит результат}

mov ax,X

cmp ax,Y

jl @

mov ах,У

@: mov @Result,ax

end

end;