Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Tokyo + Linux, качество кода


ГолландецИксЭль   (21.10.18 19:50

Всем добрый день. Пытаюсь экспериментировать с Линуксом. Не могу понять, почему выдаётся ужасный код в дизассемблере.

{$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;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо