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 шт):
Не все параметры процедур находятся в регистрах. Посмотрите описание соглашений о вызове для x86 (в Delphi используется по умолчанию register) и для 64 (тут практически одно соглашение)
register: параметры передаются слева направо в регистрах eax, edx, ecx, а если параметров больше трёх — в стеке, также слева направо. Исходное значение указателя на вершину стека (значение регистра esp) возвращает вызываемая подпрограмма.
X64: первые четыре параметра идут в целочисленные регистры, либо в xmm, в зависимости от типа, остальные в стек. RCX/XMM0, RDX/XMM1, R8/XMM2, R9/XMM3 Чистит стек вызывающая сторона
При это для методов (а у вас методы класса) первый параметр занят под self
По вопросу - он слишком абстрактный. Внутри одной асм вставки можно сохранить регистр в стек push ecx и потом восстановить его pop ecx, при этом следить за состоянием стека. Часть параметров, как уже выше сказано, и так находятся в стеке
Если у вас между ассемблерными вставками код на Дельфи, то за стеком не уследите. Собственно, локальные переменные внутри процедуры здесь для хранения отлично подойдут - у вас же нельзя только глобальные переменные класса использовать.