Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-64316
LazorenkoX
2003-03-03 11:32
2003.03.20
Windows 2000 Professional - Сервер удалённого доступа.


6-64269
Delphi 5.01
2002-12-06 16:35
2003.03.20
Irc na Delphi


3-63986
Zergling
2003-02-28 06:45
2003.03.20
Транзакции


3-64024
Olivka
2003-02-27 17:40
2003.03.20
Подкиньте идею


1-64193
ден555
2003-03-08 14:34
2003.03.20
Как открыть файл?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский