| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
конкретной процедуры, включите имя языка в определение процедуры.
Вы можете задать язык процедуры, включив описывающее язык ключе-
вое слово в описание процедуры. Например, определение в режиме
MASM процедуры PASCAL может иметь вид:
.
.
.
pascalproc PROC PASCAL FAR
; тело процедуры
Турбо Ассемблер 3.0/tasm/#1-2 = 181 =
pascalproc ENDP
.
.
.
Турбо Ассемблер использует заданный в процедуре язык для оп-
ределения того, какой вход начала и завершения нужно автоматичес-
ки включить в тело процедуры. Начальный код устанавливает кадр
стека для передаваемых аргументов и локальных переменных процеду-
ры, а код завершения перед возвратом из процедуры восстанавливает
кадр стека.
Турбо Ассемблер автоматически вставляет в процедуру началь-
ный код перед первой инструкцией процедуры или перед первой мет-
кой ("метка: цель").
В коде завершения делается следующее:
- в стеке сохраняется текущий регистр BP;
- BP настраивается на текущий указатель стека;
- настраивается указатель стека для выделения локальных пе-
ременных;
- в стеке сохраняются регистры, заданные спецификатором
USES.
По каждой инструкции RET процедуры Турбо Ассемблер автома-
тически вставляет в процедуру код завершения (в случае нескольких
инструкций RET код завершения будет вставляться несколько раз).
Турбо Ассемблер также вставляет код завершения перед переходом на
любой объектно-ориентированный метод (см. Главу 4).
Завершающий код изменяет действие кода инициализации на об-
ратное. Это делается следующий образом:
- из стека извлекаются регистры, заданные оператором USES;
- настраивается указатель стека, чтобы отбросить локальные
аргументы;
- из стека извлекается сохраненный регистр BP;
- стек настраивается, чтобы отбросить переданные аргументы
(если этого требует язык) и выполнить возврат.
Последний шаг кода завершения (отбрасывание аргументов) вы-
полняется только для тех языков, которые требуют удаления аргу-
ментов процедуры (например, Бейсик, Фортран, Паскаль). По согла-
шениям, принятым в других языках (Си, С++, Пролог), аргументы ос-
таются в стеке, и удалять их должна вызывающая программа.
Турбо Ассемблер 3.0/tasm/#1-2 = 182 =
Турбо Ассемблер всегда реализует код начала и завершения
процедуры с помощью наиболее эффективных инструкций текущего выб-
ранного языка и процессора.
Для процедур NOLANGUAGE Турбо Ассемблер не генерирует код
начала и завершения. Если в таких процедурах ожидается передача
аргументов в стеке, вы должны сами включать код начала и заверше-
ния.
В общем случае язык процедуры влияет на процедуру следующим
образом:
Турбо Ассемблер 3.0/tasm/#1-2 = 183 =
Как язык влияет на процедуру Рис. 10.1
ЪДДДДДДДДДВДДДДДДВДДДДДДВДДДДДДДДВДДДДДДДДВДДДДДДДВДДДДДДВДДДДДДї
і Язык і Нет іБейсикі Фортрані Паскальі Си і С++ іПрологі
ГДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДґ
і Порядок і L-R і L-R і L-R і L-R і R-L і R-L і R-L і
і аргу- і і і і і і і і
і ментов і і і і і і і і
і (слева і і і і і і і і
і -напра- і і і і і і і і
і во, і і і і і і і і
і справа- і і і і і і і і
і налево) і і і і і і і і
ГДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДґ
іКто очи- іпроце-іпроце-іпроцеду-іпроцеду-івызыва-івызы- івызы- і
іщает стекідура ідура іра ідура іющая івающаяівающаяі
і(вызыва- і і і і іпрог- іпрог- іпрог- і
іющая і і і і ірамма ірамма ірамма і
іпрограммаі і і і і і і і
іили про- і і і і і і і і
іцедура) і і і і і і і і
АДДДДДДДДДБДДДДДДБДДДДДДБДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДДДБДДДДДДЩ
L-R - слева-направо, R-L - справа-налево.
Для включения в файл листинга кода начала и завершения вы
можете использовать параметр командной строки /la. Это позволит
вам увидеть разницу между языками.
Примечание: Более подробную информацию можно найти в
Главе 13.
Задание модификатора языка
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Модификаторы языка указывают сообщают Турбо Ассемблеру, что
в процедуры нужно включать специальный код начала и завершения,
организующий интерфейс с Windows и менеджером оверлеев VROOM.
Чтобы эти модификаторы использовать, укажите их перед языком про-
цедуры в директиве модели или в заголовке процедуры. Допустимыми
модификаторами являются модификаторы NORMAL, WINDOWS, ODDNEAR и
ODDFAR.
Кроме того, вы можете задать используемый по умолчанию моди-
фикатор языка в качестве параметра директивы MODEL. Если исполь-
зуемый по умолчанию модификатор языка присутствует, то все проце-
дуры, в которых не задается модификатор языка, будут использовать
соглашения, заданные по умолчанию.
Примечание: Подробнее об этом рассказывается в Главе
7.
Чтобы задать модификатор языка для конкретной процедуры,
включите модификатор языка в конкретную процедуру. Например:
Турбо Ассемблер 3.0/tasm/#1-2 = 184 =
.
.
.
sample PROC WINDOWS PASCAL FAR
ENDP
.
.
.
Если вы не задаете модификатор языка, Турбо Ассемблер ис-
пользует модификатор языка, заданный в операторе MODEL. Если ди-
ректива MODEL отсутствует, или если задан модификатор NORMAL, то
Турбо Ассемблер будет использовать стандартный код начала и за-
вершения.
Если вы выбрали модификатор языка WINDOWS, Турбо Ассемблер
генерирует код начала и завершения, позволяющий вам выбирать про-
цедуру из Windows. Турбо Ассемблер генерирует специальный код на-
чала и завершения только для процедура FAR WINDOWS. Из Windows вы
не можете вызвать процедуры NEAR, поэтому специальный код начала
и завершения для них не требуется. Процедуры, вызываемые Windows,
обычно используют соглашения по вызову, принятые в Паскале
(PASCAL). Например:
.
.
.
Winoproc PROC WINDOWS PASCAL FAR
ARG __hwnd:WORD, __mess:WORD, __wparam:WORD, __lparam:DWORD
; тело процедуры
ENDP
.
.
.
Примечание: Подробности о процедурах Windows можно уз-
нать в документации по Windows.
Модификаторы языка ODDNEAR и ODDFAR используются для менед-
жера оверлеев VROOM. VROOM имеет два режима операций: oddnear и
oddfar. Чтобы увидеть код начала и завершения, который порождают
эти модификаторы, вы можете использовать параметр командной стро-
ки /la.
Определения аргументов и локальных переменных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Турбо Ассемблер передает аргументы процедурам языка высокого
уровня в кадре стека, занося аргументы в стек перед вызовом про-
цедуры. Когда в процедуре языка требуются аргументы, она считыва-
ет их из стека. Когда процедура возвращает управление, она либо
удаляет аргументы из стека (соглашения по вызову Паскаля), либо
предполагает, что аргументы удаляются из стека вызывающей прог-
Турбо Ассемблер 3.0/tasm/#1-2 = 185 =
раммы (соглашения по вызову языка Си).
В описании процедуры передаваемые в процедуру через кадр
|
adfun.ru
|
|
|
|