Инструменты пользователя

Инструменты сайта


examination:asm:question24

Вопрос №24. Процедуры. Стандартные соглашения о связях, их назначение. Передача параметров, локальные переменные процедуры. Стековый кадр. Примеры

Синтаксис определения процедур

В режиме MASM используется следующий синтаксис:

        имя PROC [[модификатор_языка] язык] [расстояние]
           [ARG список_аргументов] [RETURN список_элементов];
              [LOCAL список_аргументов]
                 [USES список_элементов]
                 .
                 .
                 .
        [имя] ENDP
        
        

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

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

Процедура FAR вызывается с помощью вызова дальнего типа и содержит возврат дальнего типа. Процедуры FAR вы можете вызывать вне сегмента, в котором они определяются. Вызов FAR заносит в стек адрес в виде сегмента и смещения, а затем устанавливает CS:IP в адрес процедуры. Когда процессор обнаруживает возврат дальнего типа, он извлекает из стека сегмент и смещение адреса возврата и устанавливает в него CS:IP.

Примечание: FAR или NEAR можно задать в качестве аргумента оператора MODEL.

         
        .
        .
        .
        MODEL TINY                ; по умолчанию расстояния NEAR
        .
        .
        .                         ; test1 - это дальняя процедура
        test1 PROC FAR
                                  ; тело процедуры
        RET                       ; это будет дальним возвратом:
        ENDP
                                  ; test2 по умолчанию является
                                  ; ближней процедурой
        test2 PROC
                                  ; тело процедуры
        RET                       ; это будет ближним возвратом
        ENDP
        .
        .
        .
        

Описание языка процедуры

Соглашения по интерфейсу поддерживаются для языков NOLANGUAGE (Ассемблер), BASIC, PROLOG, FORTRAN, C, CPP (C++) и PASCAL.

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

С помощью директивы MODEL вы можете задать язык, используемый по умолчанию.

Например, определение в режиме MASM процедуры PASCAL может иметь вид:

        .
        .
        .
        pascalproc PROC PASCAL FAR
                  ; тело процедуры
        pascalproc ENDP
        .
        .
        .
        

Передача параметров, локальные переменные процедуры.

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

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

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

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

Аргументы и переменные определяются в процедуре как операнды

   в памяти относительно 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.          
            
examination/asm/question24.txt · Последние изменения: 2014/01/15 12:12 (внешнее изменение)