Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.011 c
1-64159
texHelp
2003-03-06 23:48
2003.03.20
Реальное колличество цветов в палитре TBitmap


6-64250
Barmutik
2003-01-26 17:02
2003.03.20
Помогите с WebBrowser


14-64300
Delirium^.Tremens
2003-03-03 10:01
2003.03.20
Вакансии! Срочно требуются!


3-64018
digester
2003-03-01 12:56
2003.03.20
Проблема с запуском моей проги с DB paradox на другой машине


14-64309
Sir Alex
2003-03-04 11:59
2003.03.20
Сторонний RAS сервер (не майкасофт)




   Наверх