Page 47 - 4989
P. 47

Тоді  для  виклику  підпрограми  слід  застосувати  послідовність
                  команд:
                        PUSH А
                        PUSH В

                        CALL PP
                        а  в  самій  підпрограмі  звертання  до  аргументів  реалізується
                  так:

                        PUSH EBP
                        MOV EBP, ESP
                        MOV EAX, [EBP+8]                            ; звертання до В
                        MOV EBX, [EBP+12]                           ; звертання до А

                        Тут  перші  дві  команди  –  стандартний  код  «прологу»
                  підпрограми, призначений для зберігання значення регістра ЕВР
                  (який може використовуватись основною програмою, див. вище)

                  та ініціалізації його адресою верхівки стеку, у якому знаходяться
                  аргументи. Зміщення 8 для першого аргументу пояснюється тим,
                  що крім аргументів у стеку присутні також адреса повернення та

                  регістр  ЕВР.           Зміщення  кожного  наступного  аргументу
                  утворюються  шляхом  додавання  4.  Оскільки  стек  зростає  в
                  напрямі  менших  адрес  (при  записі  даних  у  стек  значення  ESP

                  зменшується),  то  аргумент,  який  був  записаний  у  стек  першим,
                  має більше зміщення.
                        При  наявності  такого  «прологу»  підпрограма  повинна
                  закінчуватись таким «епілогом»:

                        MOV ESP, EBP
                        POP EBP
                        для відновлення вмісту регістрів ESP, EBP.

                        У  вікні  дизасемблера  Microsoft  Visual  Studio  звертання  до
                  операндів  типу  [EBP+8]  заміняються  на  назви  аргументів
                  підпрограми  з  метою  полегшення  сприйняття.  При  написанні
                  програм мовою асемблера також існують синтаксичні засоби, що

                  дозволяють  використовувати  назви  аргументів  у  тексті
                  підпрограми.
                        Після  виконання  підпрограми  слід  очистити  стек  від

                  аргументів.  Очистку  може  виконувати  як  код,  який  викликав
                  підпрограму, так і сама підпрограма.
                        Якщо  очистка  стеку  виконується  підпрограмою,  для

                  повернення  використовується  команда  повернення  RET  n  (при

                                                                 47
   42   43   44   45   46   47   48   49   50   51   52