Перечислимые типы данных представляют набор значений, кото- рые можно сохранять в определенном числе бит. Максимальное запи- санное значение определяет фактически необходимое число бит.
Приведем пример синтаксиса режима 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-разрядная модель).
Для определения простых текстовых макрокоманд можно исполь- зовать директиву 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++ и Турбо Ассемб- лера, должны быть соблюдены следующие три пункта:
1. В модулях Турбо Ассемблера должны использоваться соглаше- ния об именах, принятые в Borland C++.
2. Borland C++ и Турбо Ассемблер должны совместно использо- вать соответствующие функции и имена переменных в форме, приемлемой для Borland C++.
3. Для комбинирования модулей в выполняемую программу нужно использовать утилиту-компоновщик TLINK.
Здесь ничего не говориться о том, что в действительности де- лают модули Турбо Ассемблера. Пока мы коснемся только основных моментов, обеспечивающих разработку функций Турбо Ассемблера, совместимых с С++.
Турбо Ассемблер обеспечивает инструкцию 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. Если вы знакомы с MASM, то можете поэкспе- риментировать с отдельными средствами, преобразуя небольшие части имеющихся программ в режим Ideal. Более подробно об отличиях ре- жимов рассказывается в Главе 5 "Использование выражений и значе- ний идентификаторов".
(Не хватает памяти под хеш-таблицы)
Каждому имени идентификатора, определяемому в пользователь- ской программе, соответствует один элемент хеш-таблицы. Эта таб- лица рассчитана на 16384 определяемых пользователем имен иденти- фикаторов при условии запуска Турбо Ассемблера с достаточным объ- емом свободной памяти. Если в программе пользователя определено большее количество имен идентификаторов, то нужно указать пара- метр командной строки /КН, для того чтобы обеспечить в хеш-табли- це нужное число элементов для описания этого количества символи- ческих имен.
(Не хватает памяти)
Не хватает свободной памяти для ассемблирования пользова- тельского файла. Попробуйте использовать TASMX.
Если в оперативной памяти имеются какие-либо резидентные в памяти программы, то следует убрать их и повторить ассемблирова- ние файла. Возможно, что потребуется перезагрузить систему, для того чтобы полностью освободить память.
Другой путь состоит в том, чтобы разбить исходный файл на два или более, или переписать части исходного файла таким обра- зом, чтобы его ассемблирование требовало меньше памяти. Для этого в программе следует укоротить имена идентификаторов, уменьшить число комментариев в макрокомандах, уменьшить число ссылок впе- ред.
(Не хватает памяти под строки)
Не хватает оперативной памяти для хранения строк: имен иден- тификаторов, имен файлов, информации для разрешения опережающих ссылок, текстов макрокоманд. Допускается максимум 512К памяти, а ваш модуль превысил этот объем. Попробуйте использовать TASMX.
Функция: Задает упорядочивание сегментов по алфавиту.
Синтаксис: /A
Примечания: Параметр /A указывает Турбо Ассемблеру, что сег- менты в объектном файле должны быть размещены в алфавитном поряд- ке. Это эквивалентно использование в исходном коде директивы .ALPHA.
Этим параметром обычно приходится пользоваться тогда, когда вы хотите ассемблировать исходный файл, написанный для ранних версий ассемблеров фирм Microsoft или IBM.
Параметр /S изменяет действие данного параметра на обратное, сохраняя используемое по умолчанию последовательное упорядочива- ние сегментов.
Если в исходном файле вы задаете с помощью директивы .SEQ последовательное упорядочивание сегментов, то она отменит дей- ствие параметра /A, задаваемого в командной строке.
Пример:
TASM /A TEST1
Данная командная строка создает объектный файл TEST1.OBJ, сегменты которого упорядочиваются в алфавитном порядке.
Синтаксис: /B
Примечания: Параметр /B используется в целях совместимости с другими версиями. Он не приводит ни к каким действиям и не оказы- вает влияния на ассемблирование.
Функция: Разрешает включать в листинг перекрестные ссылки.
Синтаксис: /C
Примечания: Параметр /C разрешает включение в файл листинга информации о перекрестных ссылках. Турбо Ассемблер включает ин- формацию о перекрестных ссылках в таблицу идентификаторов в конце файла листинга. Чтобы получить информацию о перекрестных ссылках, вам нужно также явно задать в командной строке файл листинга или использовать для разрешения формирования файла листинга параметр /L.
Для каждого идентификатора в перекрестных ссылках указывает- ся строка, в которой он определен и все строки, где имеется на него ссылка.
Пример:
TASM /l /c TEST1
Данная команда создает файл листинга, в таблице идентифика- торов которого содержится информация о перекрестных ссылках.
Функция: Определяет идентификатор.
Синтаксис: /Dидентификатор[=значение или выражение]
Примечания: Параметр /D определяет идентификатор для исход- ного файла, точно также, как если бы он определялся на первой строке исходного файла с помощью директивы =. В командной строке этот параметр можно использовать любое число раз.
Вы можете только определить идентификатор, равный другому идентификатору, или постоянному значению. Справа от знака ра- венства (=) не допускается использовать выражение с операциями. Например, допустимо /DX=9 и /DX=Y, но параметр /DX=Y-4 не допус- кается.
Пример:
TASM /DMAX=10 /DMIN=2 TEST1
В данной командной строке определяются два идентификатора MAX и MIN, на которые могут ссылаться другие операторы в исходном файле TEST1.ASM.
Функция: Генерирует инструкции эмуляции работы с плавающей точкой.
Синтаксис: /E
Примечания: Параметр /E указывает Турбо Ассемблеру, что нуж- но генерировать инструкции работы с плавающей точкой, которые бу- дут выполняться с помощью программного обеспечения (эмулятора операций с плавающей точкой). Используйте этот параметр, если ваша программа содержит библиотеку эмуляции работы с плавающей точкой, которая эмулирует функции арифметического сопроцессора 80х87.
Обычно этот параметр следует использовать только в том слу- чае, если ваш модуль на Ассемблере является частью программы, на- писанной на языке высокого уровня, в которой используется библио- тека эмуляции работы с плавающей точкой (эмуляцию операций с пла- вающей точкой поддерживают компиляторы Borland C++, Турбо Си, Турбо Паскаль, Турбо Бейсик и Турбо Пролог). Вы не можете просто скомпоновать программу на Ассемблере с библиотекой эмуляции, так как предполагается, что библиотека должна инициализироваться на- чальным кодом компилятора.
Параметр /R изменяет действие данного параметра на обратное, разрешая ассемблирование действительных инструкций с плавающей точкой, которые могут выполняться арифметическим сопроцессором.
Если в исходной файле вы используете директиву NOEMUL, то она отменит действие параметра /E в командной строке.
Параметр командной строки /E оказывает то же действие, что и использование в начале исходного файла директивы EMUL, и эквива- лентно параметру командной строки /JEMUL.
Пример:
TASM /E SEGANT TCC -f TRIG.C SEGANT.OBJ
Первая командная строка ассемблирует модуль в эмулируемыми инструкциями с плавающей точкой. Вторая командная строка компили- рует модуль языка Си с эмуляцией операций с плавающей точкой и затем компонует его с объектным файлом Ассемблера.
Функция: Выводит на экран дисплея справочную информацию.
Синтаксис: /H или /?
Примечания: Параметр /H указывает Турбо Ассемблеру, что на экран дисплея нужно вывести справочную информацию, описывающую синтаксис командной строки. Эта справочная информация включает в себя список параметров, а также различные задаваемые имена фай- лов. Параметр /? делает то же самое.
Пример:
TASM /h
Функция: Задает маршрут доступа к включаемому файлу.
Синтаксис: /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 позволяет вам определить директиву, которая будет ассемблироваться перед первой строкой исходного файла. "Директива" может представлять собой любую директиву Турбо Ассемблера, не требующую аргументов, например, .286, IDEAL, %MACS, NOJUMP и т.д. Полное описание директив Турбо Ассемблера содержится в соответствующей главе.
В командной строке вы можете указать более одного параметра /J. При этом они будут обработаны слева направо.
Пример:
TASM /J.286 .JIDEAL TEST1
При этом ассемблируется файл TEST1.ASM с разрешенными инст- рукциями процессора 80286 и разрешением синтаксического анализа выражений в режиме IDEAL.
Функция: Задает максимально допустимое число идентификато- ров.
Синтаксис: /KHnидентификаторов
Примечания: Параметр /KH задает максимально допустимое число идентификаторов, которое может содержать программа. Если вы не используете данный параметр, ваша программа может содержать толь- ко до 8192 идентификаторов. Использование этого параметра позво- ляет увеличить число идентификаторов до значения "nидентификато- ров" (это значение не должно превышать 32768).
Используйте данный параметр, если при ассемблировании прог- раммы вы получаете сообщение "Out of hash space" ("Буферное пространство исчерпано").
Данный параметр можно также использовать для уменьшения об- щего числа идентификаторов до значения, меньшего назначенного по умолчанию (8192). Это позволит освободить некоторое количество памяти, что может оказаться полезным, когда вы пытаетесь ассем- блировать программу, а у вас не хватает памяти.
Пример:
TASM /KH10000 BIGFILE
Эта команда сообщает Турбо Ассемблеру, что при ассемблирова- нии файла BIGFILE нужно зарезервировать память для 10000 иденти- фикаторов.
Функция: Генерирует файл листинга.
Синтаксис: /L
Примечания: Параметр /L указывает, что вы хотите создать файл листинга, даже если вы его не задаете в командной строке явно. Файл листинга имеет то же имя, что и исходный файл, и рас- ширение .LST.
Пример:
TASM /L TEST1
Данная командная строка приводит к созданию файла листинга с именем TEST1.LST.
Функция: Показывает в исходной файле код интерфейса с языком высокого уровня.
Синтаксис: /LA
Примечания: Параметр /LA указывает Турбо Ассемблеру, что в файле листинга нужно отразить весь генерируемый код, включая код, который генерируется в результате директивы языка высокого уровня .MODEL.
Пример:
TASM /LA FILE1
Функция: Устанавливает максимальное число проходов Ассембле- ра.
Синтаксис: /M[число_проходов]
Примечания: Обычно Турбо Ассемблер работает как однопроход- ный Ассемблер. Параметр /m позволяет задать максимальное число проходов, которое Ассемблер выполнит в процессе ассемблирования. TASM автоматически определяет те случаи, когда фактически требуе- мое число проходов меньше заданного. Если максимальное число про- ходов не задано, то по умолчанию оно равно пяти.
Некоторые модули могут содержать конструкции, которые будут правильно ассемблироваться только при двух проходах, либо вы можете захотеть удалить инструкции NOP, добавленные Ассемблером из-за опережающих ссылок. Если множественные проходы не разреше- ны, то для такого модуля будет выдано хотя бы одно предупреждение "Pass-dependent construction encountered" ("Встречена конструк- ция, зависящая от числа проходов"). При заданном параметре /m Турбо Ассемблер сможет ассемблировать такой код, но не сможет его оптимизировать за счет удаления пустых команд NOP, независимо от числа заданных проходов. В этом случае будет выдано предупрежде- ние "Module is pass dependent - compatibility pass was done" ("Модуль зависим от числа проходов - сделан проход для обеспече- ния совместимости").
Пример:
TASM /M2 TEST1
Эта строка заставит Турбо Ассемблер при ассемблировании программы TEST1 выполнить два прохода.
Функция: Интерпретирует различие в регистрах букв идентифи- каторов.
Синтаксис: /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 указывает Ассемблеру, что нужно иг- норировать регистр во всех идентификаторах. По умолчанию в Турбо Ассемблере задано, что в идентификаторах все буквы нижнего ре- гистра должны преобразовываться в верхний регистр (если это не отменено с помощью директивы /ML).
Пример:
TASM /MU TEST1
При этом все идентификаторы будут преобразованы в верхний регистр (что задано по умолчанию):
EXTRN myfunc:NEAR call myfunc ; не важно, как была ; определена функция: ; MYFUNC, Myfunс,.
Функция: Устанавливает максимальную длину имен идентификато- ров.
Синтаксис: /MV#
Примечания: Параметр /mv# устанавливает максимальную длину распознаваемых TASM имен идентификаторов. Например, если задать /mv12, то TASM будет рассматривать имена ABCDEFGHIJKLL. и ABCDEFGHIJKL как одно и то же имя ABCDEFGHIJKLL. Заметим, что ми- нимальное значение, которое вы здесь можете задавать, равно 12.
Функция: Задает различимость на на строчные и прописные бук- вы (верхний и нижний регистр) во внешних и общедоступных иденти- фикаторах.
Синтаксис: /MX
Примечания: Параметр /MX сообщает Турбо Ассемблеру, что раз- личать регистр букв нужно только во внешних (External) и общедос- тупных (Public) идентификаторах. Все другие идентификаторы в ис- ходном файле будут интерпретироваться, как набранные в верхнем регистре.
Использовать данную директиву следует при вызове процедур из других модулей, которые ассемблировались или компилировались так, что сохранилось различие в строчных и прописных буквах (например, модулей, которые компилировались в Borland C++).
Пример:
TASM /MX TEST1
где TEST1 содержит следующие исходные строки:
EXTRN Cfunc:NEAR myproc PROC NEAR call Cfunc . . .
Замечание: Использование вместе параметров /mx и /ml для идентификаторов, описанных в Паскале, имеет специальное значение. Если вы используете эти параметры вместе, иденти- фикаторы будут доступны компоновщику, как символы в верхнем регистре.
Функция: Подавляет в файле листинга таблицу идентификаторов.
Синтаксис: /N
Примечания: Параметр /N показывает, что в конце файла лис- тинга вы не хотите использовать обычную таблицу идентификаторов. Обычно в конце файла листинга содержится полная таблица идентифи- каторов, где показаны все идентификаторы, их имена и значения.
Вы должны задать файл листинга либо явным образом (в коман- дной строке), либо с помощью параметра /L. В противном случае па- раметр /N не приведет ни к каким действиям.
Пример:
TASM /L /N TEST1
При этом генерируется файл листинга, где показывается только генерируемый код без значений ваших идентификаторов.
Функция: Генерирует оверлейный код.
Синтаксис: /O
Примечания: Задание параметра командной строки /o вызывает генерацию оверлейно-совместимых адресов фиксации. При ее исполь- зовании ссылки 386 к сегментам USE32 не должны выполняться, так как это может привести к неправильной работе компоновщика.
Функция: Генерирует оверлейный код для компоновщика Phar Lap.
Синтаксис: /OP
Примечание: Задание параметра командной строки /o вызывает генерацию оверлейно-совместимых адресов фиксации для компоновщика Phar Lap. Полученный объектный файл не будет совместимым с компо- новщиком фирмы Borland TLINK.
Функция: Проверяет наличие "кода с побочными эффектами" в защищенном режиме.
Синтаксис: /P
Примечания: Параметр /P определяет, что вы хотите получить предупреждение при любой инструкции, генерирующей в защищенном режиме код с возможным "побочным эффектом" (impure code). Инс- трукции, перемещающие данные в память путем переопределения ре- гистра CS: в защищенном режиме рассматриваются, как некорректные, поскольку они в защищенном режиме могут работать неверно, если не принять специальных мер.
Этот параметр нужно использовать только в том случае, если вы пишете программу, выполняемую на процессоре 80286, i486 или 80386 в защищенном режиме.
Пример:
TASM /P TEST1
где TEST1 содержит следующие операторы:
.286P CODE SEGMENT temp DW ? mov CS:temp,0 ; в защищенном режиме может выпол- ; няться некорректно
Функция: Подавляет вывод записей объектного файла (.OBJ), ненужных для компоновки.
Синтаксис: /Q
Примечания: Параметр /q удаляет из результирующего объектно- го файла записи об авторских правах и записи зависимости файла, уменьшая тем самым его размер. Этот параметр не следует задавать при использовании программы MAKE или аналогичной программы, рабо- та которой основывается на записях зависимостей.
Функция: Генерирует реальные инструкции с плавающей точкой.
Синтаксис: /R
Примечания: Параметр /R указывает Турбо Ассемблеру, что нуж- но генерировать реальные инструкции с плавающей точкой (вместо генерации эмулируемых инструкций с плавающей точкой). Используйте этот параметр, если вы хотите выполнять свою программу на маши- нах, оснащенных арифметическим сопроцессором 80х87.
Действие данного параметр изменяет на обратное параметр /E (при этом генерируются эмулируемые инструкции с плавающей точ- кой).
Если в исходном файле вы используете директиву EMUL, то она отменит действие инструкции /R, указанной в командной строке.
Параметр командной строки /R имеет тот же эффект, что и ис- пользование в начале исходного файле директивы NOEMUL и совпадает с действием параметра командной строки /JNOEMUL.
Пример:
TASM /R SEGANT TPC /$N+ /$E- TRIG.PAS
Первая команда ассемблирует модуль с реальными инструкциями с плавающей точкой. Вторая командная строка компилирует исходный модуль Паскаля с реальными инструкциями с плавающей точкой, кото- рый компонуется с объектным файлом Ассемблера.
Функция: Задает последовательное упорядочивание сегментов.
Синтаксис: /S
Примечания: Параметр /S указывает Турбо Ассемблеру, что сег- менты в объектном файле нужно разместить в том порядке, в котором Турбо Ассемблер обнаруживает их в исходном коде. По умолчанию Турбо Ассемблер использует именно такое упорядочивание сегментов, если вы не изменили его с помощью параметра /A в командной строке или в файле конфигурации.
Если с помощью директивы .ALPHA в исходном коде вы задали упорядочивание сегментов в алфавитном порядке, то эта директива отменит параметр /S, задаваемый в командной строке.
Пример:
TASM /S TEST1
По данной команде создается объектный файл (TEST1.OBJ), сег- менты которого упорядочены в том порядке, как они содержатся в исходном файле.
Функция: Подавляет вывод сообщений при условном ассемблиро- вании.
Синтаксис: /T
Примечания: Параметр /T подавляет всю выводимую Турбо Ассем- блером на экран информацию, кроме предупреждений и сообщений об ошибках, возникающих в результате ассемблирования.
Вы можете использовать данный параметр при ассемблировании нескольких модулей, когда на экран желательно выводить только со- общения об ошибках.
Пример:
TASM /T TEST1
Синтаксис: /V
Примечания: Параметр /V используется в целях совместимости. Он не приводит ни к каким действиям и не оказывает влияния на ас- семблирование.
Функция: Управляет генерацией предупреждающих сообщений.
Синтаксис: /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
Примечания: Если при вычислении блоков IF, IFNDEF, IFDEF и т.д. получается значение FALSE, то параметр /X приводит к тому, что операторы, содержащиеся внутри условного блока, будут включе- ны в листинг ассемблирования. По данной директиве в листинг будут также включены сами директивы условного ассемблирования (обычно они в листинг не включаются).
Вы должны в командной строке или с помощью параметра /L за- дать также необходимость генерации файла листинга, иначе параметр /X действовать не будет.
Для переопределения параметра /x вы можете использовать ди- рективы .LFCOND, .SFCOND и .TFCOND.
Пример:
TASM /X TEST1
Функция: Выводит на экран наряду с сообщениями об ошибке со- ответствующие строки исходного текста.
Синтаксис: /Z
Примечания: Параметр /Z указывает Ассемблеру, что при гене- рации сообщения об ошибке на экран нужно вывести соответствующую строку исходного файла (где эта ошибка возникла). Вызвавшая ошиб- ку строка выводится перед сообщением об ошибке. При запрещении данного параметра Турбо Ассемблер просто выводит сообщение, опи- сывающее ошибку.
Пример:
TASM /Z TEST1
Функция: Разрешает включение в объектные файлы информации о номерах строк.
Синтаксис: /ZD
Примечания: Параметр /ZD приводит к тому, что Турбо Ассемб- лер будет помещать в объектные файлы информацию о номерах строк. Это позволяет автономному отладчику фирмы Borland (Турбо отладчи- ку) выводить на экран текущее место в исходном коде, но не позво- ляет ему осуществлять доступ к элементам данных.
Если при попытке отладки программы с помощью Турбо отладчика вам не хватит памяти, вы можете использовать параметр /ZD для од- них модулей и параметр /ZI - для других.
Пример:
TASM /ZD TEST1
Функция: Разрешает включение в объектный файл информации для отладки.
Синтаксис: /ZI
Примечания: Параметр /ZI указывает Турбо Ассемблеру, что в объектный файл нужно вывести полную информацию для отладки. Эта информация включает в себя записи о номерах строк (для синхрони- зации вывода на экран исходного текста) и информацию о типах дан- ных, позволяющую модифицировать и проверить данные программы.
Параметр /ZI позволяет вам использовать все средства Турбо отладчика для прохождения программы и проверки и изменения эле- ментов данных. Вы можете использовать параметр /ZI для всех моду- лей программы или только для тех, отладка которых вас интересует. Поскольку параметр /ZI добавляет информацию в объектные и выпол- няемые файлы, может оказаться нежелательным его использование для всех модулей программы при выполнении программы Турбо отладчиком (например, может возникать ситуация нехватки памяти).
Пример:
TASM /ZI TEST1
Функция: Запрещает включение в объектный файл информацию для отладки.
Синтаксис: /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.
Необязательные параметры командной строки позволяют вам уп- равлять поведением Ассемблера и тем, какую информацию он выводит на экран, в листинг и объектный файл. В Турбо Ассемблере предус- мотрены некоторые параметры, которые не выполняют никаких дей- ствий, а используются только для совместимости текущей версии TASM с предыдущими версиями MASM (макроассемблер фирмы Microsoft):
1 0/b Задает размер буфера 1 0/v Выводит на экран дополнительную статистику
Вы можете задавать параметры, представляющие собой любую комбинацию букв в верхнем и нижнем регистре. Кроме того, парамет- ры можно задавать в любом порядке (кроме параметров /I и /J), они будут при этом обрабатываться последовательно. При использовании параметра /d нужно быть внимательным: идентификаторы надо опреде- лить до того, как они будут использованы в последующих параметрах /d.
Примечание: С помощью директив, указанных в исходном коде, вы можете отменить эквивалентные им параметры Ассемб- лера.
На Рис. 2.1 (см. выше) приведен полный список параметров Турбо Ассемблера. Далее эти параметры описаны подробно.
Все параметры-переменные (var) передаются точно также: как указатель дальнего типа на их действительные адреса в памяти.
Параметр-значение - это параметр, значение которого не может изменяться подпрограммой, в которую он передается. В отличие от многих компиляторов, Турбо Паскаль не выполняет слепого копирова- ния в стек каждого параметра-значения: как мы далее поясним, ис- пользуемый метод зависит от типа.