| 
			| 
					
						| Mayor 
								Специалист    Offline | 
								|  | «  : 19-05-2004 01:55 »  |  | 
 
 мне нужна С функция меняющая местами N байт памяти , желательно оптимизированая для работы с адресами кратными 4 байтам. Как она называется ?
 
 Если ее нет , то отслеживает ли MSVC 6 изменения в регистрах внутри директивы _asm или лучше их на всякий случай push \ pop ?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 1n c0de we trust |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #1 :  19-05-2004 08:49 »   |  | 
 
 Вроде нет такой.... прийдется самому писать юзая memcpy. |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Pu 
								Большой босс    Offline 
								78
								
								
								
								
								
							 | 
								|  | « Ответ #2 : 19-05-2004 10:32 »  |  | 
 
 а в чем проблема ? 1 забил памяти под промежуточный буфер malloc() 2 memmove в промежуточный буфер 3 memmove из промежуточного буфер 4 free()  промежуточный буфер или я что не понял    |  
						| 
								|  |  
								|  |  Записан | 
 
 Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.(с) Артур Джонс
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #3 : 19-05-2004 11:20 »  |  | 
 
 memmove едленнее, чем memcpy а человеку нужна скорость |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Pu 
								Большой босс    Offline 
								78
								
								
								
								
								
							 | 
								|  | « Ответ #4 : 19-05-2004 11:36 »  |  | 
 
 lapulya, ну если скорость - то ессесно на асме надо, хотя я понял что разверт этой темы идет в другой ветке. Где просто С. |  
						| 
								|  |  
								|  |  Записан | 
 
 Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.(с) Артур Джонс
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #5 : 19-05-2004 12:40 »  |  | 
 
 void memflip)void * buf1, void * buf2, int len: |
 char c;
 int i;
 
 for)i=0;i<len;buf1++,buf2++,i--: |
 c=))char*:buf1:[i(;
 ))char*:buf1:[i(=))char*:buf2:[i(;
 ))char*:buf2:[i(=c;
 "
 "
Генерируемый код достаточно оптимизирован: ; ...
 .L6{
 mov dl,[esi+ecx(
 mov al,[ebx+ecx(
 mov [esi+ecx(,al
 mov [ebx+ecx(,dl
 dec ecx
 cmp ecx,edi
 jl .L6
 ; ...
 
Если нужно ускорить, то берешь (len&-4)>>2 и вместо char (dl и al) используй long (edx и eax), а оставшиеся 0..3 байта копируй вышеприведенной ф-ией. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #6 : 19-05-2004 13:44 »  |  | 
 
 тока там надо i++ и на asm будет inc ecx |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #7 : 19-05-2004 14:02 »  |  | 
 
 lapulya,     ошибся - вначале написал от len к нулю, а переправил не все. Кстати, для for(i=len-1;i>0;i--) код выйдет короче - cmp не нужен. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #8 : 19-05-2004 14:09 »  |  | 
 
 точняк! |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Mayor 
								Специалист    Offline | 
								|  | « Ответ #9 : 22-05-2004 04:25 »  |  | 
 
 Генерируемый код достаточно оптимизирован:
 
 Ну насчет оптимизации , незнаю : не поймешь быстрее ли  mov edx,[ecx] чем  mov edx,[ecx+edi] однозначно надо использовать , long вместо char . А вот насчет того , что быстрее : обмен через регистр или блок памяти я не знаю . Неизвестно как реализован кеш , в том плане , что не будет ли он тормозить при паралельных запросах на чтение запись в одну кеш-линию , не лучше ли их сделать последовательными ?  И не будет ли лучше на продвинутых процах вначале обратиться к каждой кеш-линии , чтобы в кеш во время команд обмена начальных данных  заносились последующие к чтению\записи участки памяти ? |  
						| 
								|  |  
								|  |  Записан | 
 
 1n c0de we trust |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #10 : 22-05-2004 06:30 »  |  | 
 
 Mayor,  Если оптимизировать до безобразия, то можно очень быстро уйти от поставленной задачи. И топтаться над одним куском текста месяцами. Всему нужны разумные пределы. |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #11 : 22-05-2004 13:05 »  |  | 
 
 И еще я хотел бы добавить фирма Интел выпускает новый процессор раз в два три года. И вся твоя оптимизация под свойство процессора летит. И еще, что делать с переносимостью кода. Например на процесор AMD или VIA. |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #12 : 24-05-2004 09:46 »  |  | 
 
 Mayor, вычисление эфективного адреса с использованием индекса требует дополнительного такта только для процесоров 486 и ниже. Это нормальная load-store модель - Intel и AMD заточены под это. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Mayor 
								Специалист    Offline | 
								|  | « Ответ #13 : 01-06-2004 02:35 »  |  | 
 
 Finch, я не професиональный програмист, которому говорят: "программа пишется для пользователя, а не для програмиста", сроки и завершенность в данном случае не имеет значения, и поэтому я просто развлекаюсь с этой идеей , мне интересен сам процесс поиска решения, когда оно найдено я даже могу утратить к проекту интересс.   RXL ,  что такое эфективный адресс ? |  
						| 
								|  |  
								|  |  Записан | 
 
 1n c0de we trust |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #14 : 01-06-2004 09:33 »  |  | 
 
 Mayor, effective address - термин. Это адрес внутри сегмента памяти, адресуемого через сегментные регистры (точнее, через их теневое содержимое).
 Привожу упрощенно и только для 32-ух битных адресаций x86:
 
 effective address = base + index * scale + offset
 Где, base и index - регистры общего назначения, scale=1,2,4,8, offset - целочисленное смещение.
 
 logical address = segment base address + effective address
 
 В современных ОС принята упрощенная модель flat (плоская) - сегменты с базой 0 и размером во всю память.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Mayor 
								Специалист    Offline | 
								|  | « Ответ #15 : 02-06-2004 10:42 »  |  | 
 
 Теперь понял, сегментную модель памяти я не застал, сразу с flat начинал...
 А про MME Intel плохо пишет, во всяком случае, то что я нашел: содержит нечто вроде: информация о БУП является собственностью Интел, если вы не являетесь разработчиком БИОС, драйверов управления памятью, знать ее вам не обязательно, иначе свяжитель с нами по ...
 Может конечно сейчас они ее рассекретили, но я ее пока не искал.
 
 Лучше наверное пока, макросами пользоваться, если что вспывет можно быстро поменять или от нечего делать просто поэксперементировать...
 |  
						| 
								|  |  
								|  |  Записан | 
 
 1n c0de we trust |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #16 : 02-06-2004 20:27 »  |  | 
 
 Mayor, у меня литературка датированна 1995-м годом.Сегменты появились еще на 8086, в реальном режиме. Это было просто segment_register*16+gp_register. На 286-м были уже 16-ти битные сегменты в защищенном режиме. Окончательно, сегментная модель устаканилась на 386-м.
 Ремомендую почитать.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Mayor 
								Специалист    Offline | 
								|  | « Ответ #17 : 06-06-2004 02:00 »  |  | 
 
 Сейчас это представляет скорее исторический интерес, да и я под dos программировать не умею. Я бы лучше про ММЕ iPentium почитал, вдруг это уже рассекретили. Хотя, раз рекомендуешь, то хоть название бы написал    , а то окажется что-нить раритетное типа Шрайбера... У меня где-то на компе затерялась статья так, там сразу про 5 режимов адресации расказывается, а типов процессоров наверное штук 10 упоминается, разве что про z80 не вспомнили    , но так сложно написано, что я мало что понял, если тебе интересно могу поискать А еще чуть не забыл, на wasm Касперский, целую статью написал, про оптимизацию обращения к памяти, вот это тебе наверное интереснее будет почитать |  
						| 
								|  |  
								|  |  Записан | 
 
 1n c0de we trust |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #18 : 07-06-2004 10:20 »  |  | 
 
 Доки ищи на http://www.intel.com  - все на английском. На русском где скачать не знаю, но можно купить какую-нибудь книжку - это не дефицит. Касперского читал - у него не одна подобная статья. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	|  |