метка команда/директива операнды ;комментарий




Причем все эти поля необязательны. Метка может быть любой комбинацией букв английского алфавита, цифр и символов _, $, @,?, но цифра не может быть первым символом метки, а символы $ и? иногда имеют специальные значения и обычно не рекомендуются к использованию. Большие и маленькие буквы по умолчанию не различаются, но различие можно включить, задав ту или иную опцию в командной строке ассемблера. Во втором поле, поле команды, может располагаться команда процессора, которая транслируется в исполняемый код, или директива, которая не приводит к появлению нового кода, а управляет работой самого ассемблера. В поле операндов располагаются требуемые командой или директивой операнды (то есть нельзя указать операнды и не указать команду или директиву). И наконец, в поле комментариев, начало которого отмечается символом; (точка с запятой), можно написать все что угодно — текст от символа «;» до конца строки не анализируется ассемблером.

Для облегчения читаемости ассемблерных текстов принято:

– метка начинается на первой позиции в строке,

– команда — на 17-й (две табуляции),

– операнды — на 25-й (три табуляции) и

– комментарии — на 41-й или 49-й. Если строка состоит только из комментария, его начинают с первой позиции.

Если метка располагается перед командой процессора, сразу после нее всегда ставится символ «:» (двоеточие), который указывает ассемблеру, что надо создать переменную с этим именем, содержащую адрес текущей команды:

some_loop: lodsw;cчитать слово из строки, (строка в буфере данных) cmp ax,7; если это 7 - выйти из цикла jne some_loop

Когда метка стоит перед директивой ассемблера, она обычно оказывается одним из операндов этой директивы и двоеточие не ставится. Рассмотрим директивы, работающие напрямую с метками и их значениями, — LABEL, EQU и =.

метка label тип

Директива LABEL определяет метку и задает ее тип. Тип может быть одним из:

– BYTE (байт),

– WORD (слово),

– DWORD (двойное слово),

– FWORD (6 байт),

– QWORD (учетверенное слово),

– TBYTE (10 байт),

– NEAR (ближняя метка),

– FAR (дальняя метка).

Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. В зависимости от типа команда

mov метка,0

запишет в память байт (слово, двойное слово и т.д.), заполненный нулями, а команда

call метка

выполнит ближний или дальний вызов подпрограммы.

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

метка equ выражение

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

truth equ 1message1 equ 'Try again$'var2 equ [si] cmp ax,truth; cmp ax,1 db message1; db 'Try again$' mov ax,var2; mov ax, [si]

Директива EQU чаще всего используется с целью введения параметров, общих для всей программы, аналогично команде #define препроцессора языка С.

метка = выражение

Директива = эквивалентна EQU, но определяемая ею метка может принимать только целочисленные значения. Кроме того, метка, указанная этой директивой, может быть переопределена.

Каждый ассемблер предлагает целый набор специальных предопределенных меток — это может быть текущая дата (@date или??date), тип процессора (@cpu) или имя того или иного сегмента программы

6.2. Директивы языка ассемблера IA-32

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

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

имя_переменной d* значение

где D* — одна из нижеприведенных псевдокоманд:

DB — определить байт;

DW — определить слово (2 байта);

DD — определить двойное слово (4 байта);

DF — определить 6 байт (адрес в формате 16-битный селектор: 32-битное смещение);

DQ — определить учетверенное слово (8 байт);

DT — определить 10 байт (80-битные типы данных, используемые FPU).

Поле значения может содержать одно или несколько чисел, строк символов (взятых в одиночные или двойные кавычки), операторов? и DUP, разделенных запятыми. Все установленные таким образом данные окажутся в выходном файле, а имя переменной будет соответствовать адресу первого из указанных значений. Например, набор директив

text_string db 'Hello world!'number dw 7table db 1,2,3,4,5,6,7,8,9,0Ah,0Bh,0Ch,0Dh,0Eh,0Fhfloat_number dd 3.5e7

заполняет данными 33 байта. Первые 12 байт содержат ASCII-коды символов строки «Hello world!», и переменная text_string указывает на первую букву в этой строке, так что команда

mov al,text_string

считает в регистр AL число 48h (код латинской буквы H). Если вместо точного значения указан знак?, переменная считается неинициализированной и ее значение на момент запуска программы может оказаться любым. Если нужно заполнить участок памяти повторяющимися данными, используется специальный оператор DUP, имеющий формат счетчик DUP (значение). Например, вот такое определение:

table_512w dw 512 dup(?)

создает массив из 512 неинициализированных слов, на первое из которых указывает переменная table_512w. В качестве аргумента в операторе DUP могут выступать несколько значений, разделенных запятыми, и даже дополнительные вложенные операторы DUP.

6.2.2. Организация программы

Представленная на рис. 5.8. программа демонстрирует принципы использования базовых элементов языка ассемблера IA-32, связанные с определением кодов опе­рации, адресацией и применением адресных меток. Для определения областей данных программы и установления соответст­вия между символическими именами и реальными физическими значениями адреса существуют специальные директивы ассемблера.

Оформление ассемблерной программы сложения нескольких чисел приведен на рис. 6.1. Ассемблерные директивы.data и.code определяют начало областей данных и кода (то есть команд) программы. Директива DD (Definition Double (Double word)) выделяет в области данных 4-байтовое двойное слово. NUM1 — это метка, назначенная адре­су первого из двойных слов, которые инициализированы значениями 17, 3, -51, 242 и -113. Адресам следующих двух двойных слов, инициализированных значе­ниями 5 и 0, назначены метки N и SUM.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: