Turbo Assembler 3.0. Руководство пользователя

         

Определение перечислимых типов данных


Перечислимые типы данных представляют набор значений, кото- рые можно сохранять в определенном числе бит. Максимальное запи- санное значение определяет фактически необходимое число бит.

Приведем пример синтаксиса режима Ideal определения перечис- лимого типа данных:

ENUM имя [переменная_перечисления [, переменная_перечисления.]]

В режиме MASM вы можете использовать следующий синтаксис:

имя ENUM [переменная_перечисления [, переменная_перечисления.]]

Каждая "переменная_перечисления" имеет следующий синтаксис:

имя_переменной [=значение]

Когда вы присваиваете переменной "имя_переменной" конкретное значение, Турбо Ассемблер, если поле "значение" отсутствует, бу- дет присваивает ей значение, равное значению последней перемен- ной в списке, плюс единица. Значения не могут быть относительными или иметь опережающие ссылки. Переменные, создаваемые перечисли- мым типом (ENUM), представляют собой переопределяемые переменные с глобальной областью действия.

Предупреждение: Если вы используете в двух перечисли- мых типах данных одно и то же имя переменной, то первое значение переменной будет потеряно, и в результате возник- нет ошибка.

"Имя" - это имя типа данных ENUM. Для получения различной информации о присваивании значений переменным вы можете затем ис- пользовать это имя. О присваивании имен перечислимым типам данных в Турбо Ассемблере рассказывается в Главе 5.

Имена перечислимых типов данных можно также использовать для создания переменных и выделения памяти. Подробности см. в Главе 12.

Перечислимые типы данных являются переопределяемыми. В моду- ле вы можете несколько раз определить одно и то же имя перечисли- мого типа данных.

Кроме того, Турбо Ассемблер для определения перечислимого типа данных с большим числом переменных использует синтаксис, в котором указывается несколько строк. Начало такого определения отмечается символом {, а конец - символом }.

В режиме Ideal этот синтаксис имеет следующий вид:

ENUM имя [переменная_перечисления [, переменная_перечисления.]] {переменная_перечисления [,переменная_перечисления].] . . . {переменная_перечисления [,переменная_перечисления].] }

В режиме MASM используется следующий синтаксис:

имя ENUM [переменная_перечисления [, переменная_перечисления.]] {переменная_перечисления [,переменная_перечисления].] . . . {переменная_перечисления [,переменная_перечисления].] }

Например, все приведенные ниже перечислимые типы данных эк- вивалентны:

foo ENUM f1, f2, f3, f4 ; исходная версия



foo ENUM { ; версия из нескольких строк f1, f2, f3, f4 }

foo ENUM f1, f2, { f3, f4 } ; более компактная версия

Примечание: Турбо Ассемблер не распознает в определе- нии перечислимого типа данных из нескольких строк никаких псевдоопераций.



Определение структур и объединений


Структуры и объединения позволяют вам совмещать и наклады- вать друг на друга данные различного типа. Структура в Турбо Ас- семблер представляет собой тип данных, который содержит один или более элементов структуры. Структуры отличаются от записей, пос- кольку элементы структуры занимают всегда целое число байт, а за- писи описывают поля с произвольным числом бит. Размер структуры равен общему размеру всех входящих в нее элементов.

Объединения аналогичны структурам, но все элементы объедине- ния занимают одну и ту же область памяти. Размер объединения ра- вен размеру наибольшего элемента объединения. Объединения полезно использовать, когда блок памяти должен предоставлять несколько разных возможностей, для каждой из которых требуется разная па- мять.

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



Определение таблиц


Табличный тип данных представляет набор элементов таблицы. Каждый элемент имеет заданный размер (в байтах) и начальное зна- чение. Элемент таблицы может быть виртуальным или статическим. Виртуальному элементу таблицы присваивается смещение в табличном типе данных. Для него резервируется место в каждом экземпляре таблицы. Статических элемент не имеет смещения. В экземпляре таб- лицы пространство для него не резервируется.

В целом размер табличного типа данных равен сумме размеров всех виртуальных элементов.

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

Для описания табличного типа данных в режиме Ideal можно использовать следующий синтаксис:

TABLE имя [элемент_таблицы [,элемент_таблицы.]]

Следующий синтаксис работает только в режиме MASM:

имя TABLE [элемент_таблицы [,элемент_таблицы.]]

Каждое поле "элемент_таблицы" имеет следующий синтаксис:

имя_таблицы

или [VIRTUAL] имя_элемента [[выражение_счетчика_1]] [: сложный_тип [:выражение_счетчика_2]] [=выражение]

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

"Имя_элемента" - это имя элемента таблицы. Необязательное ключевое слово VIRTUAL указывает, что элемент является виртуаль- ным, и ему нужно присвоить смещение.

"Сложный_тип" может представлять собой любое допустимое вы- ражение сложного типа. Описание допустимых типов выражений можно найти в Главе 5.

Если вы не задается поле "сложный_тип", Турбо Ассемблер под- разумевает, что это WORD (или DWORD, если текущей выбранной мо- делью является 32-разрядная модель).


Поле "выражение_счетчик_2" задает, сколько элементов данного типа определяется в таблице. Определение элемента таблицы:

foo TABLE VIRTUAL tmp:DWORD:4

определяет элемент таблицы с именем tmp, состоящий из 4 двойных слов.

По умолчанию, если вы его не задаете, "выражение_счетчи- ка_2" имеет значение 1. Поле "выражение_счетчика_1" - это коэффи- циент размера элемента массива. Для элемента резервируется па- мять, объем, которой определяется произведением "выражение_счет- чик_2", длины, заданной полем "сложный_тип", и "выражения_счетчи- ка_2". Если вы не задаете "выражение_счетчика_2", то по умолчанию его значение равно 1. Общее число элементов таблицы определяется произведением "выражение_счетчика_1" и "выражением_счетчика_2".

В режиме Ideal имена элементов таблицы являются локальными для таблицы, а в режиме MASM имеют глобальную область действия.

Поле "имя" задает имя табличного типа данных. Позднее вы мо- жете использовать его в модуле для получения информации о таблич- ном типе данных. Для получения информации можно также использо- вать имена отдельных элементов. Подробнее об этом рассказывается в Главе 5.

Табличные типы данных являются переопределяемыми. В модуле вы можете несколько раз определить табличный тип данных с одним и тем же именем. Подробнее об этом рассказывается в Главе 12.

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

Этот синтаксис аналогичен синтаксису перечислимого типа дан- ных. Приведем пример:

foo TABLE t1:WORD,t2:WORD,t3:WORD,t4:WORD ; исходная версия

foo TABLE { ; версия, использующая t1:WORD, ; несколько строк

t2:WORD, t3:WORD, t4:WORD }

foo TABLE t1:WORD,t2:WORD, { ; более компактная версия t3:WORD,t4:WORD }


Определение текстовых макрокоманд с помощью директивы EQU


Для определения простых текстовых макрокоманд можно исполь- зовать директиву EQU.Приведем синтаксис определения текстовой ма- крокоманды:

имя EQU текстовая_строка

где "текстовая_строка" связывается с текстовой макрокомандой с именем "имя". Для выделения текста вы можете заключить текстовую строку в угловые скобки (<>), например:

DoneMsg DB <'Returning to DOS'>

Если в режиме MASM вы опустите скобки, то Турбо Ассемблер будет определять, можно ли свести текстовую строку к выражению. Если ее вычислить нельзя, Турбо Ассемблер будет интерпретировать текстовую строку как текстовую макрокоманду (чтобы сохранить совместимость c MASM). Чтобы обеспечить правильное определение текстовой строки, нужно всегда заключать ее в угловые скобки. Рассмотрим следующие ошибки, которые могут возникать, если вы этого не делаете:

Earth EQU dirt ; Earth = "dirt" Planet EQU Earth ; Planet = "dirt" (неверно!) Planet EQU <Earth> ; Planet = "Earth" (верно!)

В режиме Ideal оператор EQU всегда определяет текстовую мак- рокоманду.

Текстовые макрокоманды являются переопределяемыми. Вы може- те переопределить текстовую макрокоманду в том же модуле другой текстовой строкой.



Определение вложенных и рекурсивных макрокоманд


Операторы в теле макрокоманды могут включать в себя операто- ры, вызывающие или определяющие другие макрокоманды. Возьмем сле- дующий пример:

MCREATE MACRO opname, op1,op2,op3,op4,op5,op6,op7 IFNB opname DO & opname MACRO op,count IF count LE 4 REPT count opname op,1 ENDM ELSE MOVE CL,count opname op,CL ENDIF EMDM ; конец DOopname MCREATE op1,op2,op3,op4,op5,op6,op7 ; рекурсия! ENDIF ; конец if ENDM ; конец макрокоманды MCREATE

После вызова:

MCREATE ror,rol,rcl,rcr,shl,sal,sar

будут созданы дополнительные макрокоманды DOror, DOrol и т.д., которые можно использовать следующим образом:

DOshr ax,5 DOrcr bx,3

Рекурсивные макрокоманды можно вызывать со списком парамет- ров и задавать их таким образом, что они будут работать с пере- менным числом параметров (от 0 до максимального числа парамет- ров). Для этого макрокоманда должна использовать первый параметр для выполнения ее макрорасширения, а затем вызывать сама себя с оставшимися параметрами. При каждой рекурсии остается на один параметр меньше. В конце концов, будет последняя рекурсия без па- раметров.

Когда вы вызываете макрокоманду рекурсивно, всегда требуется как-то проверить конец рекурсии. Обычно при наличии передаваемого параметра это делается в теле макрокоманды с помощью условного оператора IFNB. Приведем простой пример рекурсивной макрокоманды:

PUSH MACRO r1,r2,r3,r4,r5,r6,r7,r8 IFNB r1 PUSH r1 PUSH r2,r3,r4,r5,r6,r7,r8 ENDIF ENDM



Определение внешних идентификаторов


Внешние идентификаторы - это идентификаторы, которые опреде- лены вне модуля и которые вы можете использовать внутри модуля. Эти идентификаторы должны быть описаны с помощью директивы PUBLIC. Директива EXTRN имеет следующий синтаксис:

EXTRN определение [,определение] .

где "определение" описывает идентификатор и имеет следующий фор- мат:

[язык] имя [[счетчик_1]] :сложный_тип [:счетчик_2]



Определение записей с битовыми полями


Данные типа записи представляют собой набор битовых полей. Каждое битовое поле имеет заданную длину (в битах) и начальное значение. Размер данных типа записи равен сумме длин всех полей.

Вы можете использовать данные типа записи для максимально компактного представления данных. Например, можно представить группу из 16 флагов (каждый из которых может быть либо установлен (ON), либо сброшен (OFF)) как 16 отдельных бит, 16 отдельных слов, или как запись, содержащую 16 1-битовых полей (наиболее эф- фективный метод).

Приведем синтаксис описания данных типа записи режима Ideal:

RECORD имя [поле_записи [,поле_записи.]]

В режиме MASM этот синтаксис имеет вид:

имя RECORD [поле_записи [,поле_записи.]]

Каждое "поле_записи" имеет следующий синтаксис:

имя_поля : размер_выражения [=значение]

где "имя_поля" - это имя поля записи. Турбо Ассемблер будет выде- лять для него битовое поле размером "размер_выражения". "Значе- ние" и размер выражений не могут быть относительными или иметь опережающие ссылки. Имена поля записи имеют глобальную область действия и переопределяться не могут.

"Имя" - это имя типа записи. Далее вы можете использовать его в модуле для получения различной информации о данных типа за- писи. Вы можете также использовать имена для этого имена отдель- ных полей записи. Значения и выражения размера не могут быть от- носительными и иметь опережающие ссылки. Имена полей записи являются по области действия глобальными и переопределяться не могут.

Вы можете переопределить тип записи и определить в модуле одно и то же имя, как данные типа записи, несколько раз.

Вы можете также использовать имена типов записи для создания переменных и выделения памяти. Подробности можно найти в Главе 12.

Турбо Ассемблер обеспечивает для полей записи специальную поддержку, которая представляет флаги и данные перечислимого ти- па. Более эффективный доступ к полям записи обеспечивают расши- ренные и дополнительные инструкции. Эта концепция описывается в Главе 13.

Для определений данных типа записи, требующих большого числа полей, в Турбо Ассемблере предусмотрен расширенный синтаксис, аналогичный синтаксису перечислимого типа данных. Например, все следующие определения типа данных эквивалентны:

foo RECORD f1:1,f2:2,f3:3,f4:4 ; исходная версия

foo RECORD { ; версия, использующая f1:1, ; несколько строк f2:2, f3:3, f4:4 }

