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

         

Директива ARG


Хотя можно обращаться к параметрам через регистр BP, Турбо Ассемблер предусматривает альтернативу вычислению смещений в сте- ке и выполнению текстовых присваиваний. Это директива ARG. При использовании ее в процедуре директива ARG автоматически опреде- ляет смещения параметров относительно регистра BP. Она вычисляет также размер блока параметров и использует его в инструкции RET. Поскольку идентификаторы, создаваемые по директиве ARG, определе- ны только в соответствующей процедуре, в каждой процедуре или функции вам не требуется использовать уникальные имена парамет- ров.

Покажем, как будет выглядеть пример предыдущего раздела, если переписать его, используя директиву ARG:

CODE SEGMENT ASSUME CS:CODE MyProc PROC FAR ; procedure MyProc(i,j : integer); ; external; PUBLIC MyProc ARG j : WORD, i : WORD = RetBytes push bp ; нужно сохранить BP вызывающей ; программы mov bp,sp ; BP теперь указывает на вершину ; стека mov ax,i ; адресуемся к i через BP . . .

Директива ARG Турбо Ассемблера создает локальные идентифика- торы для параметров i и j. На время выполнения процедуры строка:

ARG j : WORD, i : WORD = RetBytes

автоматически приравнивает идентификатор i к [WORD PTR BP+6], идентификатор j к [WORD PTR BP+8], а идентификатор RetBytes - к числу 4 (размеру в байтах блока параметров). В значениях учитыва- ется и занесенное в стек значение BP, и размер адреса возврата: если бы процедура MyProc имела ближний тип, то i было бы прирав- нено к значению [BP+4], j - к [BP+6], а RetBytes также было бы равно 4 (в любом случае процедура MyProc может завершить выполне- ние с помощью инструкции RET RetBytes).

При использовании директивы ARG нужно помнить, что параметры должны перечисляться в обратном порядке. Последний параметр про- цедуры или функции Турбо Паскаля нужно размещать в директиве ARG первым и наоборот.

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

function MyProc(i, j : char) : string; external;

Директива ARG для этой функции должна была бы выглядеть так:

ARG j: BYTE: 2, i:BYTE: 2 = RetBytes RETURN result: DWORD

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

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



Содержание раздела