Конференция "Основная" » Tokyo + Linux, качество кода
 
  • ГолландецИксЭль (21.10.18 19:50) [0]
    Всем добрый день. Пытаюсь экспериментировать с Линуксом. Не могу понять, почему выдаётся ужасный код в дизассемблере.

    {$OPTIMIZATION ON}

    type
     TMyObject = class(TObject)
     private
       F: NativeInt;
     public
       function TestFunction: NativeInt;
     end;

    function TMyObject.TestFunction: NativeInt;
    begin
     Result := F;
    end;



    В Windows 64:
    Unit1.pas.78: Result := F;
    0000000000427920 488B4108         mov rax,[rcx+$08]
    Unit1.pas.79: end;
    0000000000427924 C3               ret



    В Линукс:
    Unit1.pas.68: function TestFunction: NativeInt;
    000000000046FF60 55               push   rbp
    000000000046FF61 4889E5           mov    rbp,rsp
    000000000046FF64 48897DF8         mov    QWORD PTR [rbp-0x8],rdi
    Unit1.pas.76: Result := F;
    000000000046FF68 488B7DF8         mov    rdi,QWORD PTR [rbp-0x8]
    000000000046FF6C 488B7F10         mov    rdi,QWORD PTR [rdi+0x10]
    000000000046FF70 48897DF0         mov    QWORD PTR [rbp-0x10],rdi
    Unit1.pas.77: end;
    000000000046FF74 488B45F0         mov    rax,QWORD PTR [rbp-0x10]
    000000000046FF78 5D               pop    rbp



    Что тут можно сделать?
  • Rouse_ © (23.10.18 10:04) [1]
    Оптимизация не сработала. должно быть так:

    Unit8.pas.38: begin
    00000000009AE330 55               push rbp
    00000000009AE331 488BEC           mov rbp,rsp
    Unit8.pas.39: Result := F;
    00000000009AE334 488B4108         mov rax,[rcx+$08]
    Unit8.pas.40: end;
    00000000009AE338 488BE5           mov rsp,rbp
    00000000009AE33B 5D               pop rbp
    00000000009AE33C C3               ret

  • dmk © (23.10.18 11:42) [2]
    Если все параметры передаются через регистры, то в начале
    asm-процедуры можно поставить директиву .NOFRAME.
    Стек может не понадобиться. Операции с rbp и rsp вообще исчезнут из кода.
  • dmk © (23.10.18 11:43) [3]
    Типа так:
    procedure A(const A,B,C: QWord);
    asm
     .NOFRAME
     ...
     ...
     ...
    end;
 
Конференция "Основная" » Tokyo + Linux, качество кода
Есть новые Нет новых   [118477   +39][b:0][p:0.002]