foo RECORD f1:1,f2:2, { ; более компактная версия f3:3,f4:4 }



Определения аргументов и локальных переменных


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

В описании процедуры передаваемые в процедуру через кадр стека аргументы задаются директивой ARG. Аргументы имеют внутрен- нее представление в виде положительных смещений от регистров BP или EBP.

Языковые соглашения процедуры определяют, будут аргументы заносится в стек в прямом или обратном порядке. В списке аргумен- тов директивы ARG аргументы нужно указывать в том порядке, в ко- тором они указываются в описании процедуры на языке высокого уровня.

Директива LOCAL в описании процедуры задает в кадре стека переменные, локальные для процедуры. Аргументы имеют внутреннее представление в виде отрицательных смещений от регистра BP или EBP.

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

Нужно помнить о том, что Турбо Ассемблер предполагает, что процедура, использующая аргументы кадра стека, содержит соответс- твующий код инициализации, устанавливающий регистр BP или EBP. (Когда процедура подчиняется любым языковым соглашениям, отличным от NOLANGUAGE, Турбо Ассемблер автоматически генерирует этот код завершения.) Даже если процедура использует языковые соглашения NOLANGUAGE, задавайте аргументы и локальные переменные процедуры с помощью директив ARG и LOCAL. Однако в этом случае код начала (код инициализации) и завершения автоматически не генерируется.



Основные моменты в интерфейсе Турбо Ассемблера и Borland C++


Чтобы скомпоновать вместе модули Borland C++ и Турбо Ассемб- лера, должны быть соблюдены следующие три пункта:

1. В модулях Турбо Ассемблера должны использоваться соглаше- ния об именах, принятые в Borland C++.

2. Borland C++ и Турбо Ассемблер должны совместно использо- вать соответствующие функции и имена переменных в форме, приемлемой для Borland C++.

3. Для комбинирования модулей в выполняемую программу нужно использовать утилиту-компоновщик TLINK.

Здесь ничего не говориться о том, что в действительности де- лают модули Турбо Ассемблера. Пока мы коснемся только основных моментов, обеспечивающих разработку функций Турбо Ассемблера, совместимых с С++.



Остаточная рекурсия для методов объектов: инструкция JMP.METHOD


Турбо Ассемблер обеспечивает инструкцию JMP.METHOD, соот- ветствующую инструкции CALL.METHOD. Она имеет следующий син- таксис:

JMP указатель_экземпляра METHOD [имя_объекта:]имя_метода [USES [сегм_регистр:]регистр_смещения]

Инструкция JMP.METHOD полностью аналогична инструкции CALL.METHOD, за исключением того, что она:

- генерирует вместо инструкции CALL инструкцию JMP;

- генерирует код завершения процедуры для очистки стека пе- ред генерацией инструкции JMP.

Инструкция JMP.METHOD позволяет писать эффективный код остаточной рекурсии (tail recursion). Она предназначена для заме- ны общей ситуации, когда инструкция CALL.METHOD дается для конкретного метода с последующей инструкцией RET.



Открытие определения структуры или объединения


В режиме Ideal для открытия определения данных типа структу- ры или объединения используется следующий синтаксис:

STRUC имя или UNION имя

В режиме MASM то же самое можно сделать с помощью следующего синтаксиса:

имя STRUC или имя UNION

Турбо Ассемблер рассматривает все данные или код между отк- рытым определением структуры и соответствующей директивой ENDS как часть данного типа структуры или объединения.

Турбо Ассемблер интерпретирует имена типов данных структуры или объединения как глобальные, но переопределяемые. В модуле вы можете несколько раз определить структурный тип или тип объедине- ния с одни и тем же именем.



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


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



Out of hash space


(Не хватает памяти под хеш-таблицы)

Каждому имени идентификатора, определяемому в пользователь- ской программе, соответствует один элемент хеш-таблицы. Эта таб- лица рассчитана на 16384 определяемых пользователем имен иденти- фикаторов при условии запуска Турбо Ассемблера с достаточным объ- емом свободной памяти. Если в программе пользователя определено большее количество имен идентификаторов, то нужно указать пара- метр командной строки /КН, для того чтобы обеспечить в хеш-табли- це нужное число элементов для описания этого количества символи- ческих имен.



Out of memory


(Не хватает памяти)

Не хватает свободной памяти для ассемблирования пользова- тельского файла. Попробуйте использовать TASMX.

Если в оперативной памяти имеются какие-либо резидентные в памяти программы, то следует убрать их и повторить ассемблирова- ние файла. Возможно, что потребуется перезагрузить систему, для того чтобы полностью освободить память.

Другой путь состоит в том, чтобы разбить исходный файл на два или более, или переписать части исходного файла таким обра- зом, чтобы его ассемблирование требовало меньше памяти. Для этого в программе следует укоротить имена идентификаторов, уменьшить число комментариев в макрокомандах, уменьшить число ссылок впе- ред.



Out of string space


(Не хватает памяти под строки)

Не хватает оперативной памяти для хранения строк: имен иден- тификаторов, имен файлов, информации для разрешения опережающих ссылок, текстов макрокоманд. Допускается максимум 512К памяти, а ваш модуль превысил этот объем. Попробуйте использовать TASMX.



Параметр /A


Функция: Задает упорядочивание сегментов по алфавиту.

Синтаксис: /A

Примечания: Параметр /A указывает Турбо Ассемблеру, что сег- менты в объектном файле должны быть размещены в алфавитном поряд- ке. Это эквивалентно использование в исходном коде директивы .ALPHA.

Этим параметром обычно приходится пользоваться тогда, когда вы хотите ассемблировать исходный файл, написанный для ранних версий ассемблеров фирм Microsoft или IBM.

Параметр /S изменяет действие данного параметра на обратное, сохраняя используемое по умолчанию последовательное упорядочива- ние сегментов.

Если в исходном файле вы задаете с помощью директивы .SEQ последовательное упорядочивание сегментов, то она отменит дей- ствие параметра /A, задаваемого в командной строке.

Пример:

TASM /A TEST1

Данная командная строка создает объектный файл TEST1.OBJ, сегменты которого упорядочиваются в алфавитном порядке.



Параметр /B


Синтаксис: /B

Примечания: Параметр /B используется в целях совместимости с другими версиями. Он не приводит ни к каким действиям и не оказы- вает влияния на ассемблирование.



Параметр /C


Функция: Разрешает включать в листинг перекрестные ссылки.

Синтаксис: /C

Примечания: Параметр /C разрешает включение в файл листинга информации о перекрестных ссылках. Турбо Ассемблер включает ин- формацию о перекрестных ссылках в таблицу идентификаторов в конце файла листинга. Чтобы получить информацию о перекрестных ссылках, вам нужно также явно задать в командной строке файл листинга или использовать для разрешения формирования файла листинга параметр /L.

Для каждого идентификатора в перекрестных ссылках указывает- ся строка, в которой он определен и все строки, где имеется на него ссылка.

Пример:

TASM /l /c TEST1

Данная команда создает файл листинга, в таблице идентифика- торов которого содержится информация о перекрестных ссылках.



Параметр /D


Функция: Определяет идентификатор.

Синтаксис: /Dидентификатор[=значение или выражение]

Примечания: Параметр /D определяет идентификатор для исход- ного файла, точно также, как если бы он определялся на первой строке исходного файла с помощью директивы =. В командной строке этот параметр можно использовать любое число раз.

Вы можете только определить идентификатор, равный другому идентификатору, или постоянному значению. Справа от знака ра- венства (=) не допускается использовать выражение с операциями. Например, допустимо /DX=9 и /DX=Y, но параметр /DX=Y-4 не допус- кается.

Пример:

TASM /DMAX=10 /DMIN=2 TEST1

В данной командной строке определяются два идентификатора MAX и MIN, на которые могут ссылаться другие операторы в исходном файле TEST1.ASM.



Параметр /E


Функция: Генерирует инструкции эмуляции работы с плавающей точкой.

Синтаксис: /E

Примечания: Параметр /E указывает Турбо Ассемблеру, что нуж- но генерировать инструкции работы с плавающей точкой, которые бу- дут выполняться с помощью программного обеспечения (эмулятора операций с плавающей точкой). Используйте этот параметр, если ваша программа содержит библиотеку эмуляции работы с плавающей точкой, которая эмулирует функции арифметического сопроцессора 80х87.

Обычно этот параметр следует использовать только в том слу- чае, если ваш модуль на Ассемблере является частью программы, на- писанной на языке высокого уровня, в которой используется библио- тека эмуляции работы с плавающей точкой (эмуляцию операций с пла- вающей точкой поддерживают компиляторы Borland C++, Турбо Си, Турбо Паскаль, Турбо Бейсик и Турбо Пролог). Вы не можете просто скомпоновать программу на Ассемблере с библиотекой эмуляции, так как предполагается, что библиотека должна инициализироваться на- чальным кодом компилятора.

Параметр /R изменяет действие данного параметра на обратное, разрешая ассемблирование действительных инструкций с плавающей точкой, которые могут выполняться арифметическим сопроцессором.

Если в исходной файле вы используете директиву NOEMUL, то она отменит действие параметра /E в командной строке.

Параметр командной строки /E оказывает то же действие, что и использование в начале исходного файла директивы EMUL, и эквива- лентно параметру командной строки /JEMUL.

Пример:

TASM /E SEGANT TCC -f TRIG.C SEGANT.OBJ

Первая командная строка ассемблирует модуль в эмулируемыми инструкциями с плавающей точкой. Вторая командная строка компили- рует модуль языка Си с эмуляцией операций с плавающей точкой и затем компонует его с объектным файлом Ассемблера.



Параметр /H или /?


Функция: Выводит на экран дисплея справочную информацию.

Синтаксис: /H или /?

Примечания: Параметр /H указывает Турбо Ассемблеру, что на экран дисплея нужно вывести справочную информацию, описывающую синтаксис командной строки. Эта справочная информация включает в себя список параметров, а также различные задаваемые имена фай- лов. Параметр /? делает то же самое.

Пример:

TASM /h



Параметр /I


Функция: Задает маршрут доступа к включаемому файлу.

Синтаксис: /Iмаршрут

Примечания: Параметр /I указывает Турбо Ассемблеру, где нуж- но искать файлы, включаемые в исходный файл по директиве INCLUDE. В командной строке можно указать несколько параметров /I (их чис- ло ограничено только размерами оперативной памяти).

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

Если вы в качестве части имени файла указываете маршрут, то сначала делается попытка поиска по данному маршруту, а затем Тур- бо Ассемблер выполняет поиск в каталогах, заданных в параметрах командной строки /I (в том порядке, как они указаны в командной строке). Затем он ищет файл по всем каталогам, заданным в пара- метрах /I файла конфигурации.

Если в спецификации имени файла вы не указываете маршрут, то Турбо Ассемблер выполняет сначала поиск в каталогах, заданных в параметрах командной строки /I, затем - в каталогах, заданных в параметрах /I файла конфигурации, и, наконец, в текущем каталоге.

Пример:

TASM /I\INCLUDE /ID:\INCLUDE TEST1

Если исходный файл содержит оператор:

INCLUDE MYMACS.INC

то Турбо Ассемблер сначала ищет файл \INCLUDE\MYMACS.INC, затем D:\INCLUDE\MYMACS.INC. Если он еще не нашел файл, то файл с именем MYMACS.INC ищется в текущем каталоге. Если бы в исходном файле содержался оператор:

INCLUDE INCS\MYMACS.INC

то Турбо Ассемблер сначала искал бы включаемый файл \INCS\MYMACS.INC, затем \INCLUDE\MYMACS.INC, и, наконец D:\INCLUDE\MYMACS.INC.



Параметр /J


Функция: Определяет директиву инициализации Ассемблера.

Синтаксис: /Jдиректива

Примечания: Параметр /J позволяет вам определить директиву, которая будет ассемблироваться перед первой строкой исходного файла. "Директива" может представлять собой любую директиву Турбо Ассемблера, не требующую аргументов, например, .286, IDEAL, %MACS, NOJUMP и т.д. Полное описание директив Турбо Ассемблера содержится в соответствующей главе.

В командной строке вы можете указать более одного параметра /J. При этом они будут обработаны слева направо.

Пример:

TASM /J.286 .JIDEAL TEST1

При этом ассемблируется файл TEST1.ASM с разрешенными инст- рукциями процессора 80286 и разрешением синтаксического анализа выражений в режиме IDEAL.



Параметр /KH


Функция: Задает максимально допустимое число идентификато- ров.

Синтаксис: /KHnидентификаторов

