Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

Ответ
 
Опции темы
Старый 11.06.2018, 13:30   #1
D-monua
 
Регистрация: 19.11.2017
Сообщений: 8
Репутация: 10
Восклицание Ошибка в 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


15:08.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru