Форум: "Основная";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];
ВнизБыстрый цикл на асме Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.009 c