IPB

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V   1 2 3 > »   
Ответить в эту темуОткрыть новую тему
> Человек, который живет ASSEMBLERом
Plazmid
сообщение 8.8.2004, 10:20
Сообщение #1





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



есть такие?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 12:32
Сообщение #2





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



Я написал на ассемблере больше чем на C, хотя в последнее время пишу на php и наверно перегнал ассемблер. Хотя не могу утверждать, что досконально знаю x86 ассемблер, приходится иногда в справочник заглянуть и пока не могу бегло читать дизассемблированный код, чтобы с первого взгляда знать что тут и зачем и плохо знаю соответствие шестнадцатеричных кодов команд ассемблерным командам, как это было на том же ZX Spectrum... Мало практиковался с x86... Мне не нравится ориентированность x86 команд на работу с памятью и стек (компиляторы) и просто бесит то, что команда NOP имеет код 90h, а не 00h, как подсказывает здравый смысл wink.gif
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 12:38
Сообщение #3





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



Ах да, ещё у x86 бесячие команды условных переходов, иногда требуется написать:
loop: .....
.....
jxx exit
jmp loop
exit: .....
Какой тут может быть красивый код? Хотя возможно как-то можно перестроить программу... Не знаю, надо заниматься этим...
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Plazmid
сообщение 8.8.2004, 12:58
Сообщение #4





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



А сможешь ли кое-какие функции, написанные на С/С++ переписать на асме? функции очень просты, просто часто вызываются.
вообще, была ли практика вставки аsm в Сях?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Plazmid
сообщение 8.8.2004, 13:06
Сообщение #5





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



Функции эти, не используют всяких классов, в основном работа с памятью, вот пример, одной из функций.
CODE
void *RtlSecureZeroMemory(void *ptr, unsigned long cnt)

{

   volatile char *vptr = (volatile char *)ptr;

   while (cnt) {

       *vptr = 0;

       vptr++;

       cnt--;

   }

   return ptr;

}

Как не трудно понять, эта функция обнуляет память, начинает с определенного адреса (ptr) длинной в cnt байт.
Честно сказать, может быть это мои причуды? И компилятор все сделает крайне красиво?
знаю, на асм-е это обычная функция (вернее стандартный набор мнемокода), знаю, что мне можно было и почитать книжки. Но ведь опыт человека, который продолжительное время изучал asm нельзя поставить рядом с моим, который был набран за неделю из чтения доков.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 13:10
Сообщение #6





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



Типа:
asm {
mov ax, _AX
mov bx, _BX
add ax, bx
}
В общем разберёмся, могу. Я сейчас в отпуске, делать пока особо нечего...
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Plazmid
сообщение 8.8.2004, 13:20
Сообщение #7





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



[quote=ermsoft]Типа:
asm {
mov ax, _AX
mov bx, _BX
add ax, bx
}
В общем разберёмся, могу. Я сейчас в отпуске, делать пока особо нечего...[/quote]
ага, тип-того smile.gif чем быстрее это работать будет, тем приятнее.
борьба за каждый кусочек оптимизации, ну не паранойя ли это?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
исчезающий.point
сообщение 8.8.2004, 13:33
Сообщение #8





Гости





гыыЫы. а я на ассемблере наварил 2000 за 3 часа : - ). и сохранил себе комп (это я так похвастался : - ).

2 ermsoft нуу. на самом в широком смысле ассемблер x86 нисколько не отличается от других ассемблеров. тонкости в деталях. наверное, только itanium претендует на некую яркую индивидуальность.

а цикл у тебя какой-то странный написан : - /. зачем так

loop:
...
jxx exit
jmp loop
exit:

если можно так

loop:
...
jnxx loop

если какой-то компиллер генерирует код, подобный первому куску, то это не значит. что он - самый лучший : - ).

2 Plazmid
imho, лучше не переписывать часто вызываемые функции на ассемблере, а указать, что они встраиваемые. есть такой ключик __inline, который даже в си работает.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Plazmid
сообщение 8.8.2004, 14:40
Сообщение #9





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



[quote=исчезающий.point]imho, лучше не переписывать часто вызываемые функции на ассемблере, а указать, что они встраиваемые. есть такой ключик __inline, который даже в си работает.[/quote]
эта функция в циклах обрабатывается, inline не выручит особо.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 15:43
Сообщение #10





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



Типа так:
CODE
void ZeroMemoryAsm(void *pointer, unsigned long cnt)

{

__asm

{

 mov edi, pointer

 mov eax, cnt

 mov ecx, eax

 and eax, 3h

 mov ebx, eax

 shr ecx, 2

 cld

 xor eax,eax

 rep stosd

 mov ecx, ebx

 rep stosb

 mov eax, edi

}

}
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 15:49
Сообщение #11





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



Замечания:
Нельзя отлаживать встроеным отладчиком VC6, т.к. он будет ругаться на rep stos
Первая команда rep stosd при нулевом значении счётчика в ecx не выполняется, по крайней мере у меня, если у кого-то будет не так, то надо будет её обойти условным переходом.
Возвращаемое значение должно быть в eax, оригинальная функция его не использует, поэтому я написал также...
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
исчезающий.point
сообщение 8.8.2004, 16:07
Сообщение #12





Гости





[quote=Plazmid][quote=исчезающий.point]imho, лучше не переписывать часто вызываемые функции на ассемблере, а указать, что они встраиваемые. есть такой ключик __inline, который даже в си работает.[/quote]
эта функция в циклах обрабатывается, inline не выручит особо.[/quote] эЭЭ. в смысле? не выручит? во-первых, не будет накладных расходов на вызовы, не будет прыжков по коду лишних, что ОЧЕНЬ немаловажно, особенно для процов от intel. а во-вторых, такую довольно типовую функцию интеловский компилятор оптимизирует хорошо.

он не будет использовать всякие rep stosb точна : - ). да и циклы поразворачивает, плюс, возможно, воткнёт правильную работу с кэшами.

2 ermsoft читай руководство по оптимизации : - ). могу запостить, если надо.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Plazmid
сообщение 8.8.2004, 17:18
Сообщение #13





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



[quote=исчезающий.point]не будет накладных расходов на вызовы, не будет прыжков по коду лишних, что ОЧЕНЬ немаловажно, особенно для процов от intel. а во-вторых, такую довольно типовую функцию интеловский компилятор оптимизирует хорошо.[/quote]
погляжу дома более детально, возможно что-то упустил.
А сам может эту функцию попробуешь на asm переделать? насколько лучше/хуже будет, интересно.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Plazmid
сообщение 8.8.2004, 17:20
Сообщение #14





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



[quote=ermsoft]Замечания:
Нельзя отлаживать встроеным отладчиком VC6, т.к. он будет ругаться на rep stos
Первая команда rep stosd при нулевом значении счётчика в ecx не выполняется, по крайней мере у меня, если у кого-то будет не так, то надо будет её обойти условным переходом.
Возвращаемое значение должно быть в eax, оригинальная функция его не использует, поэтому я написал также...[/quote]
сэнкс, потестить дома надо будет. Прирост поглядеть. biggrin.gif
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 18:37
Сообщение #15





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



CODE
00401040  /$ 8B5424 08      MOV EDX,DWORD PTR SS:[ESP+8]

00401044  |. 8B4424 04      MOV EAX,DWORD PTR SS:[ESP+4]

00401048  |. 85D2           TEST EDX,EDX

0040104A  |. 8BC8           MOV ECX,EAX

0040104C  |. 74 07          JE SHORT plazmid.00401055

0040104E  |> C601 00        /MOV BYTE PTR DS:[ECX],0

00401051  |. 41             |INC ECX

00401052  |. 4A             |DEC EDX

00401053  |.^75 F9          JNZ SHORT plazmid.0040104E

00401055  > C3             RETN


Вот так функцию соптимизировал VC6.
Надо признать, что для длинны буфера в 17 байт этот вариант эффективнее, чем то, что я написал. Разница в скорости в 2 раза, ща попробуем другой размер буфера...
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 18:58
Сообщение #16





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



Такс, при длине буфера в 32768 байт моя функция быстрее в 21 раз (3 сек, против 1 мин и 3 сек)
Итог: при малой длине буфера выгодно использовать цикл с условным переходом, при большой rep stos...
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
исчезающий.point
сообщение 8.8.2004, 19:03
Сообщение #17





