информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяСетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / site updates
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
вот смотрю я на свой проект в 20000 строчек на С++... 03.01.04 07:38  Число просмотров: 1547
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 03.01.04 07:58  Количество правок: 2
<"чистая" ссылка> <обсуждение закрыто>
> > Да уж. В асме таких ляпсусов не бывает. Там просто
> можно
> мимо тазика2 - асм не задумывался как ЯВУ
Ошибка - это удел человека а не компилятора. И высокого тот уровня низкого или вообще машинные коды - ошибки делают люди.
> будьте добры. вполне достаточно относительно тривиальный
> алгоритм, без FPU и API. выложить исходник на С,
> промежуточный асм и результирующий .exe
Гы. Как раз современные программах больше всего нетривиальных алгоритмов. Кстати тривиальный алгоритм - разделить число на 10. Как вы его реализуете на асме? (если знаете этот фокус то хорошо, но ведь таких фокусов ОЙ как много, причем намного менее очевидных, причем на разных аппаратных платформах, даже с разными процессорами фокусы разные, имхо под интеловские процессоры лучше всего код генерит Intel CPP compiler)
>(лучше .com, дабы
> заголовки не мешали считать)
Ах так вы еще вспоминаете DOS'овские программы, и вероятно соответствующие компиляторы имеете ввиду.. Рассчитанные под 8086. А между тем современные программы это не десяток-сотня строчек считающих там чтото а десятки и сотни тысяч строк кода различных модулей на С которые между прочим очень взаимосвязаны. Вы писали когда нибудь проект больше 5000 строчек на С? И как у вас было сильное желание переписать все это на асме чтобы оно работало надежнее и быстрее? Учитывая что последовательные обращения к областям памяти лучше делать через инструкции необращаюиеся к памяти. А еще непомешало бы посчитать время выполнения каждой инструкции и собрать их стока чтоб за время их выполнения как раз прошел тик генератора тактовой частоты системной шины чтоб были минимальны задержки при очередном обращении к памяти. Что обращения по возможноти надо делать так чтобы они влезали в кэш. А если чтото не влезает то лучше бы его отнести в другое время. + еще учтите многозадачную архитектуру современных ОС когда несколько участков кода могут работать одновременно, и ежели мы пишем крупный проект который может работать на сервере то не мешало бы его оптимизировать под многопроцессорные архитектуры что тоже знаетеле не просто так и может дать выигрыш от совсем никакого до почти двухкратного. Компилятор это все знает, и считатет тайминги намного быстрее человека. Я говорю не про Borland CPP 5.01.

> нет. зато в отличие от "С-шника" тут нет попытки и сесть на
> возлюбленный орган, и успеть еще покушать при этом
> (перефразируя слегка ;)
Так вот касательно моего проекта на 20000 строчек на С++. Он работает. Вполне реально. И имхо он проще антивиря касперского хотя антивирей я не писал. А вот ежели это все переписать на асме... И положим отладить до приемлемого уровня.. Боюсь там не то что в 3 раза будет больше кода а в 10. Во первых я за это время на него попросту забью пока чтото там заработает, во вторых даже если не забью и не помру от старости очень врядли что мне удастся сделать код более эффективный чем это делает компилятор.

И возвращаясь к топику. Вам бы хотелось каждый раз перекачивать весь антивирь касперского после каждого обновления? Еслиб все процедуры обнаружения вирей были писаны на асме имхо так бы оно и было. + гораздо более высокая стоимость продукта. + очень я сомневаюсь что он был бы стабильнее. Конечно можно говорить что АСМ "не ЯВУ", но идеальных программистов не бывает, тот кто длает ошибки в С сделает их гораздо больше на АСМе. Любой компилятор в этом смысле гораздло идеальнее перегоняет большое количество кода в машинные коды нежели человек сразу это все вдруг вздумает написать.

Напоследок пару листингов кину - одной маааленькой функции экспортируемой DLL'ой того проекта и ее АСМовый листинг (скомпилено на VC6.0):
DWORD __stdcall NVGetMetaVarA(DWORD HostID, char *VarName, char *DataBuff, DWORD *BuffSize)
{
if(!TestIPCWND())return 0;
DWORD sz=*BuffSize+sizeof(NV_IPC_DATA)+sizeof(NVMETAVAR);
NV_IPC_DATA *nvipc=(NV_IPC_DATA *)HeapAlloc(hip,0,sz);
nvipc->size=sz;
strcpy(nvipc->ipcID,"NetView_IPC_structure_Killer{R}");
nvipc->msg=NMPN_METAVAR;
nvipc->wp=NVMETAVAR_GET|NVMETAVAR_USEID;
nvipc->datalen=*BuffSize+sizeof(NVMETAVAR);
strcpy(((NVMETAVAR *)nvipc->data)->varname,VarName);
((NVMETAVAR *)nvipc->data)->host.id=HostID;
((NVMETAVAR *)nvipc->data)->vallen=*BuffSize;
DWORD ret=SendMessage(nvwnd,NMPN_NVIPC,GetCurrentProcessId(),(DWORD)nvipc);
sz=((NVMETAVAR *)nvipc->data)->vallen;
if(sz>*BuffSize)sz=*BuffSize;
if(sz)CopyMemory(DataBuff,((NVMETAVAR *)nvipc->data)->val,sz);
*BuffSize=((NVMETAVAR *)nvipc->data)->vallen;
HeapFree(hip,0,nvipc);
return ret;
}

Асм:
Exported fn(): NVGetMetaVarA - Ord:000Ah
Exported fn(): _NVGetMetaVarA@16 - Ord:001Ah
:10001770 E8ABF9FFFF call 10001120
:10001775 84C0 test al, al
:10001777 7505 jne 1000177E
:10001779 33C0 xor eax, eax
:1000177B C21000 ret 0010



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001777(C)

:1000177E 53 push ebx
:1000177F 55 push ebp
:10001780 8B6C2418 mov ebp, dword ptr [esp+18]
:10001784 A1D0200010 mov eax, dword ptr [100020D0]
:10001789 56 push esi
:1000178A 57 push edi
:1000178B 8B7500 mov esi, dword ptr [ebp+00]
:1000178E 81C6F8000000 add esi, 000000F8
:10001794 56 push esi
:10001795 6A00 push 00000000
:10001797 50 push eax

* Reference To: KERNEL32.HeapAlloc, Ord:0199h
|
:10001798 FF1504100010 Call dword ptr [10001004]
:1000179E 8BD8 mov ebx, eax

* Possible StringData Ref from Code Obj ->"NetView_IPC_structure_Killer{R}"
|
:100017A0 BF78100010 mov edi, 10001078
:100017A5 83C9FF or ecx, FFFFFFFF
:100017A8 33C0 xor eax, eax
:100017AA 8933 mov dword ptr [ebx], esi
:100017AC 8D5304 lea edx, dword ptr [ebx+04]
:100017AF F2 repnz
:100017B0 AE scasb
:100017B1 F7D1 not ecx
:100017B3 2BF9 sub edi, ecx
:100017B5 53 push ebx
:100017B6 8BC1 mov eax, ecx
:100017B8 8BF7 mov esi, edi
:100017BA 8BFA mov edi, edx
:100017BC 8D93B4000000 lea edx, dword ptr [ebx+000000B4]
:100017C2 C1E902 shr ecx, 02
:100017C5 F3 repz
:100017C6 A5 movsd
:100017C7 8BC8 mov ecx, eax
:100017C9 33C0 xor eax, eax
:100017CB 83E103 and ecx, 00000003
:100017CE F3 repz
:100017CF A4 movsb
:100017D0 8B7C241C mov edi, dword ptr [esp+1C]
:100017D4 C7432402080000 mov [ebx+24], 00000802
:100017DB C7432802000000 mov [ebx+28], 00000002
:100017E2 8B4D00 mov ecx, dword ptr [ebp+00]
:100017E5 81C1C4000000 add ecx, 000000C4
:100017EB 894B30 mov dword ptr [ebx+30], ecx
:100017EE 83C9FF or ecx, FFFFFFFF
:100017F1 F2 repnz
:100017F2 AE scasb
:100017F3 F7D1 not ecx
:100017F5 2BF9 sub edi, ecx
:100017F7 8BC1 mov eax, ecx
:100017F9 8BF7 mov esi, edi
:100017FB 8BFA mov edi, edx
:100017FD C1E902 shr ecx, 02
:10001800 F3 repz
:10001801 A5 movsd
:10001802 8BC8 mov ecx, eax
:10001804 83E103 and ecx, 00000003
:10001807 F3 repz
:10001808 A4 movsb
:10001809 8B4C2418 mov ecx, dword ptr [esp+18]
:1000180D 894B34 mov dword ptr [ebx+34], ecx
:10001810 8B5500 mov edx, dword ptr [ebp+00]
:10001813 8993F4000000 mov dword ptr [ebx+000000F4], edx

* Reference To: KERNEL32.GetCurrentProcessId, Ord:00F8h
|
:10001819 FF150C100010 Call dword ptr [1000100C]
:1000181F 50 push eax
:10001820 A1D4200010 mov eax, dword ptr [100020D4]
:10001825 689A050000 push 0000059A
:1000182A 50 push eax

* Reference To: USER32.SendMessageA, Ord:0214h
|
:1000182B FF1548100010 Call dword ptr [10001048]
:10001831 8B8BF4000000 mov ecx, dword ptr [ebx+000000F4]
:10001837 89442420 mov dword ptr [esp+20], eax
:1000183B 8B4500 mov eax, dword ptr [ebp+00]
:1000183E 3BC8 cmp ecx, eax
:10001840 7602 jbe 10001844
:10001842 8BC8 mov ecx, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001840(C)

:10001844 85C9 test ecx, ecx
:10001846 7418 je 10001860
:10001848 8B7C241C mov edi, dword ptr [esp+1C]
:1000184C 8BD1 mov edx, ecx
:1000184E 8DB3F8000000 lea esi, dword ptr [ebx+000000F8]
:10001854 C1E902 shr ecx, 02
:10001857 F3 repz
:10001858 A5 movsd
:10001859 8BCA mov ecx, edx
:1000185B 83E103 and ecx, 00000003
:1000185E F3 repz
:1000185F A4 movsb

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001846(C)

:10001860 8B83F4000000 mov eax, dword ptr [ebx+000000F4]
:10001866 53 push ebx
:10001867 894500 mov dword ptr [ebp+00], eax
:1000186A 8B0DD0200010 mov ecx, dword ptr [100020D0]
:10001870 6A00 push 00000000
:10001872 51 push ecx

* Reference To: KERNEL32.HeapFree, Ord:019Fh
|
:10001873 FF1514100010 Call dword ptr [10001014]
:10001879 5F pop edi
:1000187A 5E pop esi
:1000187B 8B442418 mov eax, dword ptr [esp+18]
:1000187F 5D pop ebp
:10001880 5B pop ebx
:10001881 C21000 ret 0010

Замечу что функция простая и ничего "выкрутасного" для компилятора не делает. (Выкрутасы - это раскрутка циклов, оптимизация переменных и много чего еще)
<site updates> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach