Слайд 2
![Выполнение подпрограмм Команда №1 Команда №2 Команда №3 Команда №4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-1.jpg)
Выполнение подпрограмм
Команда №1
Команда №2
Команда №3
Команда №4
Команда №1
Команда №2
Команда №3
Команда №4
Основная программа
Подпрограмма
Слайд 3
![Команды процессора для работы с подпрограммами Вызов подпрограммы – CALL](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-2.jpg)
Команды процессора для работы с подпрограммами
Вызов подпрограммы – CALL
Возврат из подпрограммы
– RET
команды относятся к командам передачи управления
Слайд 4
![Команды процессора для работы с подпрограммами 012 013 MOV … CALL 567 014 MOV … Программа](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-3.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
Слайд 5
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-4.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
012
Слайд 6
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-5.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
013
Слайд 7
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-6.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
014
Слайд 8
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-7.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
014
567
568
MOV …
ADD …
569
RET
Подпрограмма
Слайд 9
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-8.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
014
567
568
MOV …
ADD …
569
RET
Подпрограмма
014
Стек
Слайд 10
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-9.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
567
567
568
MOV …
ADD …
569
RET
Подпрограмма
014
Стек
Слайд 11
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-10.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
568
567
568
MOV …
ADD …
569
RET
Подпрограмма
014
Стек
Слайд 12
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-11.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
569
567
568
MOV …
ADD …
569
RET
Подпрограмма
014
Стек
Слайд 13
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-12.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
570
567
568
MOV …
ADD …
569
RET
Подпрограмма
014
Стек
Слайд 14
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-13.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
014
567
568
MOV …
ADD …
569
RET
Подпрограмма
Слайд 15
![Команды процессора для работы с подпрограммами 012 013 MOV …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-14.jpg)
Команды процессора для работы с подпрограммами
012
013
MOV …
CALL 567
014
MOV …
Программа
EIP
015
567
568
MOV …
ADD …
569
RET
Подпрограмма
Слайд 16
![Где описываются программы MOV … Procedure: ADD … NEG …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-15.jpg)
Где описываются программы
MOV …
Procedure:
ADD …
NEG …
RET
SUB …
MULL …
CALL Procedure
CDQ
IDIV …
Слайд 17
![Где описываются программы MOV … JMP MainNext Procedure: ADD …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-16.jpg)
Где описываются программы
MOV …
JMP MainNext
Procedure:
ADD …
NEG …
RET
MainNext:
SUB …
MULL …
CALL Procedure
CDQ
IDIV …
Слайд 18
![Где описываются программы Перед основной программой После основной программы В отдельном модуле](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-17.jpg)
Где описываются программы
Перед основной программой
После основной программы
В отдельном модуле
Слайд 19
![Где описываются программы Перед основной программой .code Procedure: ; код](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-18.jpg)
Где описываются программы
Перед основной программой
.code
Procedure:
; код подпрограммы
RET
Start:
; код основной программы
CALL Procedure
;
код основной программы
end Start
Слайд 20
![Где описываются программы После основной программы .code Start: ; код](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-19.jpg)
Где описываются программы
После основной программы
.code
Start:
; код основной программы
CALL Procedure
; код основной
программы
CALL ExitProcess
Procedure:
; код подпрограммы
RET
end Start
Слайд 21
![Способы передачи параметров в подпрограммы Через регистры общего назначения Через общую память Через стек](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-20.jpg)
Способы передачи параметров в подпрограммы
Через регистры общего назначения
Через общую память
Через стек
Слайд 22
![Передача параметров через регистры общего назначения Factorial: MOV ECX, EAX](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-21.jpg)
Передача параметров через регистры общего назначения
Factorial:
MOV ECX, EAX
MOV EBX, 2
MOV EAX,
1
Cycle:
CMP EBX, ECX
JG EndFunction
MUL EBX
INC EBX
JMP Cycle
EndFunction:
RET
Слайд 23
![Передача параметров через регистры общего назначения .data n dd 5](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-22.jpg)
Передача параметров через регистры общего назначения
.data
n dd 5
.data?
result dd ?
.code
Factorial:
; тело
функции
RET
Start:
MOV EAX, n
CALL Factorial
MOV result, EAX
Слайд 24
![Передача параметров через регистры общего назначения Достоинства легко использовать большая скорость работы можно возвращать несколько значений](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-23.jpg)
Передача параметров через регистры общего назначения
Достоинства
легко использовать
большая скорость работы
можно возвращать несколько
значений
Слайд 25
![Передача параметров через регистры общего назначения Недостатки малое количество параметров](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-24.jpg)
Передача параметров через регистры общего назначения
Недостатки
малое количество параметров
трудности использования регистров в
подпрограмме
трудности вложенных и рекурсивных вызовов
Слайд 26
![Передача параметров через общую память Factorial: MOV ECX, param MOV](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-25.jpg)
Передача параметров через общую память
Factorial:
MOV ECX, param
MOV EBX, 2
MOV EAX, 1
Cycle:
CMP
EBX, ECX
JG EndFunction
MUL EBX
INC EBX
JMP Cycle
EndFunction: MOV param+4, EAX
RET
Слайд 27
![Передача параметров через общую память .data n dd 5 .data?](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-26.jpg)
Передача параметров через общую память
.data
n dd 5
.data?
result dd ?
param dd 2
dup(?)
.code
MOV EAX, n
MOV param, EAX
CALL Factorial
MOV EAX, param+4
MOV result, EAX
Слайд 28
![Передача параметров через общую память Достоинства произвольное количество параметров переменное количество параметров регистры общего назначения свободны](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-27.jpg)
Передача параметров через общую память
Достоинства
произвольное количество параметров
переменное количество параметров
регистры общего назначения
свободны
Слайд 29
![Передача параметров через общую память Недостатки низкое быстродействие трудности рекурсивных вызовов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-28.jpg)
Передача параметров через общую память
Недостатки
низкое быстродействие
трудности рекурсивных вызовов
Слайд 30
![Передача параметров через стек Команды работы со стеком push –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-29.jpg)
Передача параметров через стек
Команды работы со стеком
push – помещает в вершину
стека некоторое значение
pop – извлекает из вершины стека некоторое значение
Слайд 31
![Передача параметров через стек Команды работы со стеком pusha –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-30.jpg)
Передача параметров через стек
Команды работы со стеком
pusha – помещает в вершину
стека значения всех регистров общего назначения
popa – извлекает из вершины стека значения всех регистров общего назначения
Слайд 32
![Передача параметров через стек Команды работы со стеком pushf –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-31.jpg)
Передача параметров через стек
Команды работы со стеком
pushf – помещает в вершину
стека значение регистра флагов
popf – извлекает из вершины стека значения регистра флагов
Слайд 33
![Передача параметров через стек Стек: Позволяет обрабатывать только 32-разрядные числа](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-32.jpg)
Передача параметров через стек
Стек:
Позволяет обрабатывать только 32-разрядные числа
Адрес вершины стека храниться
в регистре ESP (смещение относительно сегментного регистра SS)
Вершина стека, это ячейка памяти, содержащая последнее помещённое в стек значение
Слайд 34
![Передача параметров через стек Алгоритм работы команды push: add ESP, 4 mov [ESP],](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-33.jpg)
Передача параметров через стек
Алгоритм работы команды push:
add ESP, 4
mov [ESP], <источник>
Слайд 35
![Передача параметров через стек Алгоритм работы команды pop: mov , [ESP] sup ESP, 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-34.jpg)
Передача параметров через стек
Алгоритм работы команды pop:
mov <приёмник>, [ESP]
sup ESP, 4
Слайд 36
![Передача параметров через стек Алгоритм работы команды call: add EIP,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-35.jpg)
Передача параметров через стек
Алгоритм работы команды call:
add EIP, <размер команды call>
add
ESP, 4
mov [ESP], EIP
mov EIP, <адрес метки>
Слайд 37
![Передача параметров через стек Алгоритм работы команды ret: mov EIP, [ESP] sub ESP, 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-36.jpg)
Передача параметров через стек
Алгоритм работы команды ret:
mov EIP, [ESP]
sub ESP, 4
Слайд 38
![Передача параметров через стек Factorial: MOV ECX, [ESP+8] MOV EBX,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-37.jpg)
Передача параметров через стек
Factorial:
MOV ECX, [ESP+8]
MOV EBX, 2
MOV EAX, 1
Cycle:
CMP EBX,
ECX
JG EndFunction
MUL EBX
INC EBX
JMP Cycle
EndFunction: MOV [ESP+4], EAX
RET
Слайд 39
![Передача параметров через стек .data n dd 5 .data? result](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-38.jpg)
Передача параметров через стек
.data
n dd 5
.data?
result dd ?
.code
PUSH n
PUSH 0
CALL Factorial
POP
result
ADD ESP, 4
Слайд 40
![Передача параметров через стек Достоинства произвольное количество параметров переменное количество параметров простота использования легкая организация рекурсии](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-39.jpg)
Передача параметров через стек
Достоинства
произвольное количество параметров
переменное количество параметров
простота использования
легкая организация рекурсии
Слайд 41
![Передача параметров через стек Недостатки трудно отслеживать состояние стека после](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-40.jpg)
Передача параметров через стек
Недостатки
трудно отслеживать состояние стека
после вызова подпрограммы основная программа
должна выравнивать стек
Слайд 42
![Подпрограммы в C параметры передаются через стек (при этом в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-41.jpg)
Подпрограммы в C
параметры передаются через стек (при этом в стек параметры
помещаются с конца)
Результат возвращается в регистрах
1 байт – AL
2 байта – AX
4 байта – EAX
8 байт – (EAX, EDX)
Слайд 43
![Функции Windows API после вызова функций с фиксированным числом параметров не нужно выравнивать стек](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-42.jpg)
Функции Windows API
после вызова функций с фиксированным числом параметров не нужно
выравнивать стек
Слайд 44
![Передача параметров с использование STDCALL Factorial: MOV ECX, [ESP+4] MOV](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-43.jpg)
Передача параметров с использование STDCALL
Factorial:
MOV ECX, [ESP+4]
MOV EBX, 2
MOV EAX, 1
Cycle:
CMP
EBX, ECX
JG EndFunction
MUL EBX
INC EBX
JMP Cycle
EndFunction:
RET 4
Слайд 45
![Передача параметров с использование STDCALL .data n dd 5 .data?](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-44.jpg)
Передача параметров с использование STDCALL
.data
n dd 5
.data?
result dd ?
.code
PUSH n
CALL Factorial
MOV
result, EAX
Слайд 46
![Создание локальных переменных в стеке [ESP] – точка возврата [ESP](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-45.jpg)
Создание локальных переменных в стеке
[ESP] – точка возврата
[ESP + 4] –
первый параметр функции
[ESP + 8] – второй параметр функции
и т. д.
Слайд 47
![Создание локальных переменных в стеке SUB ESP, 4 [ESP] –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-46.jpg)
Создание локальных переменных в стеке
SUB ESP, 4
[ESP] – локальная переменная
[ESP +
4] – точка возврата
[ESP + 8] – первый параметр функции
[ESP + 12] – второй параметр функции
и т. д.
Слайд 48
![Пролог функции PUSH EBP MOV EBP, ESP SUB ESP, 8](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/257250/slide-47.jpg)
Пролог функции
PUSH EBP
MOV EBP, ESP
SUB ESP, 8
[EBP] – исходное значение EBP
[EBP
+ 4] – точка возврата
[EBP + 8] – первый параметр функции
[EBP + 12] – второй параметр функции
и т. д.
[EBP – 4] – вторая локальная переменная
[EBP – 8] – первая локальная переменная
и т. д.