Посмотрите на некоторые разборки C ++! :)
Обычно вы сохраняете возвращаемое значение в стеке, вызываете деструкторы всех локальных объектов и затем перемещаете возвращаемое значение из стека в регистр eax
(соглашение о вызовах cdecl). Сохранение eax
необходимо, потому что деструкторам разрешено изменять этот регистр.
Возьмите эту очень гипотетическую псевдосборку, например:
// inside imaginary function
mov [ebp-0Ch],eax; // save eax register
lea ecx, [ebp-4]; // [ebp-4] == your object address
call Foo::~Foo(); // call the destructor
mov eax,[ebp-0Ch]; // retrieve the saved return value
ret; // now return
Если возвращаемое значение является локальным объектом, то вам, конечно, сначала нужно скопировать объект в подготовленное пространство.
// pseudo function call
int i = func();
Здесь в стеке будет предоставлено место для возвращаемого значения func
, и именно здесь вы копируете возвращаемое значение. После этого действуйте, как показано выше.