Форум: "Основная";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
ВнизВозвращение к вопросу для знающих 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c