adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
также, должна удалять аргументы из стека после вызова процедуры
сама процедура или вызывающая программа. Языка Си и С++ требуют,
чтобы стек очищала вызывающая программа. Во всех других языках
процедура должна сама удалить аргументы из стека перед возвратом
управления.
Турбо Ассемблер с помощью расширенной инструкции CALL сам
выполняет за вас функции по занесению аргументов в стек в нужном
порядке и очисткой стека. Вызов процедуры с параметрами имеет
следующий синтаксис:
CALL выражение [язык] [,список_аргументов]
где "выражение" является целью инструкции CALL, "язык" задает ис-
пользуемые при вызове языковые соглашения. Если вы не задаете
язык, Турбо Ассемблер использует по умолчанию язык, заданный в
директиве MODEL.
Примечание: О директиве MODEL более подробнее расска-
зывается в Главе 7.
Аргументы, если они имеются, указываются после идентификато-
ра языка. Синтаксис каждого аргумента в списке совпадает с син-
таксисом, который используется в расширенных инструкциях PUSH и
POP. Вы можете разделить эти аргументы запятыми, например:
CALL test PASCAL,ax,es OFFSET buffer,blen
Турбо Ассемблер 3.0/tasm/#2-2 = 23 =
Поскольку в данном примере указан Паскаль, Турбо Ассемблер
будет заносить аргументы в стек в том порядке, в котором они ука-
заны. Этот пример эквивалентен следующим инструкциям:
PUSH ax
PUSH es OFFSET buffer
PUSH word PTR blen
CALL test
Вызов процедуры Си требует, чтобы аргументы заносились в
стек в обратном порядке. Турбо Ассемблер делает это автоматичес-
ки, поэтому вызов вида:
CALL test C,ax,es OFFSET buffer, word PTR blen
даст в результате следующий код:
PUSH word PTR blen
PUSH es OFFSET buffer
PUSH ax
CALL test
SUB sp,8
При вызове процедуры с аргументами аргументы в списке следу-
ет всегда указывать в том порядке, в котором они следуют в заго-
ловке процедуры. При необходимости Турбо Ассемблер изменяет их
порядок на обратный.
Нужно не забывать разделять аргументы запятыми, а компоненты
аргументов - пробелами. В зависимости от соглашений указанного
языка Турбо Ассемблер может заносить аргументы в стек в обратном
порядке, но порядок компонентов аргумента он не изменяет.
Если при вызове используются интерфейсные соглашения
NOLANGUAGE, Турбо Ассемблер при наличии любого аргумента сообщает
об ошибке. Хотя аргументы для процедуры NOLANGUAGE можно задать с
помощью директивы ARG, при вызове такой процедуры требуется явное
занесение аргументов в стек.
Вызываемые процедуры, содержащие RETURNS
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Процедуры, определяющие некоторые из своих аргументов с по-
мощью ключевого слова RETURNS требуют отдельного рассмотрения.
Эти аргументы используются для возврата значений в вызывающую
программу. Таким образом, вызывающая программа всегда извлекает
их из стека. Чтобы способствовать передаче этих аргументов, зад-
анных в описании процедуры после директивы RETURNS, в Турбо Ас-
семблере нет специальных расширений инструкции CALL. Перед инс-
трукцией CALL вы должны явным образом занести аргументы в стек
(PUSH), а потом извлечь их их стека (POP).
Турбо Ассемблер 3.0/tasm/#2-2 = 24 =
Вызов процедур методов для объектов: CALL...METHOD
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Инструкция CALL расширена таким образом, чтобы поддерживать
методы объектов. Вызов метода объекта может генерировать либо не-
посредственный вызов (для статических методов), либо косвенный
вызов (для виртуальных методов).
Поскольку вы можете использовать косвенный вызов, выполняю-
щие вызов инструкции могут нарушить содержимое некоторых регист-
ров. В этом случае, если вы используете вызов виртуального мето-
да, Турбо Ассемблер позволяет вам выбрать соответствующие регист-
ры.
Приведем синтаксис расширения CALL...METHOD:
CALL указатель_экземпляра METHOD [имя_объекта:]имя_метода
[USES [сегм_регистр:]регистр_смещения] [язык_и_аргументы]
где "указатель_экземпляра" должен описывать экземпляр объекта. В
режиме MASM часто невозможно определить имя объекта, связанного с
экземпляром. В этом случае Турбо Ассемблер позволяет использовать
поле "имя_объекта", благодаря чему вы можете задать имя экземпля-
ра объекта.
Поле "имя_метода" содержит имя метода, который должен вызы-
ваться для конкретного экземпляра объекта.
Примечание: О том, как задавать виртуальных или стати-
ческий метод, подробнее рассказывается в Главе 8.
Если метод является виртуальным,и требуется косвенный вызов,
инструкция CALL...METHOD выполняет косвенный вызов через регистры
ES:BX (ES:EBX для модели USE32 процессора 80386). Если вы хотите
использовать другие регистры, можно переопределить их с помощью
оператора USES. Поле "сегм_регистр" это необязательный используе-
мый сегментный регистр, а "регистр_смещения" - это регистр смеще-
ния, используемый для вызова.
Для объектов, описанных с помощью таблиц NEAR, CALL...METHOD
загружает только регистр смещения. Турбо Ассемблер предполагает,
что сегментный регистр всегда установлен в корректное значение.
Примечание: Хорошей практикой программирования явля-
ется соответствующий вызов методов с помощью косвенного
вызова, даже когда вы знаете, что вызываемый метод являет-
ся статическим. При модификации объектов методы могут из-
мениться со статических на виртуальные.
Поле "язык_и_аргументы" инструкции CALL...METHOD содержит
необязательные спецификации языка и аргументов, которые идентичны
по форме описанным в предыдущем разделе.
Вызов процедур методов для С++ и Паскаля требует обычно,
Турбо Ассемблер 3.0/tasm/#2-2 = 25 =
чтобы экземпляр объекта передавался в качестве аргумента в стеке.
Подробнее об этом рассказывается в Главе 18 и Главе 19.
Остаточная рекурсия для методов объектов: инструкция JMP...METHOD
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Турбо Ассемблер обеспечивает инструкцию JMP...METHOD, соот-
ветствующую инструкции CALL...METHOD. Она имеет следующий син-
таксис:
JMP указатель_экземпляра METHOD [имя_объекта:]имя_метода
[USES [сегм_регистр:]регистр_смещения]
Инструкция JMP...METHOD полностью аналогична инструкции
CALL...METHOD, за исключением того, что она:
- генерирует вместо инструкции CALL инструкцию JMP;
- генерирует код завершения процедуры для очистки стека пе-
ред генерацией инструкции JMP.
Инструкция JMP...METHOD позволяет писать эффективный код
остаточной рекурсии (tail recursion). Она предназначена для заме-
ны общей ситуации, когда инструкция CALL...METHOD дается для
конкретного метода с последующей инструкцией RET.
Дополнительные инструкции для объектного программирования
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
При создании экземпляра объекта требуется инициализировать
указатель таблицы виртуальных методом объекта (если он имеется),
чтобы он указывал на корректную таблицу виртуальных методов. Ин-
струкция TBLINIT позволяет вам сделать это автоматически. Эта ин-
струкция имеет следующий синтаксис:
TBLINIT указатель_экземпляра_объекта
Поле "указатель_экземпляра__объекта" представляет собой ад-
рес объекта, указатель таблицы виртуальных методов которого нужно
инициализировать. Инструкция TBLINIT предполагает, что экземпляр
объекта должен иметь тип текущего объекта (другими словами, не-
посредственно предшествующее определение объекта определяет объ-
ектный тип, который инициализирует TBLINIT). Например:
TBLINIT DS:ST
инициализирует указатель таблицы виртуальных методов объекта DS:
SI (если она имеется).
Турбо Ассемблер 3.0/tasm/#2-2 = 26 =
Глава 14. Использование макрокоманд
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Макрокоманды позволяют вам задавать имя идентификатора для
текстовой строки или блока кода, которые будут часто использо-
ваться в программе. Однако макрокоманды выходят за рамки простой
подстановки. В Турбо Ассемблере имеются макрооперации, обеспечи-
вающие большую гибкость в определении макрокоманд. В сочетании с
|
adfun.ru
|
|
|
|