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

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


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

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

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

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

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

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



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