Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Турбо Ассемблер / Использование Турбо Ассемблера /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Описание процедур - Программирование от RIN.RU
Описание процедур



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


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


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


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


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


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


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


Синтаксис директив ARG и LOCAL


Приведем синтаксис определения передаваемых процедуре аргументов:


ARG аргумент [,аргумент] . [=идентификатор]
[RETURNS аргумент] [,аргумент]]


При определении локальных переменных процедуры используется следующий синтаксис:


LOCAL аргумент [,аргумент] . [=идентификатор]


Отдельные аргументы имеют следующий синтаксис:


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


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


Если вы не задаете поле "сложный_тип", Турбо Ассемблер предполагает WORD. При выборе 32-разрядной модели он предполагает DWORD.


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


ARG tmp:DWORD:4


определяется аргумент с именем "tmp", состоящий из 4 двойных слов.


По умолчанию "выражение_счетчик_2" имеет значение 1 (кроме аргументов типа BYTE. Так как вы не можете занести в стек байтовое значение, для аргументов типа BYTE значение счетчика по умолчанию равно 2, что обеспечивает для них в стеке размер в слово. Это согласуется с языками высокого уровня, которые интерпретируют передаваемые в качестве параметров символьные переменные. Если вы действительно хотите задать аргумент, как один байт в стеке, нужно явным образом определить значение поля "выражение_счетчик_2", равное 1. Например:


ARG realbyte:BYTE:1


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


Если вы завершаете список аргументов символом равенства (=) и идентификатором, то Турбо Ассемблер будет приравнивать этот идентификатор к общему размеру блока аргументов (в байтах). Если вы не используете автоматическое использование соглашений языков высокого уровня в Турбо Ассемблере, то можете использовать данное значение в конце процедуры в качестве аргумента инструкции RET. Заметим, что это вызывает очистку стека от всех занесенных туда перед возвратом аргументов (это соглашения по вызову, принятые в Паскале).


Аргументы и переменные определяются в процедуре как операнды в памяти относительно BP. Передаваемые аргументы, определенные с помощью директивы ARG, имеют положительное смещение относительно BP. Локальные переменные, определенные с помощью директивы LOCAL, имеют отрицательное смещение от BP. Приведем пример:


.
.
.
func1 PROC NEAR
ARG a:WORD,b:WORD:4,c:BYTE=d
LOCAL x:DWORD,y=WORD:2=z
.
.
.


Здесь a определяется, как [bp+4], b определяется, как [bp+6], c определяется, как [bp+14], а d - как 20. x - это [bp-2], y - [bp-6], а z - 8.


<<<  НазадВперед  >>>
 1  2  3  4  5 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Начало работы на Турбо Ассемблере

Использование директив и параметров

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

Объектно-ориентированное программирование

Использование выражений и значений идентификаторов

Директивы выбора процессора

Использование моделей памяти программы и сегментации

Задание и использование счетчика адреса

Описание процедур

Управление областью действия идентификаторов

Определение данных

Расширенные инструкции

Использование макрокоманд

Использование условных директив

Интерфейс с компоновщиком

Генерация листинга

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

Интерфейс Турбо Ассемблера с Турбо Паскалем

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь