Глава 3. Общие принципы программирования

          Данная глава  знакомит  вас  с  основными  принципами  Турбо
     Ассемблера. Мы  сравним  режимы  Турбо  Ассемблера  Ideal и MASM,
     рассмотрим, как можно комментировать программы и продолжать стро-
     ки исходного кода,  использовать включаемые файлы, предопределен-
     ные идентификаторы и как использовать некоторые директивы,  гене-
     рирующие  информацию  для  модулей.  Хотя диапазон охваченным тем
     велик, это даст вам хорошее представление о том, что собой предс-
     тавляет язык ассемблера.


Режим Ideal Турбо Ассемблера

Для тех, кто пытается приспособить для своих целей макроас- семблер MASM, эта глава является, вероятно, наиболее важной в данном руководстве. Кроме очень хорошей совместимости с синтак- сисом MASM, Турбо Ассемблер позволяет несколько сгладить неудоб- ства программирования с использованием MASM с помощью улучшенного режима (режима Ideal). Кроме всего прочего режим Ideal позволяет вам, глядя только на исходный текст, определить, как будет вести себя выражение или операнд инструкции. При этом нет необходимости держать в памяти все тонкости MASM. С помощью улучшенного режима вы просто сможете писать ясные и четкие выражения, которые будут выполняться так, как это было задумано. Режим Ideal использует почти все ключевые слова, операции и конструкции языка MASM. Это означает, что вы можете исследовать и использовать средства режима Ideal поочередно, не прибегая к изу- чению большого числа новых правил или ключевых слов. Все средства режима Ideal представляют собой расширения или модификацию воз- можностей, имеющихся в MASM. Благодаря строгой проверке типа, выражения режима Ideal Тур- бо Ассемблера гораздо более понятны и менее способствуют получе- нию непредвиденных результатов. В результате многие из проблем MASM, о которых мы предупреждали вас в предыдущих главах, исчеза- ют под зорким оком режима Ideal. Pежим Ideal содержит также ряд средств, облегчающих процесс программирования как для новичков, так и для опытных пользовате- лей. Вот некоторые из таких средств: * дублирование имен элементов во множественных структурах; * сложные выражения HIGH и LOW; * предсказуемая обработка директив EQU; * корректная обработка сгруппированных сегментов данных; * улучшенная содержательность директив; * хорошо воспринимаемые выражения, заключенные в квадратные скобки.

Для чего используется режим Ideal?

Есть множество причин, по которым вам следует использовать режим Ideal Турбо Ассемблера. Если вы изучаете язык Ассемблера, то сможете легко строить для получения желаемого эффекта выраже- ния и операторы режима Ideal. Вам не придется ходить вокруг да около и пробовать различные варианты, пока вы не используете инс- трукцию, которая делает именно то, что вы хотите. Если у вас име- ется опыт программирования на Ассемблере, то вы можете использо- вать средства режима Ideal Турбо Ассемблера для разработки сложных программ, использующих расширения языка, такие, например, как вложенные структуры и объединения. В результате более четкого синтаксиса режим Ideal Турбо Ас- семблера позволяет ассемблировать файлы на 30% быстрее, чем в ре- жиме MASM. Чем больше объем ваших программ и программных комплек- сов, тем больше времени вы сэкономите при ассемблировании, перейдя в режим Ideal. Строгие правила проверки типов, налагаемые режимом Ideal, позволяют Турбо Ассемблеру выявлять ошибки, которые в противном случае вы обнаружили бы только при отладке вашей программы или ее выполнении. Это аналогично тому, каким образом компиляторы языков высокого уровня оказывают вам помощь, отмечая сомнительные конс- трукции и несоответствие размеров данных. Хотя в режиме Ideal Турбо Ассемблера в некоторых выражениях используется другой синтаксис, вы, тем не менее, можете писать программы, которые будут одинаково хорошо ассемблироваться как в режиме MASM, так и в режиме Ideal. Вы можете также в одном и том же исходном файле переключаться из режима MASM в режим Ideal и обратно так часто, насколько это необходимо. Это особенно полезно при экспериментировании со средствами режима Ideal, или при пре- образовании имеющихся программ, написанных в синтаксисе MASM. Вы можете переключиться в режим Ideal в новых частях программы, до- бавляемых к имеющемуся исходному коду. При этом в остальных час- тях программы сохранится полная совместимость с MASM.

