Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.25;
Скачать: CL | DM;

Вниз

Быстрый цикл на асме   Найти похожие ветки 

 
Chlavik ©   (2003-08-08 19:16) [0]

Как на асме сделать цикл что бы щётчик не спадал а возростал от 0 до 255 (0 и 255 включая)
у меня так я ситуация

xor ecx,ecx
// первый цикл

mov cx,$FF

@s1:
mov [eax+ecx],cl // тело цикла
dec cx
jns @s1

// после первого в cx $FFFF поэтому во втором я первым inc а потом тело...

@s2:
inc cx
//тут тело второго цикла
cmp cl,$FF
jne @s2



cl иторого цикла должен возростать, но это замедляет цикл так как использую cmp можно второй цикл сделать быстрее ?


 
AlexRush ©   (2003-08-08 19:34) [1]

в первом цыкле вместо

dec cx
jns @s1

юзай
loop @s1

тогда и cx после первого цикла нулю будет равен;

P.S. а почему не привел тело второго цикла ?


 
Chlavik ©   (2003-08-08 20:16) [2]



> юзай
> loop @s1


Ноль в теле цикла тоже нужен!


А это важно ?

вот весь код процедуры...

asm
push ecx
push eax
add eax,$4

mov byte ptr [eax+$100],$0
mov byte ptr [eax+$101],$0

xor ecx,ecx
mov cx,$FF

@s1:
mov [eax+ecx],cl
dec cx
jns @s1

// xor ecx,ecx
push ebx
push edx

xor ebx,ebx
xor edx,edx

@s2:
inc cx
mov bl,cl
and bl,$F
add edx,[eax+$102+ebx]
add edx,[eax+ecx]
and edx,$FF
mov bl,[eax+ecx]
push ebx
mov bl,[eax+edx]
mov [eax+ecx],bl
pop ebx
mov [eax+edx],bl
//bt cx,9
cmp cl,$FF
Jne @s2

pop edx
pop ebx
pop eax
pop ecx
end;


Можно ли ускорить второй цикл, в принципе можна изменить процедуру как угодно но в сторону скорости...


 
Palladin ©   (2003-08-08 21:25) [3]

в любом случае, имхо, оптимизация проводится совсем не там...


 
Chlavik ©   (2003-08-08 21:29) [4]

Ну ану если можна в другом месте (в теле цикла) то помогите...


 
Дмитрий Белькевич   (2003-08-09 03:26) [5]

Задачу обьясни - один цикл? Два? Что где должно крутится? Циклы не вложенные, как я вижу? И вообще, зачем тебе это, и зачем убыстрять второй цикл - всё равно разницы в пару тактов не заметишь.


 
DHDD   (2003-08-09 04:50) [6]

1. push и pop медленно работают, замени.
2. cmp тоже не быстро работает, можно заменить.


 
Verg ©   (2003-08-09 11:36) [7]

Подождите, loop на современных "пнях" работает чуть ли не медленнее, чем dec-cmp-jnz.


 
Chlavik ©   (2003-08-09 14:57) [8]


> Циклы не вложенные, как я вижу? И вообще, зачем тебе это,
> и зачем убыстрять второй цикл - всё равно разницы в пару
> тактов не заметишь

Скорость очень важна даже пару тактов
Циклы не вложены.

первый инициализирует масив [0..255] of byte кадому елементу значение индекса а вот второй просто делает операцию перемешивания значений елементов в этом масиве

я чють чють больше разобрался в асме и переписал его так:
asm
push ebx
push edi
mov edi,eax
add edi,$4
// xor eax,eax

mov byte ptr [edi+$100],$0
mov byte ptr [edi+$101],$0

xor ecx,ecx
mov cx,$100

@s1:
dec cx
mov [edi+ecx],cl
jnz @s1


xor ebx,ebx
xor edx,edx

@s2:
mov bl,cl
and bl,$F
add edx,[edi+$102+ebx]
add edx,[edi+ecx]
and edx,$FF
mov bl,[edi+ecx]
mov al,[edi+edx]
mov [edi+ecx],al
mov [edi+edx],bl
inc cx
cmp cx,$100
Jne @s2

pop edi
( указателя)

> Циклы не вложенные, как я вижу? И вообще, зачем тебе это,
> и зачем убыстрять второй цикл - всё равно разницы в пару
> тактов не заметишь

Скорость очень важна даже пару тактов
Циклы не вложены.

первый инициализирует масив [0..255] of byte кадому елементу значение индекса а вот второй просто делает операцию перемешивания значений елементов в этом масиве

я чють чють больше разобрался в асме и переписал его так:
asm
push ebx
push edi
mov edi,eax
add edi,$4
// xor eax,eax

mov byte ptr [edi+$100],$0
mov byte ptr [edi+$101],$0

xor ecx,ecx
mov cx,$100

@s1:
dec cx
mov [edi+ecx],cl
jnz @s1


xor ebx,ebx
xor edx,edx

@s2:
mov bl,cl
and bl,$F
add edx,[edi+$102+ebx]
add edx,[edi+ecx]
and edx,$FF
mov bl,[edi+ecx]
mov al,[edi+edx]
mov [edi+ecx],al
mov [edi+edx],bl
inc cx
cmp cx,$100
Jne @s2

pop edi
pop ebx
end;

освободив eax от параметра (указателя) что бы заюзать его в вычисления, в резудтате убрал из тела второго цикла push ebx pop ebx...


> 2. cmp тоже не быстро работает, можно заменить.

Чем можно заменить это условие перехода? Скорость очень важна (я бы аsм не юзал...)


 
SergP ©   (2003-08-09 23:20) [9]


> @s2:
> inc cx
> //тут тело второго цикла
> cmp cl,$FF
> jne @s2