Гости





[quote=ermsoft]Такс, при длине буфера в 32768 байт моя функция быстрее в 21 раз (3 сек, против 1 мин и 3 сек)
Итог: при малой длине буфера выгодно использовать цикл с условным переходом, при большой rep stos...[/quote] а какой процессор?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
исчезающий.point
сообщение 8.8.2004, 19:14
Сообщение #18





Гости





хм. лана. попробую написать что-нибудь.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Plazmid
сообщение 8.8.2004, 19:34
Сообщение #19





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



[quote=ermsoft]Такс, при длине буфера в 32768 байт моя функция быстрее в 21 раз (3 сек, против 1 мин и 3 сек)
Итог: при малой длине буфера выгодно использовать цикл с условным переходом, при большой rep stos...[/quote]
получается, если мне нужно до 256 байт обнулять, то свою использовать, а если более скажем... эм 10 Кб, то твою?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Plazmid
сообщение 8.8.2004, 19:34
Сообщение #20





Группа: Пользователи
Регистрация: 2.1.2004
Из: Уралмаш
Пользователь №: 1 413



[quote=исчезающий.point]хм. лана. попробую написать что-нибудь.[/quote]
давай. :smart:
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 19:43
Сообщение #21





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



В общем выяснил, что при длине буфера 20 байт время выполнения обоих вариантов примерно одинаковое. Если надо больше то выгоднее мой вариант и ассемблерная вставка, если меньше, то выгоднее то, чего наоптимизировал компилятор.
Процессор пень 4 3ГГц с гипертредингом.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 19:49
Сообщение #22





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



А вот тестовая программа:
CODE
// plazmid.cpp : Defines the entry point for the console application.

//

#pragma warning( disable : C4035 )



#include "stdafx.h"

#include <stdio.h>

#include <string.h>

#include <malloc.h>



void ZeroMemoryAsm (void *pointer, unsigned long cnt);

void* RtlSecureZeroMemory(void *ptr, unsigned long cnt);



void *buf = malloc(20);

int main(int argc, char* argv[])

{

printf("Hello World!n");

for(int i=0;i<1000000000;i++)

{

 RtlSecureZeroMemory((void*)buf, 20);

}

return 0;

}



void* RtlSecureZeroMemory(void *ptr, unsigned long cnt)

{

   volatile char *vptr = (volatile char *)ptr;

   while (cnt) {

       *vptr = 0;

       vptr++;

       cnt--;

   }

   return ptr;

}



void ZeroMemoryAsm(void *pointer, unsigned long cnt)

{

__asm

{

 mov edi, pointer

 mov eax, cnt

 mov ecx, eax

 and eax, 3h

 mov ebx, eax

 shr ecx, 2

 cld

 xor eax,eax

 rep stosd

 mov ecx, ebx

 rep stosb

 mov eax, edi

}

}
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
исчезающий.point
сообщение 8.8.2004, 20:21
Сообщение #23





Гости





2 Plazmid для того, чтобы было быстро. какой целевой процессор? и какую именно память надо обнулять? ту, которая в кэше (или которая будет вскоре после обнуления использоваться), или ту, которая должна лежать в системной памяти (то есть, всякие там битмэпки и прочее)?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
ermsoft
сообщение 8.8.2004, 20:31
Сообщение #24





Группа: Пользователи
Регистрация: 3.9.2003
Пользователь №: 246



По-моему вопрос в том надо ли использовать ассемблерные вставки, ответ - если буфер 20 байт и меньше, то нет. Если буфер больше, то да.
Память плоская у винды, а что такое системная память, отделённая от кэша? И чем она быстрее/медленнее остальной оперативной?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
исчезающий.point
сообщение 8.8.2004, 20:39
Сообщение #25





Гости





[quote=ermsoft]По-моему вопрос в том надо ли использовать ассемблерные вставки, ответ - если буфер 20 байт и меньше, то нет. Если буфер больше, то да.
Память плоская у винды, а что такое системная память, отделённая от кэша? И чем она быстрее/медленнее остальной оперативной?[/quote]

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

4 страниц V   1 2 3 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 22.7.2018, 00:32
Блог КАБiNET