Переключение в режим Ideal и выход из него

Для переключения между режимом MASM и режимом Ideal можно использовать директивы IDEAL и MASM. Турбо Ассемблер всегда начи- нает ассемблирование исходного файла в режиме MASM. Для переклю- чения в режим Ideal перед использованием любых средств этого ре- жима в исходный файл нужно включить директиву IDEAL. С этого момента и до следующей директивы MASM все операторы будут вести себя так, как описывается в данной главе. Вы можете переключаться из режима MASM в режим Ideal в исходном файле столько раз, сколь- ко потребуется в любом месте исходного файла. Приведем пример: DATA SEGMENT ; начало в режиме MASM abc LABEL BYTE ; abc адресуется к xyz, ; как к байту xyz DW 0 ; определить слово по ; метке xyz DATA ENDS ; завершить сегмент ; данных IDEAL ; перейти в ; режим Ideal SEGMENT CODE ; ключевое слово SEGMENT ; теперь следует первым PROC MyProc ; ключевое слово PROC ; тоже следует первым . . ; здесь можно программировать . ; в режиме Ideal END MyProc ; повторение метки MyProc ; необязательно ENDS ; повторение имени сегмента ; не требуется MASM ; переключение обратно в ; режим MASM CODE SEGMENT ; перед ключевым словом SEGMENT ; теперь требуется имя Func2 PROC ; имя теперь также следует перед ; ключевым словом PROC . . ; программирование в режиме . ; MASM IDEAL ; переключение обратно в . ; режим Ideal . ; программирование в . ; режиме Ideal MASM ; возвращение в режим MASM Func2 ENDP ; имя опять требуется указывать ; перед ключевым словом CODE ENDS ; здесь также требуется имя Как вы можете заметить, в режиме Ideal ключевые слова дирек- тив (например, PROC или SEGMENT) указываются перед соответствую- щими именами идентификаторов, то есть в порядке, обратном тому, который принят в MASM. Кроме того имеется возможность повторить имя процедуры или сегмента после директив ENDP или ENDS. Добавле- ние этого имени идентифицирует сегмент или процедуру, которая за- канчивается, и делает программу более понятной. Это хороший прак- тический прием, особенно в программах, содержащих несколько вложенных процедур и сегментов. Однако указывать имя идентифика- тора после ENDP или ENDS необязательно.

Отличия режима Ideal и режима MASM

В данном разделе мы опишем основные различия между режимом Ideal и режимом MASM. Если вы знакомы с MASM, то можете поэкспе- риментировать с отдельными средствами, преобразуя небольшие части имеющихся программ в режим Ideal. Более подробно об отличиях ре- жимов рассказывается в Главе 5 "Использование выражений и значе- ний идентификаторов".

Выражения и операнды

Основное различие между выражениями режима Ideal и режима MASM состоит в функции, которую выполняют квадратные скобки. В режиме Ideal квадратные скобки всегда относятся к содержимому заключаемой в них величины. Квадратные скобки никогда не приводят в подразумеваемому сложению. Однако многие стандартные конструк- ции MASM в режиме Idealе не допускаются. В режиме Ideal квадратные скобки должны использоваться для получения содержимого элемента. Например: mov ax,wordptr приводит к выводу предупреждающего сообщения, если вы пытаетесь загрузить указатель (wordptr) в регистр (AX). Корректной будет следующая форма: mov ax,[wordptr] Здесь ясно, что вы загружаете содержимое ячейки, адресуемой с помощью wordptr (в текущем сегменте данных DS) в регистр AX. Если вы хотите сослаться на смещение идентификатора в сег- менте, то вы должны явно использовать операцию OFFSET, например: mov ax,OFFSET wordptr