Примечания: Параметр /KH задает максимально допустимое число идентификаторов, которое может содержать программа. Если вы не используете данный параметр, ваша программа может содержать толь- ко до 8192 идентификаторов. Использование этого параметра позво- ляет увеличить число идентификаторов до значения "nидентификато- ров" (это значение не должно превышать 32768).

Используйте данный параметр, если при ассемблировании прог- раммы вы получаете сообщение "Out of hash space" ("Буферное пространство исчерпано").

Данный параметр можно также использовать для уменьшения об- щего числа идентификаторов до значения, меньшего назначенного по умолчанию (8192). Это позволит освободить некоторое количество памяти, что может оказаться полезным, когда вы пытаетесь ассем- блировать программу, а у вас не хватает памяти.

Пример:

TASM /KH10000 BIGFILE

Эта команда сообщает Турбо Ассемблеру, что при ассемблирова- нии файла BIGFILE нужно зарезервировать память для 10000 иденти- фикаторов.



Параметр /L


Функция: Генерирует файл листинга.

Синтаксис: /L

Примечания: Параметр /L указывает, что вы хотите создать файл листинга, даже если вы его не задаете в командной строке явно. Файл листинга имеет то же имя, что и исходный файл, и рас- ширение .LST.

Пример:

TASM /L TEST1

Данная командная строка приводит к созданию файла листинга с именем TEST1.LST.



Параметр /LA


Функция: Показывает в исходной файле код интерфейса с языком высокого уровня.

Синтаксис: /LA

Примечания: Параметр /LA указывает Турбо Ассемблеру, что в файле листинга нужно отразить весь генерируемый код, включая код, который генерируется в результате директивы языка высокого уровня .MODEL.

Пример:

TASM /LA FILE1



Параметр /M


Функция: Устанавливает максимальное число проходов Ассембле- ра.

Синтаксис: /M[число_проходов]

Примечания: Обычно Турбо Ассемблер работает как однопроход- ный Ассемблер. Параметр /m позволяет задать максимальное число проходов, которое Ассемблер выполнит в процессе ассемблирования. TASM автоматически определяет те случаи, когда фактически требуе- мое число проходов меньше заданного. Если максимальное число про- ходов не задано, то по умолчанию оно равно пяти.

Некоторые модули могут содержать конструкции, которые будут правильно ассемблироваться только при двух проходах, либо вы можете захотеть удалить инструкции NOP, добавленные Ассемблером из-за опережающих ссылок. Если множественные проходы не разреше- ны, то для такого модуля будет выдано хотя бы одно предупреждение "Pass-dependent construction encountered" ("Встречена конструк- ция, зависящая от числа проходов"). При заданном параметре /m Турбо Ассемблер сможет ассемблировать такой код, но не сможет его оптимизировать за счет удаления пустых команд NOP, независимо от числа заданных проходов. В этом случае будет выдано предупрежде- ние "Module is pass dependent - compatibility pass was done" ("Модуль зависим от числа проходов - сделан проход для обеспече- ния совместимости").

Пример:

TASM /M2 TEST1

Эта строка заставит Турбо Ассемблер при ассемблировании программы TEST1 выполнить два прохода.



Параметр /ML


Функция: Интерпретирует различие в регистрах букв идентифи- каторов.

Синтаксис: /ML

Примечания: Параметр /ML указывает Турбо Ассемблеру, что во всех идентификаторах нужно различать буквы разного регистра (строчные и прописные). Обычно строчные и прописные буквы рас- сматриваются, как эквивалентные, поэтому имена ABCxyz, ABCXYZ и abcxyz обозначают один и тот же идентификатор. Если вы задаете параметр /ML, то эти три идентификатора будут считаться различны- ми. Тем не менее, даже после задания параметра /ML ключевые слова Ассемблера можно вводить как в верхнем, так и в нижнем регистре. Ключевые слова представляют собой идентификаторы, встроенные в Ассемблер, которые имеют специальное значение (мнемоники инструк- ций, директивы и операторы).

Пример:

TASM /ML TEST1

где TEST1.ASM содержит следующие операторы:

ABC DW 1 abc DW 0 ; это не дублирующий идентификатор Mov Ax,[Bp] ; в ключевых словах допускается использо- ; вать разный регистр

Для модулей Паскаля параметр-переключатель /ml при использо- вании его совместно с параметром /mx имеет специальное значение. Подробнее об этом рассказывается в описании параметра /mx.



Параметр /MU


Функция: Преобразует идентификаторы в верхний регистр.

Синтаксис: /MU

Примечания: Параметр /MU указывает Ассемблеру, что нужно иг- норировать регистр во всех идентификаторах. По умолчанию в Турбо Ассемблере задано, что в идентификаторах все буквы нижнего ре- гистра должны преобразовываться в верхний регистр (если это не отменено с помощью директивы /ML).

Пример:

TASM /MU TEST1

При этом все идентификаторы будут преобразованы в верхний регистр (что задано по умолчанию):

EXTRN myfunc:NEAR call myfunc ; не важно, как была ; определена функция: ; MYFUNC, Myfunс,.



Параметр /MV#


Функция: Устанавливает максимальную длину имен идентификато- ров.

Синтаксис: /MV#

Примечания: Параметр /mv# устанавливает максимальную длину распознаваемых TASM имен идентификаторов. Например, если задать /mv12, то TASM будет рассматривать имена ABCDEFGHIJKLL. и ABCDEFGHIJKL как одно и то же имя ABCDEFGHIJKLL. Заметим, что ми- нимальное значение, которое вы здесь можете задавать, равно 12.



Параметр /MX


Функция: Задает различимость на на строчные и прописные бук- вы (верхний и нижний регистр) во внешних и общедоступных иденти- фикаторах.

Синтаксис: /MX

Примечания: Параметр /MX сообщает Турбо Ассемблеру, что раз- личать регистр букв нужно только во внешних (External) и общедос- тупных (Public) идентификаторах. Все другие идентификаторы в ис- ходном файле будут интерпретироваться, как набранные в верхнем регистре.

Использовать данную директиву следует при вызове процедур из других модулей, которые ассемблировались или компилировались так, что сохранилось различие в строчных и прописных буквах (например, модулей, которые компилировались в Borland C++).

Пример:

TASM /MX TEST1

где TEST1 содержит следующие исходные строки:

EXTRN Cfunc:NEAR myproc PROC NEAR call Cfunc . . .

