Delphi ассемблер Как использую asm сохранять регистры переданных параметров в процедуру и получать Result

Как использую asm сохранять регистры переданных параметров в процедуру и получать Result задача запустить Run с параметрами в ней запустить Hook который вызовет RunExp и обратно вернуть результат нельзя использовать глобальные переменные класса

напишу псевдо как пример

 type
   TTestClass = class
     private
         function RunExp(s1,s2,s3,s4,s5:integer):integer;
         procedure Hook;
     public
       function Run(s1,s2,s3,s4,s5:integer):integer;
   end;

implementation

function TTestClass.Run(s1,s2,s3,s4,s5:integer):integer;
begin
    Hook;
end;
procedure TTestClass.Hook;
begin
    Result:=RunExp(s1,s2,s3,s4,s5:integer);
end;

теперь с asm

 type
   TTestClass = class
     private
         function RunExp(s1,s2,s3,s4,s5:integer):integer;
         procedure Hook;
     public
        //запуск главной
       function Run(s1,s2,s3,s4,s5:integer):integer;
   end;

implementation

function TTestClass.Run(s1,s2,s3,s4,s5:integer):integer;
begin

    //допустим  переменные равны
   s1:=12;
   s2 := 44;
   s3 := 23;
   s4 := 88;
   s5 := 100000;
   asm
     // нужно сохранить регистр параметров что бы потом передать его в  Hook

   end;
   {тут выполняется какой то другой код }

   asm
     // вставить сохраненый регистр и вызвать  Hook
     call Hook

   end;
   Result:= ...; //то что вернул  RunExp
end;
procedure TTestClass.Hook;
begin
   asm
     // нужно сохранить регистр что бы потом передать его в  RunExp

   end;

   {тут выполняется какой то другой код }


   asm
     // вставить сохраненый регистр и вызвать  RunExp
     call RunExp
    // сохранить Result от  RunExp в регистр
   end;

end;
function RunExp(s1,s2,s3,s4,s5:integer):integer;
begin
{  RunExp должен получить такие же переменные какие были переданны в   TTestClass.Run
 s1:=12;
 s2 := 44;
 s3 := 23;
 s4 := 88;
 s5 := 100000;

}
 Result:=  s1+s2+s3+s4+s5;
end;

Ответы (1 шт):

Автор решения: MBo

Не все параметры процедур находятся в регистрах. Посмотрите описание соглашений о вызове для x86 (в Delphi используется по умолчанию register) и для 64 (тут практически одно соглашение)

register: параметры передаются слева направо в регистрах eax, edx, ecx, а если параметров больше трёх — в стеке, также слева направо. Исходное значение указателя на вершину стека (значение регистра esp) возвращает вызываемая подпрограмма.

X64: первые четыре параметра идут в целочисленные регистры, либо в xmm, в зависимости от типа, остальные в стек. RCX/XMM0, RDX/XMM1, R8/XMM2, R9/XMM3 Чистит стек вызывающая сторона

При это для методов (а у вас методы класса) первый параметр занят под self

По вопросу - он слишком абстрактный. Внутри одной асм вставки можно сохранить регистр в стек push ecx и потом восстановить его pop ecx, при этом следить за состоянием стека. Часть параметров, как уже выше сказано, и так находятся в стеке

Если у вас между ассемблерными вставками код на Дельфи, то за стеком не уследите. Собственно, локальные переменные внутри процедуры здесь для хранения отлично подойдут - у вас же нельзя только глобальные переменные класса использовать.

→ Ссылка