Ну а если:

inc cx
@s2:
//тут тело второго цикла
inc cl
jnz @s2
dec cl // это если в сx должно после цикла быть то же что и в твоем варианте.


 
Marser ©   (2003-08-09 23:50) [10]

Я не понимаю, чьто вы выдумываете. Loop работает как три комманды? Что ж удивительного если это и есть dec, test и jnz в одном лице?


 
Anatoly Podgoretsky ©   (2003-08-09 23:56) [11]

Как две dec и jnz, но медленнее, как и большинство других аггрегатных команд.


 
Chlavik ©   (2003-08-10 00:04) [12]


> SergP ©

Thanks... ;)


 
Marser ©   (2003-08-10 00:22) [13]



> Anatoly Podgoretsky © (09.08.03 23:56)
> Как две dec и jnz, но медленнее, как и большинство других
> аггрегатных команд.

А проверка CX/ECX на ноль для установки флагов у вас, значит, в DEC происходит?


 
SergP ©   (2003-08-10 00:24) [14]


> Marser © (09.08.03 23:50)
> Я не понимаю, чьто вы выдумываете. Loop работает как три
> комманды? Что ж удивительного если это и есть dec, test
> и jnz в одном лице?


Я вообще-то на асме не пишу и не в курсе всего, но имхо если есть одна команда выполняющая дейсвия нескольких, то она должна иметь какие-то преимущества перед этими несколькими вместе взятыми (или по количеству тактов или по количеству занимаемых байт), иначе ее при разработке процессора просто не реализовывали бы.


 
Anatoly Podgoretsky ©   (2003-08-10 00:28) [15]

Marser © (10.08.03 00:22)
Да, так работает команда DEC и другие

SergP © (10.08.03 00:24)
Имела на старых 486 процессорах, процессор разрабатывался очень давно и был 16 битным, без конвейеров.


 
Marser ©   (2003-08-10 00:30) [16]


> SergP © (10.08.03 00:24)

Я асмом вообще особо не увлекаюсь, просто изучаю для общего развития. Мне тоже кажется, что loop должен быть быстрее нескольких команд, ведь это фактически подпрограмма на уровне CPU.


 
Anatoly Podgoretsky ©   (2003-08-10 00:34) [17]

Marser © (10.08.03 00:30)
Смотри выше, подробности в документации Интеда, там есть таблицы Latency/throughput
Конечно это кажется парадоксальным, но не менее парадоксально выполнение операции за 0.5 такта


 
Anatoly Podgoretsky ©   (2003-08-10 00:35) [18]

Еще дополнительно на моем сайте в проекте DDP есть две книги по ассемблеру, там это рассмотрено.


 
Marser ©   (2003-08-10 00:37) [19]


> Anatoly Podgoretsky © (10.08.03 00:28)
> Marser © (10.08.03 00:22)
> Да, так работает команда DEC и другие

Упс, пардон, зарвался... Dec ведь на флаг нуля влияет...Прошу прощения, Анатолий...
P.S. Как это - за пол-такта? 8-0


 
Anatoly Podgoretsky ©   (2003-08-10 00:44) [20]

Вот я же говорил парадокс :-)
Как точно не знаю, надо внимательно читать архитектуру, но там есть несколько конвейеров и два отдельных процессора.
А теперь еще и новая технология в Пентиуме 4 появилась - Hyper Threading - эмуляция двух процессоров, за счет двойного набора конвейеров, ускоряет на 30% тут можно уже вести речь о 4 командах за так.


 
Chlavik ©   (2003-08-10 00:55) [21]

А я думад что Hyper Threading это так расрекламированная функция, что Intel приувеличиивает...


 
Marser ©   (2003-08-10 00:59) [22]


> Anatoly Podgoretsky © (10.08.03 00:44)

Значит не парадокс, а Hi-end-изращения :-)


 
Anatoly Podgoretsky ©   (2003-08-10 01:03) [23]

Да нет, работающая технология, вот интересно насколько велик проигрыш по сранению с двумя процессорами, пока такой информации не имеею, но ранее читал, что два процессора дают ускорение примерно 30% :-), но все таки наверно два процессора быстрее. Теперь есть даже Ксеоны с HT технологией, там также можно будет получить допольнительный прирост производительности, если поставить более одного процессора + HT

ЗЫ: скачай книги по BASM они небольшие, но дадут некоторое прояснение.


 
Chlavik ©   (2003-08-10 01:05) [24]

Я уже скачал.... Но нашол только одну...


 
Anatoly Podgoretsky ©   (2003-08-10 01:07) [25]

Денис Христенсен и Гуйдо Гайбелс, внимательно посмотри


 
Marser ©   (2003-08-10 01:46) [26]


> ЗЫ: скачай книги по BASM они небольшие, но дадут некоторое
> прояснение.

Давно скачал, но пока не углублялся. Ваш перевод, кстати :-)


 
Chlavik ©   (2003-08-10 02:48) [27]

Я скачал Денис Христенсен...


 
Chlavik ©   (2003-08-10 02:50) [28]

Нашол и вторую...



Страницы: 1 вся ветка

Текущий архив: 2003.08.25;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
7-81992
rocker
2003-06-11 06:05
2003.08.25
Как обратиться к реестру от имени другой программы


1-81636
Patrick
2003-08-12 13:10
2003.08.25
D5 to D7


14-81909
VEG
2003-07-25 19:23
2003.08.25
Сегодня протестировал устойчивость XP о полной!


1-81783
B1t
2003-08-14 10:53
2003.08.25
Проблема с переменными Pchar типа


14-81884
Fredericco
2003-08-08 11:56
2003.08.25
Сегодняшняя встреча в Москве.