Операции

Изменения, внесенные в операции выражений в режиме Ideal, позволяют повысить мощность и гибкость некоторых операций, оста- вив без изменения общее поведение выражений. Для того, чтобы со- действовать некоторым комбинациям операций, изменен порядок стар- шинства некоторых операций. Аккуратно задавайте точку (.) в элементах структуры, на ко- торые вы ссылаетесь. Операция точки для элементов структур в ре- жиме Ideal является более строгой. Выражение слева от точки долж- но представлять собой имя элемента структуры. Приведем примеры загрузки регистров значениями конкретных элементов структур: ; Опишем переменные с помощью структурных типов S_Stuff SomeStuff <> O_Stuff OtherStuff <> mov ax,[S_Stuff.Amount] ; загрузить значение размером в ; слово mov bl,[O_Stuff.Amount] ; загрузить значение размером в ; байт

Подавление корректировок

В режиме Ideal Турбо Ассемблер не генерирует сегментных кор- ректировок для частных сегментов (private), которые выравниваются на границу страницы или параграфа. Так как компоновщик не требует подобных корректировок, при ассемблировании программ в режиме Ideal может быть получен объектный код меньшего объема, компонов- ку которых компоновщик выполняет более быстро, чем компоновку объектных файлов, сгенерированных в режиме MASM. Далее показыва- ется, каким образом такие корректировки производятся в режиме MASM (но не в режиме IDEAL): SEGMENT DATA PRIVATE PARA VAR1 DB 0 VAR2 DW 0 ENDS SEGMENT CODE ASSUME ds:DATA mov ax,VAR2 ; корректировок не требуется ENDS Примечание: Это различие не влияет на код, который вы пишете. Здесь об этом упоминается только для вашего сведе- ния.

Операнд инструкции BOUND

В инструкции BOUND требуется указывать операнд типа WORD (слово), а не DWORD (двойное слово). Это позволяет вам определить в нижнюю и верхнюю границу в виде двух констант размером в слово, что устраняет необходимость преобразования операнда в DWORD явным образом (с помощью DWORD PTR). В режиме MASM вы должны записы- вать: BOUNDS DW 1,4 ; нижняя и верхняя границы BOUND DWORD PTR BOUNDS ; требуется в режиме MASM Однако в режиме Ideal требуется только записать: BOUNDS DW 1,4 ; нижняя и верхняя границы BOUND [BOUNDS] ; допускается в ; режиме Ideal

Сегменты и группы

Способ, с помощью которого Турбо Ассемблер обрабатывает в режиме Ideal сегменты и группы, может внести большое различие в формирование и выполнение программ. Как и большинству людей, вам, вероятно, не захочется ломать голову над ошибками, возникающими из-за взаимодействия сегментов и групп. Большинство трудностей в этом процессе возникает из-за про- извольного характера предположений в MASM (и следовательно Турбо Ассемблером в режиме MASM) о ссылках на данные или код в группах. К счастью, режим Ideal сглаживает некоторые наиболее явные проб- лемы, которые могут вызвать директивы определения сегментов и групп в MASM. Об этом мы и расскажем далее.

Доступ к данным в сегменте, принадлежащем группе

В режиме Ideal любой элемент данных в сегменте, являющемся частью группы, рассматривается строго как элемент группы, а не сегмента. В Турбо Ассемблере для распознавания элемента данных, как элемента сегмента, нужно использовать явное переопределение сегмента. В режиме MASM это интерпретируется по-другому. Иногда иден- тификаторы считается частью сегмента, а не частью группы. В част- ности, в режиме MASM идентификатор интерпретируется, как часть сегмента, когда он используется, как указатель на выделенные дан- ные. Это может вызвать путаницу, так как когда вы непосредственно обращаетесь к данным без операции OFFSET, MASM некорректно гене- рирует ссылку на сегмент вместо ссылки на группу. Пример поможет нам пояснить, как легко можно нажить неприят- ности из-за специфики адресации в MASM. Рассмотрим следующую не- полную программу MASM, в которой описываются три сегмента данных: dseg1 SEGMENT para public 'data' v1 db 0 dseg1 ENDS dseg2 SEGMENT para public 'data' v2 db 0 dseg2 ENDS dseg3 SEGMENT para public 'data' v3 db 0 dseg3 ENDS DGROUP GROUP dseg1,dseg2,dseg3 cseg SEGMENT para public 'code' ASSUME cs:cseg,ds:DGROUP start: mov ax,OFFSET v1 mov bx,OFFSET v2 mov cx,OFFSET v3 cseg ENDS 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 Хотя теперь это ассемблируется корректно и загружаются сме- щения переменных 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 этот квалификатор также не является необходимым, но, что ху- же всего, не выдается никаких предупреждений, если вы забыли в конкретной ссылке определить имя группы.

Комментарии в программах

Комментирование исходного кода позволяет вам (или тому, кто будет эти программы в последующем поддерживать) быстро разбирать- ся в его работе. Использование комментариев считается хорошей практикой программирования на любом языке. Они позволяют описать семантику (смысл), а не только синтаксис кода. Мы рекомендуем вам широко использовать комментарии в исходном коде Ассемблера, и в данном разделе описывается, как это можно сделать.

Комментарии в конце строки

Комментировать код Ассемблера можно несколькими способами. Один из методов состоит в добавлении комментария в конец строки, используя точку с запятой, например: mov [bx],a1 ; записать измененный символ Другой способ комментирования исходного кода заключается в использовании в качестве символа комментария символа продолжения строки (\). (См. ниже раздел "Продолжение строки").

Директива COMMENT

Директива COMMENT позволяет вам комментировать блок исходно- го кода. COMMENT позволяет игнорировать весь текст, начиная от первого символа-ограничителя и до строки, содержащей следующее вхождение ограничителя. В следующем примере в качестве ограничи- теля используется символ *: COMMENT * здесь следуют замечания * Примечание: Директива COMMENT работает только в режиме MASM.

Продолжение строки

Для тех строк, длина которых превышает 80 символов, в Турбо Ассемблере предусмотрен символ продолжения \. Поскольку Турбо Ас- семблер игнорирует любой символ, следующий за \ на данной строке, используйте этот символ в конце строки. При использовании символа \ максимальная длина строки сос- тавляет 1024 символа. Однако таблицы, записи и перечисления могут содержать определения, превышающие 1024 символа. В качестве аль- тернативы, при которой не накладывается ограничение в 1024 сим- вола, можно использовать синтаксис с множественными определения- ми. Приведем пример такого синтаксиса (для определения enum): foo enum ( ;Множественная версия f1 f2 f3 f4 f5 f6 f7 f8 ) Можно дать более компактную версию этого определения: 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 "имя_файла" Синтаксис режима MASM: INCLUDE имя_файла где в имени файла может задаваться дисковод, каталог или расшире- ние. Если каталог или дисковод в имени файла не указываются, то Турбо Ассемблер сначала ищет файлы в каталогах, заданных в пара- метре командной строки /i, а затем в текущем каталоге.

Предопределенные идентификаторы

