| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
PROG ENDS
end start
Турбо Ассемблер 3.0/tasm/#1-2 = 172 =
Директивы EVEN и EVENDATA
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Вы можете использовать директиву EVEN для округления счетчи-
ка адреса до следующего четного адреса. Директива EVEN позволяет
вам выравнивать код для эффективного доступа к процессорам, ис-
пользующим 16-разрядную шину данных. Производительность процессо-
ров, использующих 8-разрядную шину данных, директивой EVEN не
улучшается.
Директива EVENDATA выполняет выравнивание на четную границу,
изменяя счетчика адреса без генерации данных, что полезно исполь-
зовать для неинициализированных сегментов. Директивы EVEN и
EVENDATA приводят к тому, что если выравнивание текущего сегмента
выполнено недостаточно строго, Турбо Ассемблер выводит предупреж-
дающее сообщение.
Если когда встречается директива EVEN счетчик адреса имеет
нечетное значение, то Турбо Ассемблер помещает в сегмент один
байт или инструкцию NOP, чтобы счетчик адреса стал четным. С по-
мощью заполнения инструкциями NOP директиву EVEN можно в сегмен-
тах кода, не вызывая на этапе работы программы выполнения невер-
ных инструкций. Если счетчик адреса уже имеет четное значение, то
данная директива не действует.
Аналогично, если счетчик адреса имеет нечетное значение,
когда встречается директива EVENDATA, Турбо Ассемблер генерирует
неинициализированный байт.
Приведем следующий пример использования директивы EVEN:
EVEN
@@A: lodsb
xor bl,al ; выравнивание для эффективного доступа
loop @@a
Приведем пример использования директивы EVENDATA:
EVENDATA
VAR1 DW 0 ; выравнивание для эффективного
; доступа 8086
Турбо Ассемблер 3.0/tasm/#1-2 = 173 =
Директива ALIGN
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для выравнивания счетчика адреса на адрес, значение которо-
го равно степени 2, можно использовать директиву ALIGN. Директива
ALIGN имеет следующий синтаксис:
ALIGN граница
где "граница" должна быть степенью 2.
Если счетчик адреса еще не соответствует смещению, которое
представляет собой произведение "границы", Турбо Ассемблер, чтобы
присвоить счетчика адреса нужный адрес, вставляет в сегмент инс-
трукции NOP (нет операции).
Вы не можете выполнить надежное выравнивание на границу, яв-
ляющееся более строгим, чем выравнивание сегмента, в котором
встречается директива ALIGN. Выравнивание сегмента задается, ког-
да сегмент в первый раз начинается по директива SEGMENT.
Например, если вы определили сегмент следующим образом:
CODE SEGMENT PARA PUBLIC
затем вы можете задать ALIGN 16 (что эквивалентно PARA), но не
ALIGN 32, как как это более строгое выравнивание, чем выравнива-
ние, заданное в директиве SEGMENT с помощью PARA. Если выравнива-
ние сегменте недостаточно строгое, то директива ALIGN генерирует
предупреждающее сообщение.
Использование директивы ALIGN показано в следующем примере:
ALIGN 4 ; выравнивание на границу DWORD для 386
BignNum DD 12345678
Определение меток
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Метки позволяют вам присваивать значения идентификаторам.
Существует три способа определения меток:
- использование операции :;
- использование директивы LABEL;
- использование операции :: (MASM 5.1).
Операция :
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Операция : определяет ближнюю метку кода и имеет синтаксис:
имя:
Турбо Ассемблер 3.0/tasm/#1-2 = 174 =
где "имя" - это идентификатор, который вы не объявляли ранее в
исходном коде. Ближние метки кода вы можете размещать на строке
кода, где содержится только одна метка, или в начале строки перед
инструкцией. Обычно ближние метки кода используются в качестве
адреса перехода в инструкциях JMP и CALL в том же сегменте.
Если вы не используете директиву PUBLIC, чтобы метка была
доступна из других файлов, она доступна только в текущем исходном
файле.
Данная директива работает точно также, как при использовании
директивы LABEL для определения ближней метки (NEAR). Например,
A: эквивалентно A LABEL NEAR.
Приведем пример использования операции :
jne A ; пропустить следующую инструкцию
inc si
A: ; jne передает управление сюда
Турбо Ассемблер 3.0/tasm/#1-2 = 175 =
Директива LABEL
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Директиву LABEL вы можете использовать для определения иден-
тификатора заданного типа. Заметим, что синтаксис в режимах MASM
и Ideal различен. В режиме Ideal задавайте:
LABEL имя сложный_тип
В режиме MASM используйте следующее:
имя LABEL сложный_тип
где "имя" - это идентификатор, который вы не определяли ранее в
исходном файле. "Сложный_тип" описывает размер идентификатора и
то, ссылается он на код или данные. См. Главу 5, в которой можно
найти дальнейшую информацию о сложных типах.
Если вы не используете директиву PUBLIC, чтобы метка была
доступна из других файлов, она доступна только в текущем исходном
файле.
Вы можете использовать директиву LABEL для доступа к элемен-
там различного размера, которые содержатся в структуре данных.
Этот принцип иллюстрируется следующим примером:
WORDS LABEL WORD ; доступ к "BYTES" как к
; WORDS
BYTES DB 64 DUP (0)
mov WORDS[2],1 ; запись в WORDS 1
Турбо Ассемблер 3.0/tasm/#1-2 = 176 =
Директива ::
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Директива :: позволяет вам определить с областью действия,
выходящей за рамки процедуры, в которой она находится. Это отли-
чается от директивы : тем, что метки, определенные с помощью :
имеют область действия только в текущей процедуре. Заметим, что
:: отличается от : только когда вы задаете язык в операторе
.MODEL. Приведем пример (файл DBLCOLON.ASM):
VERSION M510
.MODEL SMALL,C
.CODE
A PROC
NOP
ASINGLE:NOP
ADOUBLE::NOP
NOP
A ENDP
B PROC
NOP
JMP ASINGLE ; приведет к ошибке
JMP ADOUBLE
RET
B ENDP
END
|
adfun.ru
|
|
|
|