Замечание: Использование вместе параметров /mx и /ml для идентификаторов, описанных в Паскале, имеет специальное значение. Если вы используете эти параметры вместе, иденти- фикаторы будут доступны компоновщику, как символы в верхнем регистре.



Параметр /N


Функция: Подавляет в файле листинга таблицу идентификаторов.

Синтаксис: /N

Примечания: Параметр /N показывает, что в конце файла лис- тинга вы не хотите использовать обычную таблицу идентификаторов. Обычно в конце файла листинга содержится полная таблица идентифи- каторов, где показаны все идентификаторы, их имена и значения.

Вы должны задать файл листинга либо явным образом (в коман- дной строке), либо с помощью параметра /L. В противном случае па- раметр /N не приведет ни к каким действиям.

Пример:

TASM /L /N TEST1

При этом генерируется файл листинга, где показывается только генерируемый код без значений ваших идентификаторов.



Параметр /O


Функция: Генерирует оверлейный код.

Синтаксис: /O

Примечания: Задание параметра командной строки /o вызывает генерацию оверлейно-совместимых адресов фиксации. При ее исполь- зовании ссылки 386 к сегментам USE32 не должны выполняться, так как это может привести к неправильной работе компоновщика.



Параметр /OP


Функция: Генерирует оверлейный код для компоновщика Phar Lap.

Синтаксис: /OP

Примечание: Задание параметра командной строки /o вызывает генерацию оверлейно-совместимых адресов фиксации для компоновщика Phar Lap. Полученный объектный файл не будет совместимым с компо- новщиком фирмы Borland TLINK.



Параметр /P


Функция: Проверяет наличие "кода с побочными эффектами" в защищенном режиме.

Синтаксис: /P

Примечания: Параметр /P определяет, что вы хотите получить предупреждение при любой инструкции, генерирующей в защищенном режиме код с возможным "побочным эффектом" (impure code). Инс- трукции, перемещающие данные в память путем переопределения ре- гистра CS: в защищенном режиме рассматриваются, как некорректные, поскольку они в защищенном режиме могут работать неверно, если не принять специальных мер.

Этот параметр нужно использовать только в том случае, если вы пишете программу, выполняемую на процессоре 80286, i486 или 80386 в защищенном режиме.

Пример:

TASM /P TEST1

где TEST1 содержит следующие операторы:

.286P CODE SEGMENT temp DW ? mov CS:temp,0 ; в защищенном режиме может выпол- ; няться некорректно



Параметр /Q


Функция: Подавляет вывод записей объектного файла (.OBJ), ненужных для компоновки.

Синтаксис: /Q

Примечания: Параметр /q удаляет из результирующего объектно- го файла записи об авторских правах и записи зависимости файла, уменьшая тем самым его размер. Этот параметр не следует задавать при использовании программы MAKE или аналогичной программы, рабо- та которой основывается на записях зависимостей.



Параметр /R


Функция: Генерирует реальные инструкции с плавающей точкой.

Синтаксис: /R

Примечания: Параметр /R указывает Турбо Ассемблеру, что нуж- но генерировать реальные инструкции с плавающей точкой (вместо генерации эмулируемых инструкций с плавающей точкой). Используйте этот параметр, если вы хотите выполнять свою программу на маши- нах, оснащенных арифметическим сопроцессором 80х87.

Действие данного параметр изменяет на обратное параметр /E (при этом генерируются эмулируемые инструкции с плавающей точ- кой).

Если в исходном файле вы используете директиву EMUL, то она отменит действие инструкции /R, указанной в командной строке.

Параметр командной строки /R имеет тот же эффект, что и ис- пользование в начале исходного файле директивы NOEMUL и совпадает с действием параметра командной строки /JNOEMUL.

Пример:

TASM /R SEGANT TPC /$N+ /$E- TRIG.PAS

Первая команда ассемблирует модуль с реальными инструкциями с плавающей точкой. Вторая командная строка компилирует исходный модуль Паскаля с реальными инструкциями с плавающей точкой, кото- рый компонуется с объектным файлом Ассемблера.



Параметр /S


Функция: Задает последовательное упорядочивание сегментов.

Синтаксис: /S

Примечания: Параметр /S указывает Турбо Ассемблеру, что сег- менты в объектном файле нужно разместить в том порядке, в котором Турбо Ассемблер обнаруживает их в исходном коде. По умолчанию Турбо Ассемблер использует именно такое упорядочивание сегментов, если вы не изменили его с помощью параметра /A в командной строке или в файле конфигурации.

Если с помощью директивы .ALPHA в исходном коде вы задали упорядочивание сегментов в алфавитном порядке, то эта директива отменит параметр /S, задаваемый в командной строке.

Пример:

TASM /S TEST1

По данной команде создается объектный файл (TEST1.OBJ), сег- менты которого упорядочены в том порядке, как они содержатся в исходном файле.



Параметр /T


Функция: Подавляет вывод сообщений при условном ассемблиро- вании.

Синтаксис: /T

Примечания: Параметр /T подавляет всю выводимую Турбо Ассем- блером на экран информацию, кроме предупреждений и сообщений об ошибках, возникающих в результате ассемблирования.

Вы можете использовать данный параметр при ассемблировании нескольких модулей, когда на экран желательно выводить только со- общения об ошибках.

Пример:

TASM /T TEST1



Параметр /V


Синтаксис: /V

Примечания: Параметр /V используется в целях совместимости. Он не приводит ни к каким действиям и не оказывает влияния на ас- семблирование.



Параметр /W


Функция: Управляет генерацией предупреждающих сообщений.

Синтаксис: /W W-[класс_предупреждений] W+[класс_предупреждений]

Примечания: Параметр /W управляет выводом Турбо Ассемблером предупреждающих сообщений.

Если вы просто укажете параметр /W, то будут выводиться "слабые" предупреждения. Такие предупреждения показывают, что вы можете несколько улучшить эффективность вашей программы.

Если вы зададите параметр /W- без класса предупреждений, то все предупреждения запрещаются. Если за параметром указывается класс предупреждений, то запрещаются только эти предупреждения. Каждое предупреждающее сообщение имеет идентификатор из трех букв:

