Программирование на Ассемблере

       

Передача в списке параметров простых переменных


     Параметры можно разделить на параметры - исходные данные  и  параметры-результаты. Для первых передаются значения, а для вторых - адреса. Чтобы уменьшить число передаваемых параметров,  для  массивов передаются адреса, а не значения элементов, даже  для  массивов исходных данных. Чтобы стек не переполнялся,  после  использования  параметры должны быть извлечены из стека. Эту функцию, называемую  очисткой стека, обычно выполняет функция . Для этого в команде ret задается количество байтов, используемых для параметров, т.е. используется формат команды ret <число>. В этом случае сначала очищается стек, а затем выполняется возврат в вызывающую программу.

     Ниже рассмотрены примеры использования функций с  передачей

параметров через стек. Примеры отражают приемы  передачи  простых переменных (исходных данных и результатов), массивов,  структур, и адресов функций.

      Пример 1. Составить функцию вычисления z=x+y и использовать ее для вычисления c=a+b; f=d+e.

;Функция для вычисления z=x+y и использовать ее для вычисления c=a+b; f=d+e

                        IDEAL

                        P586

MODEL  FLAT

EXTRN ExitProcess:proc

                 DATASEG

          a            DD  5

          b            DD  3

          c            DD  ?



          d   DD  4

          e   DD  -5

          f   DD  ?

          CODESEG

          begin:

             

              push [a]      ; запись в стек a, b

              push [b]

              lea  eax, c      ;Формирование & c

              push  eax    ; и запись его в стек

              call summa  ; Вызов функции

             

              push  [d]     ; запись в стек d, e

              push  [e]

              lea  eax, [f]     ; Формирование & f

              push eax

              call summa  ; Вызов функции

            call ExitProcess

             

          

proc summa

0

EBP

push ebp

4

EIP

mov  ebp, esp

8

&c

Push eax ebx

12

B

mov  eax, [ebp+16]  ; a

16

A

Add  eax, [ebp+12]  ; a+b

mov  ebx, [ebp+8]  ; &c

mov  [ebx], eax    ; c=a+b

Pop ebx eax ebp

Ret 12

Endp summa

End begin

В примере показана передача простых переменных (исходных данных и результатов). Показано состояние стека после обращения к функции для вычисления c = a + b.  Анализ  программы  показывает, что передача параметров с последующей очисткой стека, передача управления процедуре требует дополнительных команд.  Эти  же действия выполняются при программировании на языке высокого уровня. Поэтому, прежде чем писать функцию  на любом языке, подумайте, эффективна ли она! Решение предыдущего примера без  функции явно предпочтительней!



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