 |
END start
Три сегмента dseg1, dseg2 и dseg3 группируются под одним
именем DGROUP. В результате все переменные отдельных сегментов
хранятся в памяти вместе. В исходном тексте программы в каждом из
отдельных сегментов описывается байтовая переменная (метки v1, v2
и v3).
В коде данной программы MASM в регистры AX, BX и CX загружа-
ются смещения адресов этих переменных. В соответствии с предшест-
вующей директивой ASSUME и из-за того, что сегменты данных сгруп-
пированы вместе, вы можете подумать, что MASM будет вычислять
смещения переменных относительно всей группы, в которой перемен-
ные очевидно хранятся в памяти.
Но произойдет совсем не это! Вопреки вашим намерениям MASM
вычисляет смещения переменных относительно отдельных сегментов
dseg1, dseg2 и dseg3. Он делает это несмотря на то, что все три
сегмента данных сгруппированы в памяти в один сегмент данных, ад-
ресуемый через регистр DS. Бессмысленно определять смещения пере-
менных относительно отдельных сегментов в тексте программы, ког-
да эти сегменты скомбинированы в памяти в один сегмент.
Единственный способ ссылки на такие переменные состоит в ссылке
на их смещения относительно всей группы.
Чтобы избавиться в MASM от этой проблемы, вам потребуется
наряду с ключевым словом OFFSET задавать имя группы:
mov ax,OFFSET DGROUP:v1
mov bx,OFFSET DGROUP:v2
mov cx,OFFSET DGROUP:v3
Турбо Ассемблер 3.0/tasm/#1-2 = 63 =
Хотя теперь это ассемблируется корректно и загружаются сме-
щения переменных v1, v2 и v3 относительно DGROUP (где собраны от-
дельные сегменты), вы можете легко забыть задать квалификатор
DGROUP. Если вы сделаете эту ошибку, значения смещений не позво-
лят корректно определить переменные в памяти, и вы не получите в
MASM никакого указания, что что-то произошло не так. Режим Ideal
позволяет избежать таких неприятностей:
IDEAL
SEGMENT dseg1 para public 'data'
v1 db 0
ENDS
SEGMENT dseg2 para public 'data'
v2 db 0
ENDS
SEGMENT dseg3 para public 'data'
v3 db 0
ENDS
GROUP DGROUP dseg1, dseg2, dseg3
SEGMENT cseg para public 'code'
ASSUME cs:cseg,ds:DGROUP
start:
mov ax,OFFSET v1
mov bx,OFFSET v2
mov cx,OFFSET v3
ENDS
END start
Смещения переменных v1, v2 и v3 корректно вычисляются отно-
сительно группы, в которой собраны отдельные сегменты, которым
принадлежат переменные. В режиме Ideal квалификатор DGROUP для
ссылки на переменные в сегментах группы не требуется. В режиме
MASM этот квалификатор также не является необходимым, но, что ху-
же всего, не выдается никаких предупреждений, если вы забыли в
конкретной ссылке определить имя группы.
Комментарии в программах
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Комментирование исходного кода позволяет вам (или тому, кто
будет эти программы в последующем поддерживать) быстро разбирать-
ся в его работе. Использование комментариев считается хорошей
практикой программирования на любом языке. Они позволяют описать
семантику (смысл), а не только синтаксис кода. Мы рекомендуем вам
широко использовать комментарии в исходном коде Ассемблера, и в
данном разделе описывается, как это можно сделать.
Турбо Ассемблер 3.0/tasm/#1-2 = 64 =
Комментарии в конце строки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Комментировать код Ассемблера можно несколькими способами.
Один из методов состоит в добавлении комментария в конец строки,
используя точку с запятой, например:
mov [bx],a1 ; записать измененный символ
Другой способ комментирования исходного кода заключается в
использовании в качестве символа комментария символа продолжения
строки (\). (См. ниже раздел "Продолжение строки").
Директива COMMENT
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Директива COMMENT позволяет вам комментировать блок исходно-
го кода. COMMENT позволяет игнорировать весь текст, начиная от
первого символа-ограничителя и до строки, содержащей следующее
вхождение ограничителя. В следующем примере в качестве ограничи-
теля используется символ *:
COMMENT *
здесь следуют замечания
*
Примечание: Директива COMMENT работает только в режиме
MASM.
Продолжение строки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для тех строк, длина которых превышает 80 символов, в Турбо
Ассемблере предусмотрен символ продолжения \. Поскольку Турбо Ас-
семблер игнорирует любой символ, следующий за \ на данной строке,
используйте этот символ в конце строки.
При использовании символа \ максимальная длина строки сос-
тавляет 1024 символа. Однако таблицы, записи и перечисления могут
содержать определения, превышающие 1024 символа. В качестве аль-
тернативы, при которой не накладывается ограничение в 1024 сим-
вола, можно использовать синтаксис с множественными определения-
ми. Приведем пример такого синтаксиса (для определения enum):
foo enum ( ;Множественная версия
f1
f2
f3
f4
f5
f6
f7
f8
)
Турбо Ассемблер 3.0/tasm/#1-2 = 65 =
Можно дать более компактную версию этого определения:
foo enum f1,f2( ;Компактная версия
f3,f4
f5,f6
f7,f8)
При использовании множественных определений нужно соблюдать
следующие правила:
- левая скобка, которая начинает определение, должна быть
последней лексемой в начальной строке (однако, это не оз-
начает, что она должна предшествовать первому элементу
списка);
- в множественное определение нельзя включать такие директи-
вы, как IF или INCLUDE.
В режиме MASM продолжение строки можно использовать при вы-
боре VERSION M51,M520. При это строки и другие лексемы можно раз-
мещать на нескольких строках, используя в качестве последнего
символа строки символ "\". Например:
VERSION M51,M520
DB 'Hello out there \
you guys'
В любом месте строки вы можете использовать стандартный ре-
жим продолжения строки Турбо Ассемблера (он всегда доступен). Он
действует также, как комментарий, например:
ARG a1:word, \ первый аргумент
a2:word, \ второй аргумент
a3:word, \ третий аргумент
Использование включаемых файлов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Включаемые файлы позволяют вам использовать один и тот же
блок кода в разных местах программы, включать этот блок в нес-
кольких исходных модулях или уменьшить объем программы без необ-
ходимости создания нескольких компонуемых модулей. Использование
директивы INCLUDE указывает Турбо Ассемблеру, что нужно найти за-
данный файл на диске и ассемблировать его, как если бы он был
частью исходной программы.
Примечание: Допускается вложенность директив INCLUDE
на любую глубину.
Синтаксис режима Ideal:
INCLUDE "имя_файла"
Турбо Ассемблер 3.0/tasm/#1-2 = 66 =
|