В Турбо Ассемблере предусмотрено несколько предопределенных идентификаторов, которые вы можете использовать в программах. В разных местах этого кода эти идентификаторы могут иметь различное значение. Они аналогичны строковым присваиваниям, выполняемым по директиве EQU. Когда Турбо Ассемблер обнаруживает в исходном фай- ле один из этих идентификаторов, он заменяет его текущим значени- ем данного предопределенного идентификатора. Некоторые из этих идентификаторов представляют собой тексто- вые (строковые) присваивания, другие - числовые присваивания, а третьи являются псевдонимами. Строковые значения могут использо- ваться в любом месте, где допускается использование текстовых строк, например, для инициализации последовательности байтовых данных с помощью директивы DB: NOW DB ??time Числовые предопределенные значения можно использовать в лю- бом месте, где допустимо использование числа: IF ??version GT 100h Значения-псевдонимы превращают предопределенные идентифика- торы в синоним представляемого значения, что позволяет использо- вать имя предопределенного идентификатора в любом месте, где можно использовать обычное имя идентификатора: ASSUME cs:@code Все предопределенные идентификаторы могут использоваться как в режиме MASM, так и в режиме Ideal. Если вы при ассемблировании используете параметр командной строки /ml, то предопределенные идентификаторы нужно использовать в точности так, как они описаны ниже (соблюдая регистр символов). К идентификаторам, начинающимся с символа @, применимо сле- дующее правило: первая буква каждого слова, которое составляет имя идентификатора, указывается в верхнем регистре (кроме имен сегментов), а остальная часть слова - в нижнем. Например: @FileName Заметим, что @FileName представляет собой присваивание псевдонима для текущей ассемблируемой строки. Исключением являются переопределенные идентификаторы, кото- рые ссылаются на сегменты. Имена сегментов начинаются с символа @ и записываются символами в нижнем регистре. Например: @curseg @fardata У идентификаторов, начинающихся с двух вопросительных знаков (??), все буквы должны быть в нижнем регистре, например: ??date ??version Заметим, что идентификатор ??date определяет текстовое прис- ваивание, которое представляет текущую дату. Точный формат строки даты определяется кодом страны, установленным в DOS. Идентифика- тор ??version позволяет вам писать исходные файлы, использующие средства различных версий Турбо Ассемблера. Это присваивание поз- воляет вам также определить, ассемблируется ли исходный файл с помощью MASM или с помощью Турбо Ассемблера, поскольку идентифи- катор ??version в MASM не определен. Аналогично, ??filename опре- деляет строку из 8 символов, представляющую собой имя текущего ассемблируемого файла. Если имя файла содержит менее 8 символов, то оно дополняется пробелами. Идентификатор ??time определяет текстовое присваивание, которое представляет текущее время. Точ- ный формат строки времени определяется кодом страны, установлен- ным в DOS.

Присваивание идентификаторам значений

Турбо Ассемблер предоставляет две директивы, которые позво- ляют присвоить идентификатору значение: EQU и =. Директива EQU определяет строковое присваивание, присваивание псевдонима или числовое присваивание. Она имеет следующий синтаксис: имя EQU выражение где "имени" присваивается результат вычисления выражения. "Имя" должно быть новым идентификатором, который ранее подобным образом не определялся. Если первое определение представляло собой стро- ковое присваивание, в режиме MASM вы можете только переопреде- лить идентификатор, определенный по директиве EQU. В режиме MASM EQU может генерировать любой из трех видов присваиваний: строко- вое, числовое или присваивание псевдонима. Директива = определяет только числовое присваивание. Она имеет синтаксис: имя = выражение где "имени" присваивается результат вычисления выражения, при вы- числении которого должна получаться константа или адрес в сегмен- те. "Имя" может быть новым идентификатором или идентификатором, уже определенным ранее по директиве =. Поскольку директива = име- ет намного более предсказуемое поведение, чем директива EQU в ре- жиме MASM, по возможности используйте директиву EQU.

Общая структура модуля

В Турбо Ассемблере имеется несколько директив, которые помо- гают вам работать с модулями кода. Эти директивы описываются в оставшейся части данной главы.

Директива VERSION

Использование директивы VERSION позволяет вам определить, для какой версии Турбо Ассемблера или MASM вы пишете конкретные модули. Это полезно использовать для совместимости (снизу вверх или наоборот) различных версий TASM и MASM. Директива VERSION также переводит вас в режим работы заданной версии. Директиву VERSION вы можете указывать как в виде параметра командной строки, так и в исходном коде программы. В исходном коде она имеет следующий синтаксис: VERSION <идентификатор_версии> Допускается задавать следующие идентификаторы версии: M400 MASM 4.0 M500 MASM 5.0 M510 MASM 5.1 M520 MASM 5.2 (Quick ASM) T100 Турбо Ассемблер 1.0 T101 Турбо Ассемблер 1.01 T200 Турбо Ассемблер 2.0 T250 Турбо Ассемблер 2.5 T300 Турбо Ассемблер 3.0 При использовании данной директивы в командной строке ис- пользуется следующий синтаксис: /U<номер_версии> Например, если вы хотите ассемблировать программу, написан- ную для MASM 5.0, то можно не изменять исходный код и указать в командной строке параметр /uM510. Здесь действуют следующие правила: 1. Директива VERSION по умолчанию всегда выбирает режим MASM, поскольку это начальный режим работы как для MASM, так и для Турбо Ассемблера. 2. Директива VERSION ограничивает высокоприоритетные ключе- вые слова теми словами, которые доступны для заданного компилятора и версии, В результате некоторые средства, которые были добавлены в последние версии, будут вам не- доступны. 3. Если в режиме Ideal вы выбираете версию < T300, то дирек- тива VERSION вам недоступна. В этом случае, чтобы исполь- зовать директиву VERSION, вы должны сначала переключиться в режим MASM. В предыдущих версиях Турбо Ассемблера совместимость с MASM обеспечивалась с помощью таких директив, как MASM51, MOMASM51, QUIRKS, SMART и NOSMART. Вместо этих директив используется теперь директива VERSION. Полное описание ключевых слов, доступных в каждой предыдущей версии Турбо Ассемблера, можно найти в Приложе- нии B.

Директива NAME

Используйте директиву NAME для задания имени модуля объект- ного файла. Она имеет следующий синтаксис: NAME имя_модуля Примечание: Данная директива работает только в режиме Ideal. Турбо Ассемблер обычно использует в качестве имени модуля имя исходного файла с дисководом, каталогом и расширением. Если вы хотите изменить это используемое по умолчанию имя, укажите ди- рективу NAME. Новым именем модуля будет имя "имя_модуля", напри- мер: NAME loader

Директива END

Используйте директиву END, чтобы отметить конец исходного файла. При этом используется следующий синтаксис: END начальный_адрес: где "начальный_адрес" - это необязательный идентификатор или вы- ражение, определяющий адрес в программе, с которого вы хотите на- чать выполнение. Если ваша программа скомпонована из нескольких исходных файлов, начальный адрес может задаваться только в одном из них. Этот адрес может представлять собой адрес в модуле. Он может быть также внешним идентификатором, определенным в другом модуле, описанном по директиве EXTRN. Любой текст, указанный в исходном файле после директивы END, Турбо Ассемблер игнорирует. Пример: .MODEL small .CODE ; тело программы END START ; точка входа программы "START" THIS LINE IS IGNORED ; эта строка игнорируется SO IS THIS ONE ; эта строка тоже

Вывод сообщения в процессе ассемблирования

Турбо Ассемблер обеспечивает две директивы, которые позволя- ют вам выводить строку на консоль в процессе ассемблирования: DISPLAY и %OUT. Вы можете использовать эти директивы для сообще- ний о ходе ассемблирования, о том, чтобы знать, насколько продви- нулся процесс ассемблирования, или чтобы определить, что достиг- нута определенная часть кода. Эти две директивы практически представляют собой одно и то же, но директива DISPLAY выводит на экран строку, заключенную в кавычки, а %OUT - без кавычек. В режимах Ideal и MASM директива DISPLAY имеет следующий синтаксис: DISPLAY "текст" где "текст" - любое сообщение, которое вы хотите вывести на эк- ран. Заметим, что для вывода информации вместо экрана в файл вы можете использовать средство изменения направления вывода DOS. Директива %OUT в режимах Ideal и MASM имеет следующий син- таксис: %OUT текст где "текст" также представляет то, что вы хотите вывести.

Вывод предупреждающих сообщений

Турбо Ассемблер предоставляет вам выбирать предупреждающие сообщения (если они имеются), которые будут выводиться в опреде- ленных частях кода. Каждое предупреждающее сообщение содержит трехбуквенный идентификатор, который вы можете заранее задать, чтобы Турбо Ассемблер знал, хотите или нет вы просматривать пре- дупреждающие сообщения этого класса. Для разрешения предупрежда- ющих сообщений вы можете использовать директиву WARN, а для их запрещения - NOWARN. Синтаксис директивы WARN следующий: WARN [класс_предупреждений] где "класс_предупреждений" - это трехбуквенный идентификатор, за- дающий конкретный тип сообщения. Допускается использовать следую- щие классы предупреждений: ALN Выравнивание сегмента BRK Требуются скобки ICG Неэффективная генерация кода LCO Переполнение счетчика инструкций OPI Открытие условного IF OPP Открыть процедуру OPS Открытие сегмента OVF Арифметическое переполнение PDC Конструкция, зависящая от прохода PRO Запись в память в защищенном режиме с исполь- зованием регистра CS PQK Предположение об использовании констант для [константа] предупреждение. RES Предупреждение о зарезервированном слове. TPI Недопустимое предупреждение Турбо Паскаля. Заметим, что те же идентификаторы используются в параметре командной строки /W. Приведем пример использования директивы WARN: WARN OVF ; разрешается предупреждение о переполнении DW 1000-h * 123h ; выводится предупреждение о переполнении Примечание: Директива WARN без класса предупреждений разрешает все предупреждения. Директива WARN с идентифика- тором разрешает только указанные предупреждения. Для запрещения конкретного класса предупреждающих сообщений (или их всех) используйте директиву NOWARN. Эта директива исполь- зует те же идентификаторы, что и описанные выше для директивы WARN. Приведем примеры использования директивы NOWARN: NOWARN OVF ; запрещается предупреждение о переполнении DW 1000-h * 123h ; не выводится предупреждение о ; переполнении

Вывод нескольких сообщений об ошибках

По умолчанию Турбо Ассемблер допускает вывод для каждой строки исходного кода только одного сообщения об ошибке. Если строка исходного кода содержит несколько ошибок, то Турбо Ассемб- лер сообщает сначала о наиболее существенной из них. С помощью директив MULTERRS и NOMUTERRS вы можете управлять числом сообще- ний об ошибках, получаемых для каждой строки исходного кода. Директива MULTERRS позволяет Ассемблеру сообщать для каждой строки исходного кода о более чем одно ошибке. Иногда это полезно использовать для обнаружения трудноуловимой ошибки, или когда ис- ходная строка содержит более одной ошибки. Заметим, что иногда дополнительные сообщения об ошибках мо- гут вызвать "цепную реакцию", к которой приводит первая ошибка. После исправления первой ошибки в этом случае исчезает вся "це- почка" ошибок. Приведем пример директивы MULTERRS: MULTERRS mov ax,[bp+abc ; порождает две ошибки: ; 1) неопределенный идентификатор ; abc ; 2) нужна правая квадратная ; скобка Директива NOMULTERRS позволяет выводить для каждой строки исходного кода только одно сообщение об ошибке или предупреждаю- щее сообщение. Когда вы исправите эту ошибку, могут исчезнуть также другие сообщения об ошибках. Однако если вы хотите опреде- лить вывод сообщений о самых серьезных ошибках, нужно использо- вать директиву MULTERRS, чтобы увидеть все сообщения об ошибках. Приведем пример использования директивы NOMULTERRS: NOMULTERRS mov ax,[bp+abc ; порождает одну ошибку: ; 1) неопределенный идентификатор ; abc
                       Назад | Содержание | Вперед