ALN - выравнивание сегмента в памяти. ASS - подразумевается использование 16-разрядного сегмента; BRK - требуются квадратные скобки; ICG - неэффективная генерация кода; LCO - переполнение счетчика адреса; OPI - открытый блок условия IF; OPP - открытая процедура; OPS - открытый сегмент; OVF - арифметическое переполнение; PDC - конструкция, зависящая от прохода; PQK - предполагается константа для предупреждения [const]. PRO - запись в память в защищенном режиме требует переопределения регистра CS. RES - предупреждение о резервируемом слове. TPI - предупреждение о недопустимости в Турбо Паскале.

Если вы указываете параметр /W+ без класса предупреждения, то все предупреждения будут разрешены. Если вы задаете параметр /W+ с классом предупреждений из предыдущего списка, то будут раз- решены только эти предупреждения.

По умолчанию Турбо Ассемблер сначала начинает ассемблирова- ние исходного файла с разрешением всех предупреждений, кроме пре- дупреждений о неэффективности кода (ICG) и предупреждений и запи- си в память в защищенном режиме (PRO).

Для управления выводом определенных сообщений на заданном участке программы в файле с исходным кодом вы можете использовать директивы WARN или NOWARN. Более подробно об этих директивах рас- сказывается в главе, посвященной директивам.

Пример:

TASM /W TEST1

Следующий оператор в TEST1.ASM выведет предупреждающее сооб- щение, которое не появится на экране, если не указан параметр /W:

mov bx,ABC ; предупреждение о неэффективности кода ABC = 1

При задании командной строки:

TASM /W-OVF TEST2

если TEST2.ASM содержит:

DW 1000h = 20h

предупреждения генерироваться не будут.



Параметр /X


Функция: Включает в листинг блоки условного ассемблирования.

Синтаксис: /X

Примечания: Если при вычислении блоков IF, IFNDEF, IFDEF и т.д. получается значение FALSE, то параметр /X приводит к тому, что операторы, содержащиеся внутри условного блока, будут включе- ны в листинг ассемблирования. По данной директиве в листинг будут также включены сами директивы условного ассемблирования (обычно они в листинг не включаются).

Вы должны в командной строке или с помощью параметра /L за- дать также необходимость генерации файла листинга, иначе параметр /X действовать не будет.

Для переопределения параметра /x вы можете использовать ди- рективы .LFCOND, .SFCOND и .TFCOND.

Пример:

TASM /X TEST1



Параметр /Z


Функция: Выводит на экран наряду с сообщениями об ошибке со- ответствующие строки исходного текста.

Синтаксис: /Z

Примечания: Параметр /Z указывает Ассемблеру, что при гене- рации сообщения об ошибке на экран нужно вывести соответствующую строку исходного файла (где эта ошибка возникла). Вызвавшая ошиб- ку строка выводится перед сообщением об ошибке. При запрещении данного параметра Турбо Ассемблер просто выводит сообщение, опи- сывающее ошибку.

Пример:

TASM /Z TEST1



Параметр /ZD


Функция: Разрешает включение в объектные файлы информации о номерах строк.

Синтаксис: /ZD

Примечания: Параметр /ZD приводит к тому, что Турбо Ассемб- лер будет помещать в объектные файлы информацию о номерах строк. Это позволяет автономному отладчику фирмы Borland (Турбо отладчи- ку) выводить на экран текущее место в исходном коде, но не позво- ляет ему осуществлять доступ к элементам данных.

Если при попытке отладки программы с помощью Турбо отладчика вам не хватит памяти, вы можете использовать параметр /ZD для од- них модулей и параметр /ZI - для других.

Пример:

TASM /ZD TEST1



Параметр /ZI


Функция: Разрешает включение в объектный файл информации для отладки.

Синтаксис: /ZI

Примечания: Параметр /ZI указывает Турбо Ассемблеру, что в объектный файл нужно вывести полную информацию для отладки. Эта информация включает в себя записи о номерах строк (для синхрони- зации вывода на экран исходного текста) и информацию о типах дан- ных, позволяющую модифицировать и проверить данные программы.

Параметр /ZI позволяет вам использовать все средства Турбо отладчика для прохождения программы и проверки и изменения эле- ментов данных. Вы можете использовать параметр /ZI для всех моду- лей программы или только для тех, отладка которых вас интересует. Поскольку параметр /ZI добавляет информацию в объектные и выпол- няемые файлы, может оказаться нежелательным его использование для всех модулей программы при выполнении программы Турбо отладчиком (например, может возникать ситуация нехватки памяти).

Пример:

TASM /ZI TEST1



Параметр /ZN


Функция: Запрещает включение в объектный файл информацию для отладки.

Синтаксис: /ZN

Примечания: Параметр /zn указывает Турбо Ассемблеру, что ин- формацию для отладки в объектный файл выводить не нужно. Его по- лезно использовать для переопределения параметра /zi в файле кон- фигурации.



Параметры изменения формата листинга


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

Директива PAGE задает высоту и ширину страницы файла листин- га и начинает новую страницу. Директива PAGE работает только в режиме MASM. Она имеет следующий синтаксис:

PAGE [число_строк] [,число_столбцов] PAGE +

где "число_строк" задает число строк, выводимых на странице лис- тинга. Поле "число_столбцов" может принимать значения от 59 до 255 и задает число столбцов на странице. Если вы опустите один из этих параметров, то текущая установка данного параметра остается без изменений. Чтобы изменить только число столбцов, укажите пе- ред этим параметром запятую, в противном случае вы измените число строк.

Если вы укажете после директивы PAGE символ плюса (+), то начинается новая страница, номер раздела увеличивается, а номер страницы снова начинается с 1. Если вы используете директиву PAGE без аргументов, то листинг возобновляется с новой страницы без изменения номера раздела.

Директива %PAGESIZE работает также, как директива PAGE, но она не начинает новую страницу и работает как в режиме Ideal, так и в режиме MASM. Директива %PAGESIZE имеет следующий синтаксис:

%PAGESIZE [число_строк] [,число_столбцов]

Директива %NEWPAGE работает как директива PAGE без аргумен- тов. Строки исходного текста после директивы %NEWPAGE будут начи- наться в файле листинга с новой страницы. Директива %PAGESIZE имеет следующий синтаксис:

%NEWPAGE

Директива %BIN устанавливает длину поля объектного кода в файле листинга. Директива %BIN имеет синтаксис:

%BIN размер

где "размер" является константой. Если вы не используете эту ди- рективу, то поле кода операции занимает в файле листинга до 20 позиций, например:

%BIN 12 ; устанавливает 12 позиций в листинге

