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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2010, 14:36   #21
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ты кой-чего попутал...Ты то про Delphi говоришь...А мы про Turbo Pascal..Про Делфи то я знаю...
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.09.2010, 14:36   #22
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Borland Pascal v7 генерирует такой код при операции T := Z+Q:
Код:
 mov       ax,[00052]
 add       ax,[00054]
 mov       [00050],ax
Твоя ассемблерная вставка в связке с функцией будет работать существенно медленнее, потому что при вызове функции:
1) происходит сохранение всех регистров
Код:
push ax
push bx
push cx
push dx
push si
push di
2) происходит передача параметров в эту функцию (я не помню точно как, наверное в стеке)
Код:
mox ax,Z
push ax
mov ax,Q
push ax
3) вызывается сама функция (прыгаем на адрес, соответственно все что там предсказатель ветвления процессора думал убивается. Операция медленная)
Код:
call Plus
4) возвращаются параметры функции из стека
Код:
pop ax
mov T,ax
5) восстанавливаются все регистры
Код:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
Фух вроде все. Конечно не точно так, я приблизительно описал процесс, но таким макаром работает вызов функций и процедур.

Подводя итог:
Паскалевская конструкция T := Q+Z; является оптимальной по скорости. Вызов внешней функции - дело не благородное и долгое. Такую примитивную операцию как сложение заменять ассемблерной вставкой не имеет никакого смысла.

Я кончил.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 12.09.2010, 14:37   #23
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ну ладно...Спасибо..
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.09.2010, 14:42   #24
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Tronix, молодца!!! Все это же самое я высказал в своем посте (№7) одним предложением...
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 12.09.2010, 14:45   #25
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Grag Посмотреть сообщение
Tronix, молодца!!! Все это же самое я высказал в своем посте (№7) одним предложением...
Я видел ваш пост, просто расписал поподробнее. А то дискуссия слишком затянулась
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 12.09.2010, 15:01   #26
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

конечно, не так всё ужасно в случае использования ассемблерных вставок, но я согласен с предыдущими высказываниями — это далеко не всегда даёт выигрыш!

В подтверждение всего вышесказанного просто покажу ассемблерный код, который генерит TurboPascal в этих двух случаях:
Код:
╔═[■]═CPU 80486═══════════════════════════════════════════════
║PROGRAM.ADD: Begin
║  cs:000055             push   bp
║  cs:0001 89E5           mov    bp,sp
║  cs:0003 83EC04         sub    sp,0004
║PROGRAM.8:  mov ax,0
║  cs:0006 B80000         mov    ax,0000
║PROGRAM.9:  add ax,z
║  cs:0009 034606         add    ax,[bp+06]
║PROGRAM.10:  add ax,q
║  cs:000C 034604         add    ax,[bp+04]
║PROGRAM.11:  mov t,ax
║  cs:000F 8946FC         mov    [bp-04],ax
║PROGRAM.13:  Add:=T;
║  cs:0012 8B46FC         mov    ax,[bp-04]
║  cs:0015 8946FE         mov    [bp-02],ax
║PROGRAM.14: End;
║  cs:0018 8B46FE         mov    ax,[bp-02]
║  cs:001B 89EC           mov    sp,bp
║  cs:001D 5D             pop    bp
║  cs:001E C20400         ret    0004
Код:
г=[│]=CPU 80486===============================================
│PROGRAM.ADD: Begin
│  cs:0000>55             push   bp
│  cs:0001 89E5           mov    bp,sp
│  cs:0003 83EC04         sub    sp,0004
│PROGRAM.7:  T:=Z+Q;
│  cs:0006 8B4606         mov    ax,[bp+06]
│  cs:0009 034604         add    ax,[bp+04]
│  cs:000C 8946FC         mov    [bp-04],ax
│PROGRAM.8:  Add:=T;
│  cs:000F 8B46FC         mov    ax,[bp-04]
│  cs:0012 8946FE         mov    [bp-02],ax
│PROGRAM.9: End;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.09.2010, 16:27   #27
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

А как вы это сделали, Serge_Bliznykov?
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.09.2010, 16:35   #28
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

откомпилировал TPC.exe с опцией -V
(это означает -V = Debug information in EXE )
потом открыл в TurboDebugger.
ну, потом в TD переключил на отображение ассемблерного кода (он "увидел" отладочную информацию и, по умолчанию, начал показывать чистый код на Pascal, пришлось принудительно включить отображение - главное меню - View - CPU)
и всё...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.09.2010, 16:57   #29
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Нифига не понял...Как эту опцию включить?
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.09.2010, 17:25   #30
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

какую опцию?!
Идём в командную строку и пишем:
Код:
C:\TP\BIN\tpc.exe -V C:\TP\PAS\hTest.pas
Разумеется, пути должны быть ВАШИ!

получаем файлик C:\TP\PAS\hTest.EXE

Запускаем TurboDebugger (конкретно запускаем TD.EXE) и загружаем туда наш файлик C:\TP\PAS\hTest.EXE

Какой из пунктов Вам не совсем ясен?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой код клавиши?? RAVAL)) Общие вопросы Delphi 10 28.10.2015 12:24
Узнать, на какой странице выполняется код Winlook PHP 1 27.03.2010 04:44
какой будет код вычисления для D Витас Помощь студентам 1 22.03.2010 15:37
Имеется ли у вас какой ассемблерный код? rusell Помощь студентам 5 04.11.2009 16:11
Модернизировать код, сделать его быстрее Rusl92 Общие вопросы Delphi 5 03.11.2008 19:23