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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2016, 18:27   #11
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Человек_Борща, вот написал я сейчас
Код:
procedure SleepSec(N: Integer);
begin
  N := N * 1000;
  asm
    mov eax,N
    push eax
    call Sleep
  end
end;
И всё прекрасно работает в Berlin'е, компилится без проблем вставка на асме. Если только не писать inline.
___________________________________ ______________________

А вот почему нельзя сделать inline с асмом я всё равно не понимаю.
Ну вот пишу я, например:
Код:
function ReadTimeStampCounter: Int64;
asm
  rdtsc
end;

var X: Int64;
begin
  X := ReadTimeStampCounter
end.
Получаю:
Код:
call ReadTimeStampCounter
mov [X],edx
mov [X+4],edx
. . .
ReadTimeStampCounter:
rdtsc
ret
Если бы был inline, то было бы:
Код:
rdtsc
mov [X],edx
mov [X+4],edx
Проще? Да. Но в чём проблема-то?

Хорошо, давайте усложним процедуру, добавим параметры:
Код:
function Sum(var X: Integer; A, B, C: Integer): Integer;
asm
  add A,B
  add A,C
  xchg [X],A
  xchg eax,A
end;

var X: Integer;
begin
  Sum(X, 1, 2, 3)
end.
Получаем:
Код:
push 3
mov eax,АдресПеременной
mov ecx,2
mov edx,1
call Sum
. . .
Sum:
push ebp
mov ebp,esp
add edx,ecx
add edx,[ebp+8]
xchg [eax],edx
xchg eax,edx
pop ebp
ret 4
Что мешает мне сделать это же, но inline?
Код:
push 3  // ***
mov eax,АдресПеременной
mov ecx,2
mov edx,1
push ebp  // ***
mov ebp,esp  // ***
add edx,ecx
add edx,[ebp+8]  // ***
xchg [eax],edx
xchg eax,edx
pop ebp  // ***
add esp,4  // Ну или pop edx, как вариант (но такое будет нечасто, т.к. inline-функции редко имеют 4 параметра... если бы параметров было 3, этой строки и ещё 5 помещенных ***, не было бы)
В чём разница: напишу я это на чистом Delphi или на ассемблере? И будет асм-код в inline'е или в отдельной функии?

Если я сделаю в Sum какую-то недопустимую операцию, например, изменю ebx, esi, edi или ebp (без push-pop), то будет ли эта функция inline или вызываться через call - разницы нет, всё равно будет нарушение. А если не буду изменять, то ничего плохого не произойдёт ни в том случае, ни в другом...

И я так и не понял: этот запрет с 2005 или позже появился?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 28.09.2016 в 18:44.
7in вне форума Ответить с цитированием
Старый 28.09.2016, 19:02   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А вот почему нельзя сделать inline с асмом я всё равно не понимаю.
потому что компилятор не будет усложнять работу и анализировать ваш асм-код.
в первом примере N-скорее всего итак уже лежит в eax(fastcall).
так же многие переменные могут лежать в регистрах, вы же в асме этого не учитываете.

компиляция таких вещей станет сложнее в разы.
Цитата:
Вначале код переводится в IR-ассемблер, а позже оптимизируется.
оптимизация и инлайн на уровне кода тоже есть.

а причем тут стандарт языка С++ я вообще не понял, учитывая что это фича своего компилятора, а не итогового бинарника.
и да, можете указать где в стандарте С++ явный запрет на реализацию компиляторами такого инлайна?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 28.09.2016 в 19:05.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2016, 19:14   #13
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
потому что компилятор не будет усложнять работу и анализировать ваш асм-код.
Да пусть не анализирует и не оптимизирует - пёс с ним! Но зачем запрещать-то мне делать inline?
(Хотя Pavia говорит, что "Вначале код переводится в IR-ассемблер, а позже оптимизируется").

Цитата:
в первом примере N-скорее всего итак уже лежит в eax(fastcall).
так же многие переменные могут лежать в регистрах, вы же в асме этого не учитываете.
Да это я просто написал для примера того, что asm-вставки можно делать в процедуры (не стараясь оптимизировать), т.к. выше было сказано (по крайней мере, я так понял), что нельзя.
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 19:19   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Да пусть не анализирует и не оптимизирует - пёс с ним! Но зачем запрещать-то мне делать inline?
потому что инлайн такого кода может сломать всю процедуру в которую встроен.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2016, 20:00   #15
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
потому что инлайн такого кода может сломать всю процедуру в которую встроен.
Да но за это должен отвечать программист, а не компилятор вы так не думаете?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.09.2016, 20:14   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Да но за это должен отвечать программист, а не компилятор вы так не думаете?
потому компилятор и не позволяет.
ибо такое скомпилируется, но вот отладить где ошибка не выйдет толком.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2016, 20:19   #17
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
(Хотя Pavia говорит, что "Вначале код переводится в IR-ассемблер, а позже оптимизируется").
Дописать не успевал, электричка приехала на конечную. Сейчас доскажу.
Есть разные уровни оптимизации O1, O2, O3.
Цитата:
оптимизация и инлайн на уровне кода тоже есть.
Лично не видел, а по слухам да говорят есть как раз O3 или O4.
Речь шла про то, что до внедрения в Delphi кодогенератора LLVM не было оптимизации O3 при внедрении формально она появилась, но в самом LLVM его не было да и много чего не было. Потом LLVM сильно изменилась.
А вот странные запреты остались. На тот момент они были актуальными с точки зрения бизнеса. Дешевле было запретить и купить готовый компонент чем сделать свой с бекджеком и девшками.

Цитата:
Но зачем запрещать-то мне делать inline?
Вам не запрещают, просто на оптимизацию тратится много времени. Поэтому заказчики компиляторов требуют всё более и более крутую оптимизацию. Поэтому тут компилятор берёт инициативу в свои руки и начинает за вас решать, что быстрее.
Но оптимизаторы всё ещё глупее человека, они могут и ошибаться.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 28.09.2016 в 20:29.
Pavia вне форума Ответить с цитированием
Старый 29.09.2016, 08:36   #18
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Вам не запрещают, просто на оптимизацию тратится много времени.
Да как же не запрещают, когда при компиляции inline-процедуры с asm-вставками (или полностью на asm) выдаётся ошибка!

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
потому что инлайн такого кода может сломать всю процедуру в которую встроен.
Почему он может сломать, я не понимаю? Я привёл пару примеров. Код вставляется "как есть" из процедуры. Что там может поломаться? И "как есть" до вызова inline-процедуры и после (как будто вызов идёт через call/ret, но без этого).
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 29.09.2016, 10:35   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Почему он может сломать, я не понимаю?
вы рассматриваете банальные примеры.
рассмотрите сложнее.
как я говорил смешанный анализ отсутствует.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
inline c gcc O3 медленее чем без inline LynXzp Общие вопросы C/C++ 4 27.12.2012 20:54
Inline assembler C++ функция swap(). nartov55 Помощь студентам 7 04.04.2012 14:28
inline assembler qt lem Qt и кроссплатформенное программирование С/С++ 5 15.08.2011 12:08
gcc inline assembler - обнуление переменной gvf Помощь студентам 1 13.06.2010 19:33
inline??? пыхта4ог Общие вопросы C/C++ 2 09.11.2007 17:54