Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2018, 12:30   #1
D-monua
 
Регистрация: 19.11.2017
Сообщений: 8
Восклицание Ошибка в ASM-методе Delphi

При вызове в Delphi метода по ссылке:
Код:
procedure TForm3.Button1Click(Sender: TObject);
var
  PAddr: pointer;
  vParams: TArray<TValue>;
  s: string;
begin
  if Handle > 0 then begin
    PAddr := GetProcAddress(Handle, 'Echo1');
    if PAddr = nil then
      raise Exception.CreateFmt('Procedure "%s" not found in "%s"', ['Echo1', 'InvokeDLL.dll']);

    SetLength(vParams, 0);
    s := System.Rtti.Invoke(PAddr, vParams, ccStdCall, TypeInfo(string)).AsString;
    ShowMessage(s);

    PAddr := GetProcAddress(Handle, 'Echo');
    if PAddr = nil then
      raise Exception.CreateFmt('Procedure "%s" not found in "%s"', ['Echo', 'InvokeDLL.dll']);

    SetLength(vParams, 2);
    vParams[0] := 'Test';
    vParams[1] := '13';
    s := System.Rtti.Invoke(PAddr, vParams, ccStdCall, TypeInfo(string)).AsString;
    ShowMessage(s);
  end;
end;
Echo1 - вызов проходит нормально(если вызывать без параметров).
Echo - возвращает ошибку.

Вызов в Delphi далается на АСМе, и при вызове самого метода(выделено) валится:
Код:
procedure RawInvoke(CodeAddress: Pointer; ParamBlock: PParamBlock);
{$IFDEF ASSEMBLER}
  procedure InvokeError;
  begin
    raise EInvocationError.CreateRes(@SParameterCountExceeded);
  end;
asm
      .PARAMS 62 // There's actually room for 64, assembler is saving locals for CodeAddress & ParamBlock
      MOV     [RBP+$210], CodeAddress                                                 
      MOV     [RBP+$218], ParamBlock
      MOV     EAX, [ParamBlock].TParamBlock.StackDataSize
      TEST    EAX, EAX                                          
      JZ      @@skip_push
      CMP     EAX, 480 // (64-4) params * 8 bytes.
      JBE     @@valid_frame

      Call InvokeError
@@valid_frame:
      // All items on stack should be 16 byte aligned. Caller should
      // have handled that, just copy data here.
      MOV     RCX, [ParamBlock].TParamBlock.StackData
      LEA     RDX, [RBP+$20]
      MOVSX   R8,  EAX                                      
      CALL    Move     // RCX: source, RDX: dest, R8, count
      MOV     RDX, [RBP+$218]

@@skip_push:
      MOV     RCX, [RDX].TParamBlock.RegRCX
      MOV     R8,  [RDX].TParamBlock.RegR8
      MOV     R9,  [RDX].TParamBlock.RegR9

      MOVSD   XMM0,[RDX].TParamBlock.RegRCX
      MOVSD   XMM1,[RDX].TParamBlock.RegRDX
      MOVSD   XMM2,[RDX].TParamBlock.RegR8
      MOVSD   XMM3,[RDX].TParamBlock.RegR9

      MOV     RDX, [RDX].TParamBlock.RegRDX

      CALL    [RBP+$210]

      MOV     RDX, [RBP+$218]
      MOV     [RDX].TParamBlock.OutRAX, RAX
      MOVSD   [RDX].TParamBlock.OutXMM0, XMM0

end;
{$ELSE  ASSEMBLER}
begin
                                                                              
end;
{$ENDIF ASSEMBLER}
Помогите разобраться в чем причина. Сам в АСМе полный "0".
Заранее благодарен.
D-monua вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в методе производного класса RAFA91 Общие вопросы C/C++ 3 22.07.2015 08:23
Ошибка в методе рисующем дерево alik98 C# (си шарп) 1 05.01.2013 19:37
Ошибка в методе половинного деления naty7773 Помощь студентам 1 03.12.2012 21:38
Где-то в методе касательных ошибка. Нужно найти president_ml Паскаль, Turbo Pascal, PascalABC.NET 0 08.12.2010 21:55