На этом шаге мы рассмотрим вызов подпрограмм.
Функции и процедуры идентифицируются достаточно просто. Структуру вызова и внутреннюю часть процедур вы уже хорошо знаете. Остается только напомнить некоторые положения.
Приведем небольшую программу на C++, содержащую обращение к функции:
#include<iostream.h> void main() { int x; long cube (int); cout << "Задайте число: "; cin >> x; cout << "Его куб: " << cube (x); } long cube (int i) { return i*i*i; }
На рисунке 1 представлено начало этой программы в IDA PRO:
Рис.1. Дизассемблированная программа
Вызов процедуры:
PUSH par1 PUSH par2 PUSH раг3 CALL 232343
Здесь все достаточно просто. Главное - распознать параметры и понять порядок помещения их в стек. Надо также иметь в виду, что существует протокол передачи параметров через регистры. После вызова процедуры может стоять команда очистки стека ADD ESP,N.
Не забывайте, что функции возвращают результат через регистр ЕАХ. Это может помочь вам быстро разобраться в назначении функции.
На следующем шаге мы рассмотрим оптимизацию кода.