Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.20;
Скачать: CL | DM;

Вниз

Возвращение к вопросу для знающих ASM в среде Delphi...   Найти похожие ветки 

 
.::D.e.M.o.N.i.X::. ©   (2003-03-07 10:00) [0]

Спасибо за ответ на предыдущий пост, помогло. Вот код функции на ASM для получения номера HDD:

function gethddnumber:longint;
asm
PUSH EBX
PUSH ESI
ADD ESP,-8
mov eax,$4
Call SysGetMem
mov ebx,eax
PUSH $00
PUSH $00
LEA EAX,DWORD PTR [ESP+12]
PUSH EAX
PUSH EAX
PUSH EBX
PUSH $00
PUSH $00
PUSH $00
CALL GetVolumeInformation
MOV ESI,DWORD PTR [EBX]
MOV EAX,EBX
CALL SysFreeMem
MOV EAX,ESI
POP ECX
POP EDX
POP ESI
POP EBX
end;

Я эту функцию написал сначала на языке паскаля, потом дизасмил её, кое-что подправил, может еще что-нибудь можно подправить?


 
Игорь Шевченко ©   (2003-03-07 10:55) [1]


> Я эту функцию написал сначала на языке паскаля, потом дизасмил
> её, кое-что подправил, может еще что-нибудь можно подправить?


А смысл в подобного рода действиях какой ? Увеличение количества возможных ошибок на душу населения ?


 
Anatoly Podgoretsky ©   (2003-03-07 11:02) [2]

Из любви к поэзии


 
.::D.e.M.o.N.i.X::. ©   (2003-03-07 11:21) [3]


> А смысл в подобного рода действиях какой ? Увеличение количества
> возможных ошибок на душу населения ?

Правильно сказал Anatoly Podgoretsky :
> Из любви к поэзии

Вообще я как то читал статью об оптимизации кода, так там был приведен код процедуры и выполнение его с помощью разных компиляторов. Так вот, Delphi, VC++ - вообще отдыхают(30 сек - и они тупо переводят на машинный код без оптимизации) Intel C++ - рулит в данном отношении(0,56 сек - нихера себе оптимизация!!!). Вот и хочется оптимизировать код на asm, а Delphi тупо переведет на машинный код уже оптимизированый код...


 
Игорь Шевченко ©   (2003-03-07 11:31) [4]

.::D.e.M.o.N.i.X::. © (07.03.03 11:21)

Оптимизации обычно подвергаются циклы и прочие часто выполняемые места программы :-))))


 
Anatoly Podgoretsky ©   (2003-03-07 11:34) [5]

Здесь нет никаког выигрыша, весь тормоз состоит в GetMem и в GetVolumeInformation, а тут ты не можешь оптимизировать.
А про Intel C++ можно сказать следующее, он оптимизирует под платформу, поэтому программы получаются привязанные к ней, компиляторы общего назначения делают более широкую нишу. Например программы на Дельфи ты сможешь запускать на компьютерах от 486 и выше. Кроме того основная оптимизация на современных процессорах получается не за счет перевода на АСМ а за счет в основном выравнивания на границу и использования простых команд вместо сложных. Тут получается парадокс добавляешь несколько пустых команд и процедура начинает работать быстрее, хотя тактов требует как бы больше.
Во всяком случае оптимизировать нужно энергоемкие вещи, а оптимизировать то что ты пытаешься просто нет смысла, зато ошибок можешь огрести по самые помидоры.
Но если ты действительно заморочился этим, то скачай у Интела документации по оптимизации и подпишись на группу новостей BASM в forums.borland.com


 
.::D.e.M.o.N.i.X::. ©   (2003-03-07 11:42) [6]

Спасибо конечно за ответы, но это моя первая попытка(вру:)) занятия таким родом. До этого я лишь занимался переводом Trial компонент(в которых один .dcu - файл) на язык ASM. Выгода от этого - чисто спортивный интерес(ну если не учесть то, что можно компилировать в других версиях Delphi, и почему-то:) исчезал Trial)


 
theodor_iv   (2003-03-07 12:19) [7]


> Я эту функцию написал сначала на языке паскаля, потом дизасмил
> её


Тем самым ты уже получил неоптимальный код. Скажи, есть смысл вызывать GetMem для выделения ЧЕТЫРЕХ БАЙТ памяти, а потом вызывать FreeMem для освобождения ее, когда это же можно сделать простым объявлением локальной переменной типа Cardinal?

Если хочешь написать что-либо на встроенном асме -- алгоритм должен быть ассемблерный, а не паскалевский.

Ну и конечно правы Игорь Шевченко и Anatoly Podgoretsky:


> Оптимизации обычно подвергаются циклы и прочие часто выполняемые
> места программы



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



 
icWasya ©   (2003-03-07 12:20) [8]

а по поводу приведённого кода
mov eax,$4
Call SysGetMem


это что - заказ массива в 4 байта ???


 
Anatoly Podgoretsky ©   (2003-03-07 14:14) [9]

Да это заказ 4 байт, экономии совсем нет, более того есть проигрыщ, память выделять не требуется, достаточно было объявить переменную типа Integer/Cardinal на стеке и передать ее адрес в функцию. То есть с точки зрения обучению написания эффективных програм это не благприятствует.



Страницы: 1 вся ветка

Текущий архив: 2003.03.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
1-64198
Zirus
2003-03-08 13:11
2003.03.20
Как можно активизировать свёрнутую форму?


3-63941
ki11er
2003-03-03 16:44
2003.03.20
Одновременные запросы (BDE)...


1-64156
QUE
2003-03-07 14:26
2003.03.20
Как работать с файлом справки включенным в проект ?


4-64434
V.exeR
2003-01-27 11:33
2003.03.20
Полное имя файла (не бейте ногами)


14-64303
BALU1111
2003-03-03 15:55
2003.03.20
Начальник присвоил компьютер.