Директива %DEPTH устанавливает размер поля глубины в файле листинга. Эта директива имеет следующий синтаксис:

%DEPTH размер

где "размер" задает, скольку столбцов нужно зарезервировать в по- ле глубины файла листинга. Это поле указывает уровень вложенности включаемых файлов (INCLUDE) и макрорасширений. Если в качестве размера вы укажете 0, то это поле в файле листинга не выводится. Обычно не требуется задавать "размер" > 2, поскольку при этом без усечения будет выводиться глубина до 99. По умолчанию это поле имеет значение 1.


Директива % LINENUM задает размер поля номеров строк в файле листинга. Данная директива имеет следующий синтаксис:
%LINENUM размер
Директива %LINENUM позволяет вам задать, сколько позиций должны занимать номера строк в файле листинга. В поле "размер" должна указываться константа. Если вы хотите минимизировать шири- ну листинга, то можете уменьшить размер поля номеров строк. Кроме того, если ваш файл содержит более 9999 строк, то размер этого поля может потребоваться увеличить, чтобы номера не усекались. По умолчанию номер строки занимает 4 столбца.
Директива %TRUNC усекает слишком длинные поля листинга. Она имеет следующий синтаксис:
%TRUNC
Поле объектного кода в файле листинга имеет достаточно мес- та для вывода кода, генерируемого большинством инструкций или ди- рективами выделения данных. Размер этого поля можно настроить с помощью директивы %BIN. Если отдельная строка исходного кода ге- нерирует больше кода, чем можно вывести на одной строке, то оста- ток автоматически усекается и таким образом будет невидимым. Если вы хотите видеть весь генерируемый код, то используйте директиву %NOTRUNC (слишком длинная строка при этом будет переноситься на следующую). В противном случае используйте директиву %TRUNC. Вы можете использовать эти инструкции для переключения режима усече- ния.
Директива %NOTRUNC имеет следующий синтаксис:
%NOTRUNC
Директива %PCNT задает размер поля "сегмент:смещение" в фай- ле листинга. Она имеет следующий синтаксис:
%PCNT размер
где "размер" - это число столбцов, которые вы хотите зарезервиро- вать для смещения в текущем ассемблируемом сегменте. Турбо Ас- семблер устанавливает размер, равный 4, для обычных 16-битовых сегментов и 8 для 32-битовых сегментов процессора 80386. Директи- ва %PCNT позволяет переопределить эти используемые по умолчанию значения.
Директива TITLE, которую вы можете использовать только в ре- жиме MASM, задает заголовок файла листинга. Эта директива имеет следующий синтаксис:
TITLE текст


Заголовок "текст" будет выводиться в верхней части каждой страницы после имени исходного файла и перед заголовком, заданным по директиве SUBTTL. Директиву TITLE можно использовать в прог- рамме только один раз.
Директива %TITLE работает также, как директива TITLE, но вы можете использовать ее как в режиме MASM, так и в режиме Ideal. Эта директива имеет следующий синтаксис:
%TITLE "текст"
Директива SUBTTL работает только в режиме MASM и задает под- заголовок файла листинга. Она имеет следующий синтаксис:
SUBTTL текст
Подзаголовок выводится в верхней части каждой страницы после имени исходного файла и после заголовка, заданного директивой TITLE.
Директиву SUBTTL можно указывать в программе столько раз, сколько требуется. Каждая директива изменяет подзаголовок, кото- рый будет выводиться на следующей странице листинга.
Директива %SUBTTL работает аналогично директиве SUBTTL, но ее можно указывать как в режиме Ideal, так и в режиме MASM. Эта директива имеет синтаксис:
%SUBTTL "текст"
Директива %TABSIZE задает позицию табуляции в файле листин- га. Данная директива имеет следующий синтаксис:
%TABSIZE размер
где "размер" - это число столбцов между двумя позициями табуляции в файле листинга. По умолчанию это 8 столбцов.
Для задания длины поля исходного текста в файле листинга можно использовать директиву %TEXT, которая имеет синтаксис:
%TEXT размер
где "размер" - это число столбцов, используемых для вывода в фай- ле листинга исходных строк. Если размер исходной строки превышает длину этого поля, то оно будет либо усекаться, либо переноситься на следующую строку, в зависимости от использования директивы %TRUNC или %NOTRUNC.
Чтобы сохранить все параметры управления листингом в 16-уровневом стеке, можно использовать директиву %PUSHCTL. Она сохраняет только те параметры управления листингом, которые можно разрешить или запретить (%INCL, %NOINCL и т.д.). Размеры полей листинга не сохраняются. Данная директива особенно полезна в мак- рокомандах, когда вы можете вызывать специальные режимы листинга, которые отменяются при завершении макрорасширения.
Директива %PUSHCTL имеет синтаксис:
%PUSHCTL
Директива %POPCTL восстанавливает из стека параметры управ- ления листингом и имеет следующий синтаксис:
%POPCTL
Эта директива восстанавливает параметры управления листингом в те значения, которые они имели перед последней директивой %PUSHCTL. Значения размеров полей листинга (%DEPTH, %PCNT и т.д.) не восстанавливаются.
Назад | Содержание | Вперед

Параметры командной строки


Необязательные параметры командной строки позволяют вам уп- равлять поведением Ассемблера и тем, какую информацию он выводит на экран, в листинг и объектный файл. В Турбо Ассемблере предус- мотрены некоторые параметры, которые не выполняют никаких дей- ствий, а используются только для совместимости текущей версии TASM с предыдущими версиями MASM (макроассемблер фирмы Microsoft):

 1  0/b Задает размер буфера  1  0/v Выводит на экран дополнительную статистику

Вы можете задавать параметры, представляющие собой любую комбинацию букв в верхнем и нижнем регистре. Кроме того, парамет- ры можно задавать в любом порядке (кроме параметров /I и /J), они будут при этом обрабатываться последовательно. При использовании параметра /d нужно быть внимательным: идентификаторы надо опреде- лить до того, как они будут использованы в последующих параметрах /d.

Примечание: С помощью директив, указанных в исходном коде, вы можете отменить эквивалентные им параметры Ассемб- лера.

На Рис. 2.1 (см. выше) приведен полный список параметров Турбо Ассемблера. Далее эти параметры описаны подробно.



Параметры-переменные


Все параметры-переменные (var) передаются точно также: как указатель дальнего типа на их действительные адреса в памяти.



Параметры-значения


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